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

· 1 浏览

回答(4)

考虑将PWM更新事件映射到DMA请求,并设置DMA的传输完成中断为NMI优先级,但保持中断服务极短,仅做指针切换,这样可确保实时性。
脉冲控制达人 · 2026-08-27
若使用HAL库,注意DMA中断回调中不要调用HAL_TIM_PWM_Start_DMA,否则会重新初始化导致错位。建议用寄存器操作或自定义回调。
STM32实战派 · 2026-08-27
可以改用双缓冲DMA(ping-pong),交替使用两个内存缓冲区,主循环预填下一个缓冲区,DMA切换时无间隙,彻底避免数据竞争。
嵌入式老张 · 2026-08-27
核心思路是让DMA传输与PWM更新事件严格同步,避免中断抢占导致的数据错位。推荐使用定时器的DMA突发传输模式(Burst Mode),配置TIMx_DMAR寄存器,将DMA请求绑定到更新事件(UEV),并设置DMA为循环模式。这样,每次PWM周期更新时,DMA自动从内存搬运下一组比较值到TIMx_CCR寄存器,无需CPU介入,从根本上消除中断竞争。若必须使用DMA中断(如完成标志),请将中断优先级设为最低,并在中断服务程序中仅置标志位,主循环或低优先级任务中处理数据更新,避免在中断里修改DMA配置。另外,确保DMA传输宽度与CCR寄存器一致(16位),并启用DMA的FIFO模式(若支持)以缓冲数据。实操建议:先用逻辑分析仪验证波形,逐步增加通道数,观察是否有周期错位。
mcuku 阿沐 · 2026-08-27