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

· 1 浏览

回答(4)

若仍担心竞争,可牺牲一点CPU:在更新事件中断中设置标志,主循环根据标志更新DMA缓冲区,但这样会降低实时性。更推荐用DMA的传输完成中断来同步,而非半传输。
嵌入式老李 · 2026-08-27
检查DMA传输大小是否与PWM周期匹配,若传输字节数不是周期整数倍,半传输中断可能落在更新事件附近。建议将缓冲区长度设为周期整数倍,并启用DMA的循环模式。
调试小能手 · 2026-08-27
用硬件方式解决:STM32的定时器支持DMA突发传输(Burst),可一次更新多个寄存器,配合更新事件触发,彻底消除软件干预,相位差精度由硬件保证。
硬件控老王 · 2026-08-27
核心思路是让DMA传输与PWM更新事件严格同步,避免中断竞争。推荐使用定时器的更新事件(UEV)作为DMA请求源,并配置DMA为循环模式,同时将DMA的半传输中断(HT)和传输完成中断(TC)仅用于缓冲区管理,不直接修改PWM比较值。关键操作:1)在初始化时,先配置PWM输出和DMA,但禁止定时器,待DMA就绪后再使能定时器,确保首个更新事件时DMA已准备;2)使用双缓冲(Ping-Pong)结构,通过HT和TC切换缓冲区,但切换操作放在中断中,且用临界区或关中断保护,避免与更新事件冲突;3)若相位差固定,可预计算整个周期的比较值数组,DMA连续搬运,不依赖中断实时修改,这样HT/TC仅做标志位,数据错位风险极低。实测建议:将DMA优先级设为最高,定时器更新事件优先级次之,并开启DMA的FIFO模式(若支持)以平滑传输。
mcuku 阿沐 · 2026-08-27