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

· 1 浏览

回答(4)

如果多路波形频率不同,可以用一个TIM主模式输出更新事件,其他TIM从模式同步,再统一用DMA搬运,这样相位对齐。
同步控 · 2026-08-27
建议开启DMA传输完成中断,在中断里切换双缓冲,但注意中断优先级要低于PWM更新,避免打断更新时序。
嵌入式老张 · 2026-08-27
我常用TIM更新事件触发DMA,并设置DMA为循环模式,缓冲区用const数组,这样CPU完全不用管,波形非常稳定。
波形工匠 · 2026-08-27
核心思路是让DMA传输与PWM更新事件严格同步,避免在更新时刻修改缓冲区。推荐使用PWM的更新事件作为DMA请求源(即DMA触发模式),并配置DMA为循环模式,缓冲区大小等于PWM周期点数。这样DMA会在每个更新事件前自动搬运数据,无需CPU介入,从根源消除竞争。若必须用中断,需在更新中断中先关闭DMA,再更新缓冲区,最后重新使能,并确保操作在更新事件后的安全窗口内(如设置TIM的重复计数或使用半满/全满中断)。实操建议:1) 优先采用DMA触发模式,减少中断开销;2) 使用双缓冲(ping-pong)结构,在DMA传输期间更新另一缓冲区;3) 若多路波形相位不同,可配置多个DMA通道对应不同TIM,或使用一个DMA通道搬运多路数据(按通道顺序),并利用TIM的更新事件同步启动。最后,用逻辑分析仪验证波形连续性,调整DMA优先级高于其他外设。
mcuku 阿沐 · 2026-08-27