
1. 基本介绍
有三个基础的寄存器:
- 计数寄存器(TIMx_CNT,Counter register)
- 预分频寄存器(TIMx_PSC,Prescaler register)
- 自动重载寄存器(TIMx_ARR,Auto-reload register)
- 重复计数寄存器(TIMx_RCR,Repetition counter register),当前频率下你需要比CNT更大的计数值时,可以使用。
计数器运行在TIMx_PSC预分频后的CK_CNT,前提是TIMx_CR1 寄存器里的CEN(Counter enable)位是1。只要CEN是1,计数器就开始计数。
如果TIMx_CR1 寄存器里的ARPE(Auto-reload Enable)位是1的话,在每次更新事件(UEV,update event)发生的时候TIMx_ARR寄存器的数值就会装载到计数器内;否则的话,只装载1次。
1.1 TIMx_PSC,Prescaler register
预分频,即预分频的比率:就是将原来的(n+1)个CK_PSC信号视为1个时钟信号。所以实际上,计数器的时钟信号频率CK_CNT = fCK_PSC / (PSC[15:0] + 1)。
你可以在任意时刻修改TIMx_PSC,但是只有在UEV事件发生时,新的预分频比率才会被使用:

这里可以看出与预分频相关的有3个寄存器:
- PSC,用于写入新的分频比率
- buffer,当前预分频计数器的上限,一般来自PSC,主要看什么时刻更新。
- counter,当前预分频计数器的值
1.2 TIMx_ARR,Auto-reload register
自动重载寄存器,和它相关的主要是要不要缓存TIMx_ARR。
当TIM1_CR1寄存器里的ARPE(Auto-reload preload enable)位是0时, TIMx_ARR不会被缓冲,所以会被立即更新:
修改TIMx_ARR -> 立即修改自动重载的预加载寄存器 -> 立即更新自动重载的影子寄存器

当TIM1_CR1寄存器里的ARPE(Auto-reload preload enable)位是1时, TIMx_ARR会被缓冲,所以不会被立即更新:
修改TIMx_ARR -> 立即修改自动重载的预加载寄存器 -> 在UEV事件时更新自动重载的影子寄存器

1.3 计数模式
1.3.1 向上计数,Upcounting mode
此模式下,计数器从0加到TIMx_ARR,然后触发一个overflow事件并从0开始重新计数。
UEV事件的触发与否:
- 如果使用了TIMx_RCR,当计数器重复了(TIMx_RCR+1)遍时会触发UEV事件,否则在每次的overflow会触发UEV事件。
- 设置TIM1_EGR寄存器里的UG(Update generation)位会触发UEV事件
- 如果TIMx_CR1 寄存器里的UDIS( Update disable)位是1时,不会触发UEV事件。
- 如果TIMx_CR1 寄存器里的URS(Update request source)位是1时,虽然UEV事件会发生,但是不会触发中断:不会置位对应的UIF标志位
当UEV事件发生时,会造成:
- 更新TIMx_SR寄存器的状态标志位UIF(Update interrupt flag),前提是TIMx_CR1 寄存器里的URS(Update request source)位是0
- 重新初始化TIMx_CNT:如果DIR=1(向下计数)就从TIMx_ARR寄存器重载;否则(DIR= 0,即向上计数;或者中心对齐模式)计数器清零。
- 更新预分频buffer为TIMx_PSC,预分频计数器清零。
- 更新自动重载计数器的shadow为TIMx_ARR
13. Advanced-control timers (TIM1 and TIM8)
原文:https://www.cnblogs.com/qiyuexin/p/12720617.html