
在STM32的定时器中,预分频器(Prescaler-PSC)用来将定时器时钟源进行分频输出。 $ k4 w" [$ A0 t! ~& P f 预分频器的值由寄存器TIMx_PSC设定,是一个16位正整数值。+ {. p0 ], f7 U 8 X1 J; L7 n6 S0 D6 F ![]() l. a/ r: V- S/ j! q3 f STM32CubeMX中的TIM预分频设置 # L+ a( c. f% E+ I& v 在STM32系统中,定时器的时钟源为内部时钟时,其频率一般都比较高,以STM32F103的TIM1为例,其总线时钟最大为72MHz,体现在16位的定时器上的效果就是从0计数到65535上溢只需要0.9毫秒。如果我们需要更长时间的定时间隔,那么就需要预分频器对时钟进行分频处理,以降低定时器时钟(CK_CNT)的频率。 2 Y+ H6 m/ D' k6 G n 除此之外,也可以通过配置预分频器,来获取想要的定时器时钟频率。依然以上边的TIM1为例,如果我们想获取一个精确的1ms中断,如果不分频,72MHz的时钟对应每周期1/72us,十分不利于计算。这时候使用预分频器将其72分频后为1MHz,每周期1us,1000个计时周期即为1ms,这样既便于计算,定时也更加精确。 3 O7 O. C! T, s9 n9 K 预分频器的工作的工作原理是,定时器时钟源每tick一次,预分频器计数器值+1,直到达到预分频器的设定值,然后再tick一次后计数器归零,同时,CNT计数器值+1。6 V+ d( A+ V: z- m! w 由此可以看出,因为达到最大值后还要再tick一次才归零,所以定时器时钟频率应该为Fosc/(PSC+ 1)。其中Fosc是定时器的时钟源。比如想对时钟源进行72分频,那么预分频器的值就应该设置为71。9 J3 b% Y& }. a M$ N6 t ( Q6 }- `! M, Q5 g 预分频器值寄存器TIMx_PSC存在影子寄存器(官方翻译为缓冲功能),所以在定时器启动后更改TIMx_PSC的值并不会立即影响当前定时器的时钟频率。要等到下一个更新事件(UEV)发生时才会生效。比如下边这张图就体现了将分频系数由1修改为2(即TIMx_PSC由0更改为1)时整个定时器的时序图。5 O Q& P9 Y* L" t ![]() 7 @/ {! F. |" Q5 P/ ]% b' [/ Q1 z 预分频器值更改时的定时器时序图 r g, e9 h7 H" k) `$ x1 K- C, j 更新事件(UEV)则由TIMx_CR1寄存器中的UDIS位控制,在启用时,会通过以下两种方式触发: ?计数器上溢 ?手动将 TIMx_" ^, P6 p# ^ V' _) G+ e3 ~: f ———————————————— 版权声明:华维编程猿6 A8 {! Z7 a( Z 如有侵权请联系删除. v$ {6 K9 W2 ^8 f9 i1 z # o8 u! u: j' P+ P, F2 r+ e4 r6 O. F |
基于定时器捕获测量脉宽的应用示例
狂欢三】STM32C031使用TIM定时器DMA方式实现WS2812彩灯输出(三)
【狂欢三】STM32C031使用TIM定时器DMA方式实现PWM输出(二)
【狂欢三】STM32C031使用TIM定时器PWM输出
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
定时器剩余通道是否可以做PWM输出呢?
基于STM32双定时器+ADC+DMA实战经验分享
基于STM32的定时器触发ADC时可能遇到的情形
【NUCLEO-U545RE-Q评测】5. 基本计时器
基于STM32的定时器不按设定超时产生中断