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

· 1 浏览

回答(4)

考虑用TIM的DMA突发请求(DBURST)配合MDMA,一次搬运多路CCR,减少DMA请求次数,降低总线冲突概率。注意配置好突发长度和地址增量。
信号完整性 · 2026-08-27
如果毛刺出现在频率切换时,可先停止定时器(CEN=0),再改ARR和CCR,最后重新启动,并配合DMA的循环模式,确保切换瞬间无中间态。
嵌入式老张 · 2026-08-27
建议用双缓冲DMA,交替更新两个内存区,避免在传输中途修改数据导致半字错位。同时,关闭DMA的FIFO错误中断,防止误触发。
波形工匠 · 2026-08-27
核心思路是让DMA传输与PWM更新事件严格同步,避免中断抢占导致时序错位。推荐使用定时器的更新事件(UEV)作为DMA请求源,并配置DMA为循环模式,这样每个PWM周期自动搬运一次数据到CCR寄存器,无需CPU干预。关键点:1)在初始化时,先设置TIMx_CR1的UDIS位禁止更新事件,完成所有配置后再清除UDIS并触发一次软件更新(UG位),确保首个周期数据就位;2)DMA通道优先级设为最高,且使用FIFO模式(若支持)缓冲数据,减少总线竞争;3)若必须使用中断,则仅在DMA传输完成中断(TC)中更新下一个波形参数,而非在更新事件中断中操作CCR,且中断服务函数内只做标志位设置,主循环处理;4)实测时用示波器观察毛刺,若仍有,可尝试调整TIMx_RCR(重复计数)或DMA突发模式(Burst)一次传输多字节。
mcuku 阿沐 · 2026-08-27