
很多 STM32 系列的 MCU 内置高精度定时器,比方 STM32F334、STM32G4、STM32H7 等系列。利用高精度定时器实现 PWM 输出应该说是最基本的功能了。不过,在实际应用中,常有人觉得无法实现 duty=0或 duty=100%的 PWM 输出情形。这里以 STM32F334 的 HRTIM 为例,简单介绍下利用它实现 PWM 输出的实现原理。4 a$ S- K5 Q- V STM32F334 的 HRTIM 的功能框图如下,由一个 MASTER 定时器和 A\B\C\D\E 五个定时器单元组成。其中 A\B\C\D\E 五个定时器单元各可以产生 2 路输出信号,并支持互补输出。 ![]() & J* s+ h2 ?5 I# C" l" { 先看下跟 HRTIM 有关的时钟。5 q( W7 R: O- R3 Y/ o k" s 它的时钟源可以来自 HSE 而产生的 144MHz 时钟信号,或者来自内部 HSI 而产生的 128MHz 时钟信号,我们把它记作 fHRTIM。下面以时钟源为 144MHz 时钟信号来介绍,它经过高精度定时器内部倍频机构 32倍频后形成 4.6GMHz 的时钟信号,该时钟信号再经过分频器后就可以作为计数器的计数驱动时钟,我们把它记作 fHRCK。这里的每个定时器单元都有各自的分频器。对于 STM32F334 的 HRTIM,计数模式只支持向上计数模式。3 i/ M+ ]) u/ u0 N! t" o/ Q / A3 ~6 w2 q" f! R 在利用 HRTIM 中的定时器单元实现 PWM 输出时,基于不同的分频系数对应着不同的分辨率和最低 PWM频率。如下表所示:【截图来自 STM32F334 的参考手册】# E$ L5 z- ]# k) ? ![]() 显然,不同分频比对应不同的计数时钟 fHRCK,根据计数时钟结合 16 位的计数宽度可求出最长计数时间,亦即最小的 PWM 输出频率。: D3 v/ [' f- {1 W( o 但对于高精度定时器 HRTIM,由于其自身特定机制的原因,在实现 PWM 功能时,设计比较值和计数周期值时需遵循下面两个原则:【注意是 FHRTIM 时钟单位,即未被倍频的时钟,这里就是那个 144Mhz 时钟】 1、 最小值必须不小于 3 个 fHRTIM 时钟单位; 2、 最大值不得大于 0xFFFE 个 fHRTIM 时钟单位;+ w8 _; `7 Z; c2 N5 T h 刚才上面说了,HRTIM 里面的定时器单元所用的计数时钟是 fHRTIM 先经过倍频后再经过分频器而来的,那么结合上面的两个原则,不同分频比条件下可以设定的计数周期或比较值的范围就对应到如下表格:- d' C9 H8 w u ![]() 1 w' @9 }, Z f1 O 上面表格就是定时器单元不同分频比时可以设置的计数周期值或用于比较的比较寄存器的值的范围。比方我们以上面 TABLE82 中的 CKPSC=3 时来看看。CKPSC=3,从上面 Table81 可以得知此时的计数时钟为源时钟倍频后的 8 分频,我们在设计 PWM 计数周期值或比较值时就要求在 0x00c~~0xFFFB 范围内配置。鉴于此,有人就得出没法实现 PWM 输出的 0 占空比或 100%占空比,其实这是误解。! \4 T( u& E$ s% E% I: L . i) s- t ?0 c: ~# U) f6 @ 假设此时我们所需要的 PWM 周期值刚好 0xff00.那么比较寄存器 CMP 的值就可以在 0x000c~~0xff00 任意设置并能实现有效、可靠比较,显然,CMP 值不要小于 0x000c 这个起点值【实际上 Table82 中的 Min 值* {4 I0 I; ]( x6 E3 h ; `: s5 Q1 d' k1 n0 q 都是对应着 3 个 fHRTIM 源时钟单位,只是因不同分频比而呈现不同数据而已】,这不是说 PWM 输出不能实现 0 占空比的情形吗?非也! 5 b1 ~# ~8 [( v! S$ O* C! |6 | 对于 HRTIM 的输出,通常是根据计数器的值与比较寄存器的值发生相等匹配事件时进行 SET【置 1】或RESET【清零】输出。【用过 STM32 常规定时器的人这里可能会感受到一些差异。】 5 ~7 A# U) i' g5 {2 o. { ![]() 比方如上图所示,在发生比较事件时做 RESET 输出,发生 PER 周期性事件时做 SET 输出。4 Z5 n4 g {- Z- j% I 显然,当我们不断增加 CMP 的值,占空比也会相应增大。当 CMP 的值增加到刚好等于 PER 的值时,则输出 RESET。因为此时 CMP 比较事件、PER 周期性事件在同一时间点发生,会涉及到事件竞争的仲裁问题。由于比较事件响应优先级高于周期性事件的,所以此时的输出按比较事件来定,这里输出 RESET,此时也刚好对应着 Duty=0 的情形。两个事件总是同时发生,而 PER 事件竞争不过 CMP 事件,输出只好由CMP 事件说了算。 按照这种配置,那又如何实现 Duty=100%的输出呢?4 l0 F1 A) N( E1 m! A2 E, N9 P 很简单,当我们将 CMP 的值设置成任意被 PER 还大的值时,就始终输出 SET 信号了。因为此时 CMP 永远不会等于 PER,即不会发生有效比较匹配事件,无有效比较事件则不会有 RESET 的输出,输出始终由PER 事件掌控。 2 C8 W. O( V) L ]/ R ^4 Q 不难看出,基于 HRTIM 的 PWM 输出从实现原理上跟 STM32 常规定时器的 PWM 输出有所不同。不管怎样,只要弄清了原理后不论是基于 HRTIM 还是常规 TIMER 做 PWM 输出,都可以灵活编写代码来实现。上面只是大致做了基于 HRTIM 的 PWM 输出的原理介绍,更多细节还是得细看手册,比方上面提到的定时器事件及事件响应竞争时的仲裁问题7 ]4 a2 z- J3 N6 W/ S . q- Z* f7 d: s: v& w- Q9 U( q3 c |
【2025·STM32峰会】GUI解决方案实训分享2-编译运行TouchGFX咖啡机例程(含桌面仿真)
实战经验 | Keil工程使用NEAI库的异常问题
STM32 ISP IQTune:真正零门槛的免费ISP调整软件
【经验分享】STM32 新建基于STM32F40x 固件库的MDK5 工程
意法半导体MCU双供应链策略,打消中国客户后顾之忧
【经验分享】基于STM32使用HAL库实现USB组合设备CDC+MSC
2024意法半导体工业峰会:赋能智能电源和智能工业,构筑可持续未来
ST推出灵活、面向未来的智能电表通信解决方案,助力能源转型
意法半导体 x Qu-Bit Electronix:推动新一轮的数字声音合成革命
从STM32 MPU产品看嵌入式系统中微处理器的新变化