1
STM32 高精度定时器 PWM 输出话题
很多 STM32 系列的 MCU 内置高精度定时器,比 STM32F334STM32G4STM32H7 系列。利用高
精度定时器实现 PWM 输出应该说是最基本的功能了。不过,在实际应用中,常有人觉得无法实现 duty=0
duty=100% PWM 输出情形。这里以 STM32F334 HRTIM 为例,简单介绍下利用它实现 PWM 输出
的实现原理。
STM32F334 HRTIM 的功能框图如下,由 MASTER 定时器和 A\B\C\D\E 个定时器单元组成。
A\B\C\D\E 五个定时器单元各可以产生 2 路输出信号,并支持互补输出。
先看下跟 HRTIM 有关的时钟。
它的时钟源可以来自 HSE 而产生的 144MHz 钟信号,或者来自内部 HSI 而产生的 128MHz 时钟信号
我们把它记作 fHRTIM。下面以时钟源为 144MHz 时钟信号来介绍,它经过高精度定时器内部倍频机构 32
倍频后形成 4.6GMHz 的时钟信号,该时钟信号再经过分频器后就可以作为计数器的计数驱动时钟,我们把
它记作 fHRCK。这里的每个定时器单元都有各自的分频器。对于 STM32F334 HRTIM,计数模式只支持
向上计数模式。
在利用 HRTIM 的定时器单元实现 PWM 输出时,基于不同的分频系数对应着不同的分辨率和最 PWM
频率。如下表所示:【截图来自 STM32F334 的参考手册】
2
显然,不同分频比对应不同的计数时 fHRCK根据计数时钟结合 16 位的计数宽度可求出最长计数时
间,亦即最小的 PWM 输出频率。
但对于高精度定时器 HRTIM,由于其自身特定机制的原因,在实现 PWM 功能时,设计比较值和计数周期
值时需遵循下面两个原则:【注意是 FHRTIM 时钟单位,即未被倍频的时钟,这里就是那个 144Mhz 时钟】
1 最小值必须不小 3 fHRTIM 时钟单位;
2 最大值不得大于 0xFFFE fHRTIM 时钟单位;
刚才上面说了,HRTIM 里面的定时器单元所用的计数时钟是 fHRTIM 经过倍频后经过分频器而来的
那么结合上面的两个原则,不同分频比条件下可以设定的计数周期或比较值的范围就对应到如下表格:
上面表格就是定时器单元不同分频比时可以设置的计数周期值或用于比较的比较寄存器的值的范围。比方
我们以上面 TABLE82 中的 CKPSC=3 时来看看。CKPSC=3,从上面 Table81 可以得知此时的计数时钟
源时钟倍频后的 8 分频,我们在设计 PWM 计数周期值或比较值时就要求在 0x00c~~0xFFFB 范围内配置。
鉴于此,有人就得出没法实现 PWM 输出的 0 占空比或 100%占空比,其实这是误解。
假设此时我们所需要的 PWM 周期值刚好 0xff00.那么比较寄存器 CMP 值就可以在 0x000c~~0xff00 任意
设置并能实现有效、可比较,显然CMP 值不要小 0x000c 这个起点值【实际上 Table82 中的 Min