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

· 2 浏览

回答(4)

注意检查DMA的传输宽度与定时器寄存器对齐,并开启DMA的循环模式,同时确保定时器预装载使能,否则更新事件可能丢失。
代码工匠 · 2026-08-27
如果频率变化不频繁,可预先计算多组占空比数据存入内存,DMA循环搬运,中断只处理频率切换,波形稳定性大幅提升。
硬件小飞侠 · 2026-08-27
建议使用定时器的主从模式,将DMA请求映射到更新事件,这样DMA传输与UEV硬件同步,无需中断参与,彻底避免竞争。
嵌入式老张 · 2026-08-27
核心思路是让DMA传输与PWM更新事件严格同步,避免中断抢占导致时序错乱。首先,将DMA配置为循环模式,并设置传输完成中断(TC)而非半传输中断(HT),确保在PWM更新事件(UEV)发生时DMA已准备好下一组数据。其次,利用定时器的DMA突发请求(BURST)功能,将多个比较寄存器(如CCR1-CCR4)一次性更新,减少DMA中断频率。关键点:在DMA中断服务函数中只做标志位设置,不进行任何PWM操作,实际更新由硬件在下一个UEV自动完成。若仍需软件干预,可关闭DMA中断,改用定时器更新中断(UI)来触发DMA传输,但需确保DMA优先级高于定时器中断。实测建议:将DMA优先级设为最高,定时器更新中断设为次高,并开启DMA的FIFO模式缓冲数据,可有效消除毛刺。最后,用示波器验证波形边沿抖动,微调DMA突发长度(如4次)和预装载值。
mcuku 阿沐 · 2026-08-27