STM32系列的MCU,如STM32F334、STM32G4、STM32H7等,内置了高精度定时器,实现PWM输出是其基本功能之一。在实际应用中,有些开发者可能会遇到无法实现占空比为0或100%的PWM输出的情况。下面以STM32F334的HRTIM为例,简要介绍如何利用它实现PWM输出。
STM32F334的HRTIM功能框图包括一个MASTER定时器和A、B、C、D、E五个定时器单元。每个定时器单元都可以产生两路输出信号,并支持互补输出。
在HRTIM中,不同的分频系数对应着不同的分辨率和最低频率。这可以在STM32F334的参考手册中的表格中查找到。
由于HRTIM的特殊机制,在实现PWM功能时,设计比较值和计数周期值需遵循特定原则。最小值必须不小于三个HRTIM时钟单位;最大值不得大于0xFFFE个HRTIM时钟单位。
这里要澄清一个误区。有人误以为由于上述原则,无法实现PWM输出的0占空比或100%占空比。但实际上,这是对HRTIM工作原理的误解。
以一个具体的例子来说明。假设我们需要一个PWM周期值刚好为0xff00,那么比较寄存器CMP的值可以在0x000c到0xff00之间任意设置,并能够实现有效、可靠的比较。这意味着,即使CMP值设置得很小,也不会影响PWM输出的0占空比情况。
对于HRTIM的输出,计数器的值与比较寄存器的值发生相等匹配事件时,会进行SET或RESET输出。当CMP的值增加到刚好等于PER的值时,由于比较事件的响应优先级高于周期件,输出将按照比较事件来定,此时对应着Duty=0的情形。
要实现Duty=100%的输出,我们只需将CMP的值设置成任意大于PER的值。这样,由于CMP值始终不等于PER值,不会发生有效的比较匹配事件,因此输出将始终由PER事件掌控。
了解了HRTIM实现PWM输出的原理后,我们就可以更灵活地编写代码了。更多细节还需要仔细阅读手册,比如定时器事件及事件响应竞争时的仲裁等。