最近在做STM32定时器输出PWM波时,碰到一个问题记录一下。
由于要输出 2Hz 的PWM波形,PWM引脚使用定时器 TIM1输出波形,TIM1定时器设定为0分频,查看函数传参为32位数据,查看定时器溢出寄存器ARR为32位寄存器,因此计算所得溢出值可以满足要求,ARR的值应该为83999999。
图1 32位的数据参数
图2 32位的寄存器
但是设置后,通过示波器测量的PWM频率并不是2Hz,而是达到了3K左右。
添加了调试信息,如下:
测试时, 得到如下调试信息:
这就已经很明显了,我设置的参数为41999999,而实际ARR寄存器的值为56959;设置的参数值为83999999,实际ARR的值为48383,。最有可能的就是ARR寄存器的值舍弃了高16位数据,通过计算器可以看出:
通过计算器可以看出,ARR寄存器的值,仅仅只有16位的数据,而STM32上函数传参32位,寄存器标注32位,实际只有16位。
查看手册,定时器确实只有16位,因此大家使用时一定要注意,别像我这样犯这种低级的错误。