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

· 1 浏览

回答(4)

检查DMA的FIFO配置,开启FIFO并设置阈值,可缓冲数据,减少因总线繁忙导致的传输延迟,同时确保DMA时钟与定时器时钟同步。
硬件控阿强 · 2026-08-27
如果频率差异大,考虑分时复用:将高频率波形用硬件PWM直接输出,低频率波形用DMA更新,避免所有通道都依赖DMA,降低总线压力。
电子小兵 · 2026-08-27
建议使用TIM的DMA突发模式,配置DMAR寄存器连续传输多个CCR,这样一次更新事件完成多路加载,减少DMA请求次数,从根源降低竞争概率。
嵌入式老张 · 2026-08-27
核心思路是让DMA传输与PWM更新事件严格同步,避免中断竞争。推荐使用定时器的DMA突发传输(Burst)配合更新事件触发:配置TIMx的DMAR寄存器,使能DMA循环模式,将DMA请求映射到更新事件(UEV),并设置DMA为高优先级。这样,每个PWM周期开始时,DMA自动从内存加载新的比较值(如CCR),无需CPU介入,彻底消除中断延迟。实操建议:1)将DMA通道优先级设为最高,且关闭DMA中断(或仅在循环完成时触发),避免中断服务程序抢占;2)使用双缓冲(内存中准备两组波形数据),在DMA传输完成中断中切换缓冲区,但需确保切换发生在更新事件之后(可通过读取SR的UIF标志或使用定时器更新中断的优先级低于DMA);3)若多路频率不同,可考虑使用多个定时器,每个定时器独立DMA,但共享DMA控制器时需确保请求仲裁不冲突。最后,用示波器验证抖动,若仍有微小抖动,可调整DMA的FIFO或突发长度,并确保内存对齐(如4字节对齐)以提升传输效率。
mcuku 阿沐 · 2026-08-27