|
在STM32的定时器中,预分频器(Prescaler-PSC)用来将定时器时钟源进行分频输出。* ~: i$ ~! D9 d7 J9 }( } w 2 |: L; i7 N; i9 w( `0 L9 r 预分频器的值由寄存器TIMx_PSC设定,是一个16位正整数值。+ M: M: f4 c9 `: N. g
STM32CubeMX中的TIM预分频设置/ k: @" F4 U8 \9 M4 Q( p; K# F& z 在STM32系统中,定时器的时钟源为内部时钟时,其频率一般都比较高,以STM32F103的TIM1为例,其总线时钟最大为72MHz,体现在16位的定时器上的效果就是从0计数到65535上溢只需要0.9毫秒。如果我们需要更长时间的定时间隔,那么就需要预分频器对时钟进行分频处理,以降低定时器时钟(CK_CNT)的频率。 $ _9 z e- @6 q2 L1 Z7 m 除此之外,也可以通过配置预分频器,来获取想要的定时器时钟频率。依然以上边的TIM1为例,如果我们想获取一个精确的1ms中断,如果不分频,72MHz的时钟对应每周期1/72us,十分不利于计算。这时候使用预分频器将其72分频后为1MHz,每周期1us,1000个计时周期即为1ms,这样既便于计算,定时也更加精确。1 R. \# f8 y/ ^3 i# W( q: J ) {1 R/ ~0 V Q# \7 i 预分频器的工作的工作原理是,定时器时钟源每tick一次,预分频器计数器值+1,直到达到预分频器的设定值,然后再tick一次后计数器归零,同时,CNT计数器值+1。 由此可以看出,因为达到最大值后还要再tick一次才归零,所以定时器时钟频率应该为Fosc/(PSC+ 1)。其中Fosc是定时器的时钟源。比如想对时钟源进行72分频,那么预分频器的值就应该设置为71。 - `2 m1 A- S$ O$ v! | 预分频器值寄存器TIMx_PSC存在影子寄存器(官方翻译为缓冲功能),所以在定时器启动后更改TIMx_PSC的值并不会立即影响当前定时器的时钟频率。要等到下一个更新事件(UEV)发生时才会生效。比如下边这张图就体现了将分频系数由1修改为2(即TIMx_PSC由0更改为1)时整个定时器的时序图。 . u+ a. X, s3 L/ `! g
预分频器值更改时的定时器时序图3 r0 V6 `( ~7 J& |7 R; n+ x# e2 q 更新事件(UEV)则由TIMx_CR1寄存器中的UDIS位控制,在启用时,会通过以下两种方式触发: ?计数器上溢: g) Z! M( a( {, \: O ?手动将 TIMx_- L3 [2 I) |* K' g; V4 Z+ D+ P, e$ e ————————————————0 E( C8 p+ M1 Q+ I 版权声明:华维编程猿& T# o0 N" I" e. @# X) L& t 如有侵权请联系删除 |
经验分享 | 利用TIMER定时和捕获功能实现编解码演示
STM32 LSE 不起振排查指南:五大核心原因与快速解决方案
我心中的ST中文论坛
经验分享 | 利用STM32 TIMER实现同频跟随输出示例
2025软件工具兔哥知道
经验分享 | 利用STM32 TIMER实现同频跟随输出示例
经验分享 | 一个基于TIMER事件的中断响应话题_续
经验分享 | 一个基于TIMER事件的中断响应话题
11张图学会STM32定时器!
经验分享 | STM32U5系列TIMER+DMA+DAC应用演示
微信公众号
手机版