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

· 1 浏览

回答(4)

检查DMA和定时器的时钟同步,必要时使用定时器的重复计数功能,减少更新频率,给DMA足够时间完成传输,避免竞争窗口。
硬件控小王 · 2026-08-27
如果必须用中断,建议在DMA传输完成中断中只置标志,主循环或低优先级中断中更新数据,并利用定时器的预装载功能,让新值在下一个周期生效。
PWM调参侠 · 2026-08-27
用定时器的DMA突发模式,一次传输多路CCR,配合更新事件触发,可彻底避免逐路传输时的竞争。记得设置DMA为循环模式,并确保内存缓冲区对齐。
嵌入式老周 · 2026-08-27
核心思路是让DMA传输与PWM更新事件严格同步,避免在更新事件发生时DMA正在改写寄存器。推荐使用定时器的DMA突发模式(Burst Mode),将占空比数据通过DMA一次性写入多个CCR寄存器,并设置更新事件作为DMA请求源。同时,配置DMA为循环模式,并利用定时器的预装载功能:在更新事件前完成数据装载,更新事件后生效。实操上,先初始化定时器(使能预装载、选择更新事件触发DMA),再配置DMA(内存到外设、循环、数据宽度与CCR匹配),最后使能DMA请求。若仍需中断,建议在DMA传输完成中断中仅更新软件标志,不直接操作寄存器,避免与硬件更新竞争。若出现错位,可检查DMA优先级(高于PWM更新中断)或使用双缓冲(内存中交替存放两组数据)。
mcuku 阿沐 · 2026-08-27