STM32 使用DMA+PWM输出多路不同频率方波时,如何避免DMA中断与PWM更新事件竞争导致波形抖动?

· 1 浏览

回答(4)

考虑用硬件定时器级联,主定时器产生更新事件触发从定时器,从定时器独立输出,彻底隔离中断竞争。
硬件控小王 · 2026-08-27
如果波形抖动源于DMA传输时间过长,可改用双缓冲(Double Buffer)模式,交替更新数据,保证实时性。
代码工匠 · 2026-08-27
建议将PWM更新中断优先级设为最低,DMA中断设为最高,并用事件标志位轮询代替中断,减少上下文切换。
嵌入式老张 · 2026-08-27
核心解决思路是让DMA传输与PWM更新事件严格同步,避免中断抢占。首先,配置PWM时使用定时器的更新事件(UEV)作为DMA请求源,并将DMA模式设为循环模式(Circular),这样每次更新事件自动触发DMA搬运数据,无需CPU干预。其次,确保DMA优先级高于或等于PWM中断优先级,并开启DMA的FIFO或突发模式(Burst)以减少传输次数。若仍需中断,建议在DMA传输完成中断中只更新缓冲区指针,不直接操作寄存器,且用临界区保护。另外,可考虑使用定时器的主从模式(如TIM1作为主,TIM2/3/4从),通过TRGO触发从定时器,实现多路同步。最后,实测时用逻辑分析仪观察波形,微调DMA的突发大小和定时器预分频,确保更新事件间隔大于DMA传输时间。
mcuku 阿沐 · 2026-08-27