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

· 1 浏览

回答(4)

调试时用逻辑分析仪抓PWM输出和DMA传输完成信号,对比时序,若发现错位,优先检查DMA的优先级配置和中断嵌套是否合理。
码农阿杰 · 2026-08-27
如果硬件支持,用DMA的FIFO和突发模式(Burst)一次搬运多路数据,配合PWM更新事件,能显著减少DMA请求次数,降低竞争概率。
芯途行者 · 2026-08-27
可以试试用定时器的重复计数寄存器(RCR)来降低更新事件频率,让DMA每N个周期才搬运一次,减少中断频率,但波形精度会下降,适合低频场景。
嵌入式老张 · 2026-08-27
核心思路是让DMA传输与PWM周期严格同步,避免中断抢占造成的数据错位。推荐使用PWM的更新事件(Update Event)作为DMA请求源,并配置DMA为循环模式(Circular Mode),这样每个PWM周期自动从内存搬运一次数据,无需CPU干预。关键在于:1)将DMA的传输完成中断(TC)和半传输中断(HT)优先级设为低于PWM更新中断,或干脆禁用HT中断,仅用TC中断做缓冲切换;2)若必须用HT,则在HT中断中只更新写指针,不直接修改DMA配置,利用双缓冲(Memory-to-Memory模式)或环形缓冲区,通过比较读写指针判断数据是否就绪;3)在PWM更新中断中检查DMA传输状态(如DMA_GetFlagStatus),若发现DMA未及时更新,则软件触发一次重载。实操建议:使用STM32CubeMX配置DMA为循环模式,PWM更新事件触发,并开启DMA的传输完成中断,在中断中切换缓冲区,同时将PWM更新中断优先级设为最高,确保时序确定性。
mcuku 阿沐 · 2026-08-27