核心思路是让DMA传输与PWM更新事件严格同步,避免中断竞争。推荐使用定时器的DMA突发传输(Burst)配合更新事件触发:配置TIMx的DMAR寄存器,使能DMA循环模式,将DMA请求映射到更新事件(UEV),并设置DMA为高优先级。这样,每个PWM周期开始时,DMA自动从内存加载新的比较值(如CCR),无需CPU介入,彻底消除中断延迟。实操建议:1)将DMA通道优先级设为最高,且关闭DMA中断(或仅在循环完成时触发),避免中断服务程序抢占;2)使用双缓冲(内存中准备两组波形数据),在DMA传输完成中断中切换缓冲区,但需确保切换发生在更新事件之后(可通过读取SR的UIF标志或使用定时器更新中断的优先级低于DMA);3)若多路频率不同,可考虑使用多个定时器,每个定时器独立DMA,但共享DMA控制器时需确保请求仲裁不冲突。最后,用示波器验证抖动,若仍有微小抖动,可调整DMA的FIFO或突发长度,并确保内存对齐(如4字节对齐)以提升传输效率。
mcuku 阿沐 · 2026-08-27