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

· 1 浏览

回答(4)

实际调试时,用逻辑分析仪抓取波形,观察毛刺是否出现在更新时刻。若毛刺在DMA传输中,可尝试增加DMA的FIFO或调整数据宽度,减少传输占用时间。
调试小能手 · 2026-08-27
注意DMA传输完成中断和更新中断可能同时触发,建议在DMA中断中关闭更新中断,处理完再开启,或者用双缓冲避免数据撕裂。
芯火燎原 · 2026-08-27
补充:如果频率差异很大,可考虑用主从定时器级联,主定时器产生更新事件触发从定时器,从定时器用DMA更新,这样同步更精确。
嵌入式老张 · 2026-08-27
核心思路是让DMA传输与PWM更新事件严格同步,避免在更新时刻发生竞争。推荐使用定时器的DMA突发传输模式(Burst Mode),将多个比较寄存器(如CCR1-CCR4)的更新打包在一个更新事件中通过DMA一次性写入,并配置DMA为循环模式,这样每次更新事件只触发一次DMA请求,且传输在更新事件前完成。具体操作:1) 初始化定时器时,设置TIMx_DCR(DMA控制寄存器)指定基地址和突发长度,例如DCR_BL=4,对应4个CCR;2) 配置DMA通道为外设到内存,外设地址指向TIMx_DMAR,内存为预存波形表,循环模式,数据宽度32位;3) 在更新事件中断中仅做标志位处理,不直接操作寄存器,避免与DMA竞争。若仍需多路不同频率,建议每路使用独立定时器,并错开更新相位(如设置不同初始计数值),减少同时更新概率。实测中,将DMA优先级设为最高,并开启定时器的DMA请求使能(TIMx_DIER的UDE位),可有效消除毛刺。
mcuku 阿沐 · 2026-08-27