STM32 使用DMA+PWM输出多路不同频率方波时,如何避免DMA中断竞争导致波形抖动?

· 1 浏览

回答(4)

建议用定时器更新事件触发DMA传输,而不是依赖中断。这样更新时刻与PWM周期同步,彻底消除相位抖动。
信号处理达人 · 2026-08-27
如果抖动严重,检查DMA优先级和NVIC配置,确保DMA中断优先级高于其他外设,但低于定时器更新中断,避免打断关键更新。
代码工匠 · 2026-08-27
用DMA的循环模式+半满/全满中断,配合双缓冲,能有效避免中断竞争。记得在中断里只翻转缓冲区指针,别做其他事。
嵌入式老张 · 2026-08-27
核心思路是让DMA中断尽量少干预主循环,采用双缓冲(DMA半传输/全传输中断)配合定时器更新事件同步。具体做法:1)将PWM比较值数组按半周期拆分,DMA配置为循环模式,在半传输和全传输中断中交替更新下一半数据,确保数据在PWM周期边界前就绪;2)中断服务函数中只做内存拷贝或标志置位,避免在中断里计算频率或调用耗时函数;3)若多路频率差异大,建议每路独立定时器+DMA,或使用定时器主从模式(如主定时器触发从定时器)同步更新,减少相位漂移;4)启用DMA的FIFO和突发模式,降低总线占用;5)实测时可用逻辑分析仪观察抖动,若仍存在,可考虑将更新提前到PWM周期起始(如使用更新事件触发DMA传输)。关键原则:中断只做‘搬运’,计算放主循环,且确保DMA传输时间远小于PWM周期。
mcuku 阿沐 · 2026-08-27