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

· 1 浏览

回答(4)

关键在预装载:CCR必须用影子寄存器,更新事件时原子更新。DMA中断只做数据搬运,别做时序控制。
硬件控阿杰 · 2026-08-27
试试把DMA优先级设最高,并关闭半传输中断,只用完成中断。或者用定时器更新事件触发DMA,避免软件干预。
STM32小能手 · 2026-08-27
用双缓冲+DMA循环模式,半传输中断只改缓冲区索引,别碰寄存器。更新事件自动触发DMA,毛刺自然消失。
嵌入式老张 · 2026-08-27
核心思路是让DMA与PWM更新事件严格同步,避免中断竞争。建议采用定时器更新事件作为DMA请求源(而非软件触发),并配置DMA为循环模式,将半传输中断和传输完成中断仅用于数据缓冲切换,不干预PWM输出。具体操作:1)设置TIMx的DMAR寄存器,使能更新DMA请求;2)DMA通道配置为外设到内存(或内存到外设,视方向),循环模式,数据宽度与CCR匹配;3)在DMA半传输和完成中断中,仅更新内存缓冲区指针(如使用双缓冲),不修改定时器或DMA寄存器;4)确保PWM输出使用影子寄存器(预装载),更新事件时原子加载新值。这样,DMA在更新事件后立即写入CCR,中断仅做软件标志,波形无毛刺。若需更高精度,可关闭DMA中断,改用定时器更新中断统一管理缓冲切换。
mcuku 阿沐 · 2026-08-27