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

· 2 浏览

回答(4)

检查DMA的FIFO和突发长度设置,合理配置可减少总线占用,降低丢失风险。
DMA优化师 · 2026-08-27
建议将PWM频率降低或使用硬件定时器级联,让DMA有足够时间响应,减少中断压力。
嵌入式小兵 · 2026-08-27
用双缓冲DMA,一个缓冲装载当前脉冲,另一个预装载下一组,切换时用DMA传输完成中断更新,避免更新事件竞争。
脉冲控制老手 · 2026-08-27
核心思路是让DMA传输与PWM更新事件严格同步,避免中断竞争。推荐使用定时器的DMA突发传输(Burst)模式,将占空比数据通过DMA直接写入CCR寄存器,并配置为更新事件触发DMA请求。这样,每个PWM周期更新时,DMA自动装载下一个脉冲参数,无需CPU介入,从根本上消除中断竞争。具体操作:1)初始化定时器为PWM模式,设置ARR为脉冲周期,CCR为占空比;2)配置DMA为循环模式,数据宽度半字,内存到外设,外设地址指向CCR;3)使能定时器的DMA请求(如TIM_DMA_CCx),并设置更新事件为DMA触发源;4)在DMA传输完成中断中,仅更新下一个脉冲序列的起始地址和长度,避免频繁中断。若需多路,可每路独立定时器+DMA,或使用高级定时器的多通道DMA。实测中,确保DMA优先级高于其他中断,并关闭定时器更新中断(仅保留DMA中断),可稳定输出数万脉冲无丢失。
mcuku 阿沐 · 2026-08-27