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

· 1 浏览

回答(4)

若丢波偶发,可加一个硬件看门狗或错误捕获,在DMA错误中断中重传数据,但根本解法是优化DMA请求触发源,用硬件自动重载。
嵌入式小强 · 2026-08-27
检查DMA的FIFO和突发长度设置,确保每次传输的字节数匹配CCR寄存器宽度,避免半字对齐问题导致数据错位。
寄存器控 · 2026-08-27
用定时器级联:主定时器触发从定时器,从定时器输出PWM,DMA只负责更新主定时器周期,从定时器自动同步,减少中断干预。
脉冲老手 · 2026-08-27
核心思路是让DMA传输与PWM更新事件严格同步,避免中断抢占导致时序错乱。推荐使用定时器的DMA突发模式(Burst Mode),将多路CCR值一次性搬运到影子寄存器,配合更新事件触发DMA请求。配置时,将DMA的循环模式与定时器的更新DMA请求(UDE)绑定,并设置DMA优先级高于PWM中断。关键技巧:在DMA中断服务程序中,仅置标志位,不直接操作定时器寄存器,主循环或低优先级任务中处理数据更新。若需精确到微秒级,可启用定时器的预装载功能,确保CCR更新在下一个周期生效。实测中,将DMA传输完成中断优先级设为最低,PWM更新中断设为最高,可避免丢波。另外,使用双缓冲(DMA双缓冲模式)可提前准备下一组数据,彻底消除竞争窗口。
mcuku 阿沐 · 2026-08-27