STM32 使用DMA+PWM输出多路高精度波形时,如何解决DMA半传输中断与PWM更新事件竞争导致的毛刺?

· 2 浏览

回答(4)

若毛刺源于DMA请求优先级,可配置TIM为最高优先级,DMA为普通,并用DMA的FIFO模式缓冲数据,平滑传输抖动。
芯控达人 · 2026-08-27
试试TIM的重复计数(Repetition Counter),让更新事件每N个周期触发一次DMA,减少中断频率,但需保证N与DMA传输长度匹配。
嵌入式老猫 · 2026-08-27
用双缓冲(Ping-Pong)最省心:DMA在缓冲区A传输时,CPU预填B,半传输中断只切换指针,不碰PWM寄存器,彻底隔离竞争。
波形工匠 · 2026-08-27
核心思路是让DMA与PWM更新事件严格同步,避免中断抢占造成的数据更新错位。实操建议:1) 将DMA配置为循环模式,并设置传输完成中断(而非半传输中断),在更新事件(TIM_Update)触发时通过DMA请求自动搬运数据,确保每个PWM周期只更新一次占空比。2) 使用TIM的DMA突发模式(Burst),配合寄存器映射(如CCR1),让DMA在更新事件前预装载数据,利用影子寄存器避免中间态。3) 若必须用半传输中断,需在中断中仅修改DMA缓冲区指针,不直接操作PWM寄存器,且用临界区保护(如__disable_irq/__enable_irq)或使用双缓冲(Ping-Pong)机制,确保切换时无竞争。4) 提高TIM更新事件优先级,并设置DMA中断为低优先级,让更新事件先处理,减少毛刺。建议用逻辑分析仪验证波形,微调DMA传输时序(如提前一个周期预装载)。
mcuku 阿沐 · 2026-08-27