STM32 使用DMA+PWM输出多路精确相位差波形时,如何避免DMA传输完成中断与PWM更新事件竞争导致的波形毛刺?

· 2 浏览

回答(4)

考虑使用定时器的重复计数功能,让DMA每N个周期更新一次,减少中断频率,同时用DMA的硬件请求自动同步,可显著降低毛刺概率。
硬件工程师阿明 · 2026-08-27
若使用HAL库,注意在定时器更新中断中调用HAL_TIM_PWM_PeriodElapsedCallback,但建议将DMA中断优先级设为最低,并用信号量同步,防止数据撕裂。
码农小飞 · 2026-08-27
可以配置DMA为双缓冲模式,交替使用两个缓冲区,避免在更新事件期间修改当前缓冲区,从根源上消除竞争。
嵌入式老周 · 2026-08-27
核心思路是让DMA传输与PWM更新事件严格同步,避免中断竞争。推荐使用定时器的更新事件(UEV)作为DMA请求源,并配置DMA为循环模式,这样每次PWM周期更新时自动从内存搬运数据,无需中断干预。关键在于:1)将DMA通道的请求映射到定时器的更新事件(而非传输完成事件),确保数据更新发生在PWM周期边界;2)在初始化时先使能DMA,再使能定时器,避免首周期数据未就绪;3)若需多路相位差,可将各通道的占空比数据打包成数组,通过DMA的突发传输(Burst)一次性更新多个寄存器,减少更新窗口。若必须使用中断,则在DMA传输完成中断中仅设置标志位,在主循环或低优先级中断中处理,并确保中断优先级低于PWM更新事件(如将定时器中断设为最高优先级),同时使用临界区保护共享数据。实操建议:用逻辑分析仪观察波形,调整DMA突发长度和FIFO阈值,确保数据在更新事件前就绪。
mcuku 阿沐 · 2026-08-27