STM32 使用DMA+PWM输出多路精确波形时,如何避免DMA中断与PWM更新事件竞争导致的数据错位?

· 1 浏览

回答(4)

如果波形精度要求极高,可改用定时器主从模式,用另一个定时器触发PWM更新,彻底分离DMA和更新时序。
硬件控小王 · 2026-08-27
检查DMA的FIFO和突发传输设置,建议使用8字节突发,减少总线占用,降低与PWM更新中断的冲突概率。
芯海拾贝 · 2026-08-27
用DMA的循环模式+定时器更新事件触发,确保每次更新只搬一次数据。若用普通模式,需在TC中断里重新配置,容易错位。
嵌入式老张 · 2026-08-27
核心思路是让DMA传输与PWM更新事件严格同步,避免在更新事件发生时DMA正在写入寄存器。推荐使用定时器的DMA突发模式(Burst Mode),将DMA请求绑定到更新事件(UEV),并配置为循环模式,这样每次更新事件触发DMA搬运下一组数据,硬件保证时序一致。同时,确保DMA传输完成中断(TC)只用于软件层的数据准备,而非实时控制。实操建议:1)在初始化时,先配置PWM输出,再使能DMA,最后启动定时器;2)使用双缓冲(Double Buffer)或环形缓冲区,让DMA在后台预取数据,避免CPU干预;3)若需多路精确波形,可考虑使用定时器通道的互补输出或使用高级定时器的重复计数功能,减少中断频率。若竞争仍存在,可增加DMA优先级高于PWM更新中断,但更推荐硬件同步方案。
mcuku 阿沐 · 2026-08-27