定时器——时基单元
f1bc44612958a81506f4eb7407999c1e

定时器需要掌握的知识较多,因此拆分为四个部分:时基单元、输出比较、输入捕获、从模式控制器

时基单元

时基单元需要了解五个部分:时钟来源、预分频器PSC、计数器CNT、自动重装寄存器ARR、重复计数器RCR

时钟来源:有两个,时钟树和从模式控制器,提供最基础的时钟方波信号
预分频器PSC:将时钟信号降频,降低倍率=PSC+1,需要手动设置PSC
计数器CNT:对PSC传过来的时钟脉冲信号进行计数,每接收一个脉冲信号,计数器就+1
自动重装寄存器ARR:给计数器设定一个阈值,当计数超过这个阈值,那么计数器将清零重新开始计数;由于计数是从0开始的,因此计数周期就是阈值+1
重复计数器RCR(高级定时器才有):当没有RCR时,计数器每次达到阈值就会产生update事件;加上RCR后,计数器需要达到(RCR+1)阈值才会产生update事件

注意:从时钟树过来的时钟信号,在到达定时器模块前,还需要经过一个分频器,分频系数与APB分频器的分频系数有关系,PCLK = 1,则TIM_CLK = 1,否则TIM_CLK = 2;

 

活动寄存器(预装载寄存器):保存用户写入的值
影子寄存器:当产生一个update事件后,会将预装载寄存器中的值复制并应用到定时器电路中
注意:上面的描述想要生效的前提是要设置预加载模式,如果没有设置,则不会产生上述效果 而影子寄存器则是在每产生一个update就会将预加载寄存器中的值复制过来并应用,这是固定的,不是因为预加载寄存器中的值被修改才去复制

时基单元中有三个部分存在活动寄存器和影子寄存器(预分频器PSC、自动重装寄存器ARR、重复计数器RCR)

 

使用步骤
1. 开启TIMx的时钟
2. 初始化时基单元,配置时基单元中的参数——预分频系数、自动重装系数、重复计数系数、计数器默认值
3. 开启定时器开关
4. 开启update中断开关
5. 设置nvic中断分组并且初始化nvic模块,配置nvic模块中的参数——中断名称、中断使能、抢占优先级、子优先级
6. 编写中断函数和中断执行程序(注意:中断函数判断标志位成功后一定要清除标志位,因为硬件会自动置一,但不会自动清零)

 

常用函数

 

TIM_TimeBaseInit(TIMx,&结构体变量名);
作用:初始化TIM参数配置
参数1:TIMx, x = 1-4
参数2:TIM_TimeBaseInitTypeDef 类型的结构体变量名

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;    // 定义结构体变量
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 类似滤波,不会影响定时器
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 计数模式,也就是方向
TIM_TimeBaseInitStruct.TIM_Period = 1000 - 1; // 周期即阈值,即计数多少次才会产生溢出
TIM_TimeBaseInitStruct.TIM_Prescaler = 72 - 1; // 预分频系数
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; // 重复计数系数

 

TIM_Cmd(TIMx,ENABLE);
作用:定时器的开关,控制定时器是否工作
参数1:TIMx, x = 1-4
参数2:ENABLE/DISABLE   使能/失能

 

TIM_ITConfig(TIMx,TIM_IT_xxx, ENABLE);
作用:设置某个标志位的开关
参数1:TIMx, x = 1-4
参数2:TIM_IT_xxx    xxx = TIM中的某一个标志位
参数3:ENABLE/DISABLE   使能/失能

posted on 2026-05-04 17:48  绝情世家  阅读(15)  评论(0)    收藏  举报