Stm32时基单元包含,预分频器 PSC(prescaler),自动重装载器ARR,计数器CNT(count)。下面是从向上计数的方向说明。
1、PSC(预分频器 Prescaler)
结构体成员名称及赋值TIM_Prescaler = N;
PSC是分频:把定时器要用的基准72MHz的高频时钟,放慢,给CNT计数器用
计数器计数频率:
f_{CNT} = 72000000/(PSC+1)
为什么加一,因为PSC在STM32中也是16位,0到65535,0就是1分频,或者说不分频,1就是2分频。
PSC决定:CNT计数器多久会加1,计数步长
举例:PSC=71
定时器计数f_{CNT}=72M/(71+1)=1{MHz} → T=1/1MHZ=1us,CNT每1微秒加1
PSC=719,f_{CNT}=72M/720=10^5{HZ},10us记一次。
PSC越大,基准频率分频越小,周期越长,CNT加得越慢。但是最大不能超过65535。
2、ARR(自动重装载寄存器 Auto-Reload Register)
结构体成员名称及赋值TIM_Period = M ;
如果CNT没设置初值,为0的话,CNT从 0 开始往上数,一直数到 ARR。
当 CNT == ARR :
1.产生 Update更新事件(可以发TRGO、进中断)。
2.CNT自动清零,回到0,重新开始下一轮计数。
ARR决定:一轮计数一共要加多少次,取值范围0~65535,不要超过。
接上例,PSC=71,CNT每1us加1:
如果 ARR=99:CNT从0→99,一共要加100次。
一轮总时间 t=(99+1)*1us=100us
定时器溢出频率f=1/t
也就是f =72M/(PSC+1)/(ARR+1)
3、CNT(计数器Count)
没有专门的结构体,库函数配置TIM_SetCounter(TIMx, uint16_t NUM);
决定是从一开始计数还是从NUM计数,值越大,到达ARR的值用时越短。
4、形象举列
一个水盆在接水龙头滴水,CNT就是水盆里的初始水量,ARR就是水盆的容量,水量超过这个刻度就会溢出,水龙头滴水的间隔就是PSC来决定,决定是1s滴一滴,还是1us滴一滴,滴得越快,水量加的越快,溢出的时间也就越快,定时的时间就越短。