要避免DMA更新PWM缓冲区时的毛刺,核心是确保DMA传输与定时器更新事件严格同步,且数据切换在PWM周期边界完成。实操建议:1)使用定时器的更新事件(UEV)作为DMA请求源,配置DMA为循环模式,并将内存地址设为双缓冲(如两个数组交替),通过DMA的半传输和传输完成中断(或使用定时器更新中断)切换缓冲区指针,但注意中断仅用于切换标志,不直接操作PWM寄存器,避免时序抖动。2)确保DMA传输宽度与CCR寄存器匹配(如32位),并启用定时器的预装载功能(ARPE=1),使CCR值在更新事件时原子加载,防止传输中途被读取。3)若使用STM32F3/F4等,可启用DMA的FIFO和突发模式,减少总线占用,但需保证DMA优先级高于其他外设。4)最关键:在初始化时,将两个缓冲区预填充相同初始值,并在切换前验证DMA传输完成标志,避免未完成时切换导致部分更新。若允许,可牺牲一个通道作为同步信号,用硬件触发切换缓冲区。
mcuku 阿沐 · 2026-08-27