核心思路是让DMA和CPU尽量错峰访问总线,并利用STM32的DMA双缓冲(Double Buffer)机制。首先,将PWM比较值(CCR)数据放入SRAM,并配置DMA为循环模式,双缓冲分别指向两个缓冲区(Buffer A/B)。CPU在DMA正在从Buffer A搬运时,只写Buffer B;当DMA切换至Buffer B时,CPU再写Buffer A,这样避免同一时刻总线竞争。其次,启用DMA的FIFO(若芯片支持)并设置突发传输(Burst),减少总线占用次数。另外,将DMA通道优先级设为最高,并确保TIM的更新事件(UEV)作为DMA请求源,且DMA传输完成中断(TC)中只做标志置位,不进行复杂计算。实操建议:用CubeMX配置时,开启DMA的‘Circular’和‘Double Buffer’模式,中断中仅翻转标志,主循环或定时器中断中更新非活动缓冲区。若仍抖动,可考虑将缓冲区放在D2域(如F4/F7)或使用BDMA(若可用),并检查总线矩阵的AHB/APB时钟配置。
mcuku 阿沐 · 2026-08-27