STM32基本定时器
STM32基本定时器
1.时基单元
- 计数寄存器 (TIMx_CNT)
- 计数器从0累加计数到自动重装载数值(TIMx_ARR寄存器),然后重新从0开始计数并产生一个计数器溢出事件。
- 预分频寄存器 (TIMx_PSC)
- 它也有缓存,也是在更新事件产生时刷新缓存。
- 自动重装载寄存器(TIMx_ARR)
- 设置此值。计数器达到这个值,溢出。
- 可以给此值设置缓存,这个缓存被称为影子寄存器。 当TIMx_CR1的ARPE位为1时,表示有缓存;否则没有。
- 有缓存时:更新缓存的时机是 更新事件(计数器溢出或者TIMx_EGR寄存器的UG位为1)产生 时。所以缓存有时不是实时的值。
2.时序中的一些概念
-
CK_PSC : 预分频寄存器的时钟,也就是内部系统时钟,用来控制预分频寄存器的工作频率。
-
CNT_EN : 计数寄存器的使能,对应TIMx_CR1的CEN位,开启后计数器才能计数。
-
CK_CNT : 计数器的频率,也就是分频后的频率,一个频率计数寄存器加一。
-
计数器寄存器: 每个频率加一。
-
更新事件(UEV): 一个逻辑的概念,一般计数器溢出或者TIMx_EGR寄存器的UG位为1时产生。
-
当发生一次更新事件时,所有寄存器会被更新并(根据URS位)设置更新标志(TIMx_SR寄存器的
UIF位)。
-
立即产生中断的问题原因是:预分频寄存器的缓存为没分频前的数,频率越高,计数越快,很快就加到了溢出,所以置位后很短时间就产生了一次中断。只有更新事件发生时,才会更新缓存。
-
解决立即产生中断的问题时,我们可以在设置中断使能之前将UG设置为1,让缓存在中断打开前就更新,之后再将TIMx_SR的UIF位置0,告诉系统我们没有产生更新事件。另外,如果设置了TIMx_CR1寄存器中的URS(选择更新请求),设置UG位可以产生一次更新事件UEV,但不设置UIF标志(即没有中断或DMA请求)。
-
-
预分频控制寄存器:也就是预分频寄存器,保存的值为分频的数,想7200分频,就存7199。
-
预分频器缓冲器: 预分频寄存器的缓冲区,在更新事件产生时更新缓冲区的值。
-
预分频器计数器: 一个内部时钟周期加一,也就是计算定时器时钟走到当前时走了几个内部时钟。