一、守时器分类
STM32F1 系列中,除了互联型的产品,共有 8 个守时器,分为根本守时器,通用守时器和高档守时器。根本守时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的守时器,只能守时,没有外部 IO。通用守时器 TIM2/3/4/5 是一个 16 位的能够向上/下计数的守时器,能够守时,能够输出比较,能够输入捕捉,每个守时器有四个外部 IO。高档守时器 TIM1/8是一个 16 位的能够向上/下计数的守时器,能够守时,能够输出比较,能够输入捕捉,还能够有三相电机互补输出信号,每个守时器有 8 个外部 IO。
根本守时器的中心是时基,通用计时器和高档守时器也有。
1、时钟源
守时器时钟TIMxCLK,即内部时钟CK_INT,经APB1预分频器后分频供给,假如APB1 预分频系数等于 1,则频率不变,不然频率乘以 2,库函数中 APB1 预分频的系数是 2,即 PCLK1=36M,所以守时器时钟 TIMxCLK=36*2=72M 。
2、计数器时钟
守时器时钟通过 PSC 预分频器之后,即 CK_CNT,用来驱动计数器计数。PSC 是一个16 位的预分频器,能够对守时器时钟 TIMxCLK 进行 1~65536 之间的任何一个数进行分频。
详细核算方法为:CK_CNT=TIMxCLK/(PSC+1)。
3.计数器
计数器 CNT 是一个 16 位的计数器,只能往上计数,最大计数值为 65535。当计数抵达主动重装载寄存器的时分发生更新事情,并清零从头开端计数。
4、主动重装载寄存器
主动重装载寄存器 ARR 是一个 16 位的寄存器,这儿边装着计数器能计数的最大数值。当计数到这个值的时分,假如使能了中止的话,守时器就发生溢出中止。
5. 守时时刻的核算
守时器的守时时刻等于计数器的中止周期乘以中止的次数。计数器在 CK_CNT 的驱动下,计一个数的时刻则是 CK_CLK 的倒数,等于:1/(TIMxCLK/(PSC+1)),发生一次中止的时刻则等于:1/(CK_CLK * ARR)。假如在中止服务程序里边设置一个变量 time,用来记载中止的次数,那么就能够核算出咱们需求的守时时刻等于: 1/CK_CLK *(ARR+1)*time。
1.界说
设置等待时刻,抵达等待时刻之后履行指定的硬件操作。
守时器最根本的功用便是守时,比如说守时发送串口数据,守时收集AD数据,也能够发生PWM方波等,守时器发生PWM操控电机状况是工业操控的一般。
2、STM32F4xx系列的芯片:2个高档操控守时器(TIM1和TIM8)、10个通用守时器(10TIM2-TIM5,TIM9-TIM14)、2个根本守时器(TIM6和TIM7)、2个看门狗守时器
详细可参阅中文参阅手册了解其特性及原理
3、守时器计数形式:
通用守时器能够向上计数、向下计数、向上向下双向计数形式。
①向上计数形式:计数器从0计数到主动加载值(TIMx_ARR),然后从头从0开端计数而且发生一个计数器溢出事情。
②向下计数形式:计数器从主动装入的值(TIMx_ARR)开端向下计数到0,然后从主动装入的值从头开端,并发生一个计数器向下溢出事情。
③中心对齐形式(向上/向下计数):计数器从0开端计数到主动装入的值-1,发生一个计数器溢出事情,然后向下计数到1而且发生一个计数器溢出事情;然后再从0开端从头计数。
如图:
4、通用守时器作业原理:
● 计数器寄存器 (TIMx_CNT)
● 预分频器寄存器 (TIMx_PSC)
● 主动重载寄存器 (TIMx_ARR)
假如是向上增加形式,计数器(CNT)从0加到主动重载值(ARR),预分频器(PSC)减一次。
时刻核算方法:
假定频率为:42M*2 == 84M == 84000000 == 1s //42依据守时器时钟数可知 而且一般都是*2
守时器守时1s发生中止:
ARR = 84000; // 1ms
PSC = 1000; // 1000*1ms == 1s
如图:可知根本守时器的时钟是42M,那么对应*2便是84M=84000000=1S(ARR*PSC)
高档的既是84*2=96M=96000000=1S
———————————————————————————————————————————————————–
5、守时器中止完成过程
//5.1、能守时器时钟。
RCC_APB1PeriphClockCmd();
//5.2、初始化守时器,装备ARR,PSC。(声明结构体)
TIM_TimeBaseInit();
typedef struct
{
uint16_t TIM_Prescaler;
uint16_t TIM_CounterMode;
uint16_t TIM_Period;
uint16_t TIM_ClockDivision;
uint8_t TIM_RepetitionCounter;
} TIM_TimeBaseInitTypeDef;
//5.3、启守时器中止,装备NVIC(声明结构体)
NVIC_Init();
进行NVIC中止装备
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //守时器 3 中止
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //呼应优先级 3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);// ④初始化 NVIC
TIM_Cmd(TIM3,ENABLE); //⑤使能守时器 3
//5.4、设置 TIM3_DIER 答应更新中止
TIM_ITConfig();
//5.5、使能守时器。
TIM_Cmd();
//5.6、编写中止服务函数。
TIMx_IRQHandler();
//守时器 3 中止服务函数
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中止
{
/*处理的程序段*/
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //铲除中止标志位
}
TIM3_Int_Init(5000-1,8400-1); //守时器时钟84M,分频系数8400,所以84M/8400=10Khz的计数频率,计数5000次为500ms
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); ///使能TIM3时钟
TIM_TimeBaseInitStructure.TIM_Period = arr; //主动重装载值
TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //守时器分频
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数形式
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //答应守时器3更新中止
TIM_Cmd(TIM3,ENABLE); //使能守时器3
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //守时器3中止
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//守时器3中止服务函数
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中止
{
LED1=!LED1;//DS1翻转
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //铲除中止标志位
}
守时器初始化结构体详解
在规范库函数头文件stm32f10x_tim.h中对守时器外设建立了四个初始化结构体,根本守时器只用到其间一个即TIM_TimeBaseInitTypeDef,其他三个在高档守时器章节解说。
typedef struct {
uint16_t TIM_Prescaler; // 预分频器
uint16_t TIM_CounterMode; // 计数形式
uint32_t TIM_Period; // 守时器周期
uint16_t TIM_ClockDivision; // 时钟分频
uint8_t TIM_RepetitionCounter; // 重复核算器
} TIM_TimeBaseInitTypeDef;1234567
(1) TIM_Prescaler:守时器预分频器设置,时钟源经该预分频器才是守时器时钟,它设定TIMx_PSC 寄存器的值。可设置规模为 0 至 65535,完成 1至 65536 分频。
(2) TIM_CounterMode:守时器计数方法,但是在为向上计数、向下计数以及三种中心对齐形式。根本守时器只能是向上计数,即 TIMx_CNT只能从 0开端递加,而且无需初始化。
(3) TIM_Period:守时器周期,实践便是设定主动重载寄存器的值,在事情生成时更新到影子寄存器。可设置规模为 0至 65535。
(4) TIM_ClockDivision:时钟分频,设置守时器时钟 CK_INT 频率与数字滤波器采样时钟频率分频比,根本守时器没有此功用,不必设置。
(5) TIM_RepetitionCounter:重复计数器,归于高档操控寄存器专用寄存器位,使用它能够十分简单操控输出 PWM 的个数。这儿不必设置。
尽管守时器根本初始化结构体有 5 个成员,但关于根本守时器只需设置其间两个就能够。