040、定时器与PWM生成:STM32实战上周调试一个四轴机械臂的关节电机,PWM输出突然在500Hz附近出现周期性抖动,示波器上占空比像心电图一样上下跳。查了三天,最后发现是定时器更新中断里塞了个printf——这种低级错误说出来都丢人,但确实暴露了一个核心问题:很多人对STM32定时器生成PWM的理解,还停留在“配几个寄存器就能跑”的层面。定时器不是计数器那么简单STM32的定时器本质上是一个16位(或32位)的自动重装载计数器,但它的灵魂在于影子寄存器和多通道比较输出。很多人把TIM_ARR和TIM_CCR当成普通变量直接写,结果在高速PWM场景下出现毛刺——因为影子寄存器在更新事件发生前,写入的值不会生效。看这段代码,我早期踩过坑的写法:// 别这样写!直接操作寄存器没有考虑影子寄存器更新时机TIM2-ARR=1000;// 立即修改自动重装载值TIM2