[应用相关] STM32-标准库定时器

[复制链接]
159|0
Haizangwang 发表于 2025-12-8 21:17 | 显示全部楼层 |阅读模式

3021569369692728df.jpg

定时器是单片机上的片上外设之一

定时器TIM1是挂载在APB2总线上,而定时器TIM2~4是挂载在APB1总线上的

我们可以简单地把定时器理解为手表,在单片机内部所有与时间有关的操作及几乎都会用到定时器

定时器分三类分别是:高级定时器,通用定时器和基本定时器。

从高级定时器到通用定时器再到基本定时器功能是不断阉割的。

在STM32F1系列的单片机最多有14个定时器,其中TIM1和TIM8是高级定时器,TIM6和TIM7是基本定时器,剩下的就是同通用定时器,在STM32F103C8T6这款单片机中仅有TIM1~4这四个定时器。

定时器的结构框图

447696936968a7235e.jpg

时基单元的基本结构

6313569369685a7d07.jpg

时基单元一共是由五个部分组成,分别是时钟来源、预分频器(PSC)、计数器(CNT)、自动重装寄存器(ARR),和重复计数器(RCR)。其中重复计数器RCR是只有高级定时器才有的。

时钟来源:来源有两种,一种是时钟树,另一种是从模式控制器。

预分频器(PSC):对时钟信号进行降频,降低的频率是 /(PSC+1);PSC是分频系数。

计数器(CNT):计数器顾名思义就是用来计数的,是对进行过分频之后的脉冲信号进行计数的,从0开始每来一个脉冲,计数器就+1.

自动重装寄存器(ARR):用来设置定时周期的,就是CNT计数的最大值。例如ARR=4时,CNT 0-1、1-2、2-3、3-4、4-0,共计五个脉冲,即周期为:ARR+1

重复计数器(RCR):就是重复计数的次数,,若没有RCR,计数器每发生一次计数溢出就会产生一次更新时间。

281386936967ed4c61.jpg

这个石英手表就和时基单元的内部结构很相似,把表盘拆开可以看到里面由一颗石英晶振,它的频率是32.768k=32768Hz,这个石英晶振就相当于是时基单元里面的时钟来源。而手表里面有一部分电路用来降低频率,就相当于时基单元里面的预分频器PSC,那将PSC的值设置为32767,就是对它进行327681分频,就得到了一个1Hz的时钟信号,它的周期时间是1s,(即1s产生一次高低电平的变化,1个脉冲),在手表中的秒针每一秒会跳变一格,计数器CNT会从0开始每一秒钟增加1。自动重装寄存器(ARR)是用来设置定时周期,将ARR设置为59,那么周期就是60s,即为一分钟。

计数方式

518786936967859f0d.jpg

计数方式总共有三种分别是:上计数,下计数和中心对齐。

上计数就是上面所用到的计数方式从0开始计数到ARR,下计数就是从ARR开始计数到0,中心对齐是先上计数再下计数。

一般使用的都是上计数方式。

时钟来源

884166936966abc0ed.jpg

分辨率是指定时器能够区分的最小时间间隔,即定时器计数一次的持续时间

分辨率 = 1 / 定时器时钟频率(单位是us,ms,s等)

周期是指定时器完成一次完整计数循环所需的时间。

例如:手表的计数最小是1s钟那么手表的分辨率就是1s,而手表的秒针每转一圈是60s这就是周期。

假设时钟源的频率是72MHz,将预分频器值(PSC)设置为71,就是对是时钟源进行72分频得到1MHz的信号,其分辨率为1/1MHz=1/1 000 000 s=1us.而1ms=1000us,所以技术周期是1000us,要将ARR的值设置为999,计数周期就是1us,将RCR设置为0,那么就是1us产生一次更新事件。

73671693696639d6c5.jpg

定时器的时钟来源,单片机的启动代码完成后时钟树的配置如上,TIM1是挂载在APB2总线上的,而PCLK2的最大频率是72MHz所以TIM1的频率是72MHz,TIM2~4是挂载在APB1总线上的,PCLK1的最大时钟频率是36MHz。

STM32 的硬件设计中有一个倍频器逻辑:
如果 APB 预分频系数不为 1,则定时器时钟频率 = APB 总线频率*2。

也就是说TIM2~4的时钟频率为72MHz

即TIM1~4的时钟频率都是72MHz

寄存器的预加载

875236936965d1b9c3.jpg

预分频器(PSC)和自动重装寄存器(ARR)以及重复计数器(RCR)都有一个影子寄存器

在向寄存器写值的时候是先将值写入影子寄存器,他不会立即生效,而是当计数溢出产生Update事件时影子寄存器里的值才会进入活动寄存器生效,而这种机制我们就将其叫做寄存器的预加载。

寄存器预加载的作用

1685869369656e61ea.jpg

以ARR为例:当CNT计数到5时,突然将ARR的值改为3,那么这时CNT>ARR,这是为无论CNT再怎么增加都不会等于3,那么CNT就会一直增加下去,直到增长为一个最大的极限值65535才会发生溢出。那么周期就变成了65536,这种情况就是属于定时器跑飞了。

加入寄存器的预加载之后

41095693696523d8b9.jpg

如上图所示,加入影子寄存器后,突然更改ARR的值是被写入到了影子寄存器当中不会立即生效,会在Update更新事件发生后才生效,具体情况如上图所示。
————————————————
版权声明:本文为CSDN博主「笑361」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2402_87164260/article/details/155633040

您需要登录后才可以回帖 登录 | 注册

本版积分规则

230

主题

613

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0