核心思路是让DMA传输与PWM更新事件严格同步,避免在更新事件发生时DMA正在写寄存器。实操上,推荐使用定时器的DMA突发模式(Burst Mode),将DMA请求绑定到更新事件(UEV),并设置DMA为循环模式,每次更新事件触发一次DMA传输,写入CCR寄存器。关键点:1)配置DMA时,将外设地址设为TIMx->DMAR(数据寄存器),内存地址为脉冲序列数组,传输方向为内存到外设,突发长度设为1(或按需),这样每次UEV只传输一个数据,避免DMA长时间占用总线。2)在PWM更新中断中,不要直接修改CCR,而是通过DMA完成中断或更新中断来切换缓冲区(双缓冲),确保数据在更新事件后立即写入。3)若仍出现毛刺,检查DMA优先级是否高于或等于定时器中断,并确保DMA传输时间远小于PWM周期(通常没问题)。4)使用HAL库时,启用TIM_DMA_UPDATE请求,并确保DMA配置为循环模式,且内存地址递增。最后,用示波器验证波形,若仍有毛刺,可考虑使用PWM的预装载功能(ARR/CCR预装载),确保更新事件时寄存器原子更新。
mcuku 阿沐 · 2026-08-27