STM32 使用DMA+PWM输出多路精确占空比时,如何避免内存总线冲突导致的波形抖动?

· 1 浏览

回答(4)

若抖动源于CPU中断干扰,可将DMA优先级设为最高,并关闭无关中断;同时用__disable_irq()保护关键区,或改用RTOS的临界区。
代码工匠 · 2026-08-27
建议使用TIM的DMA突发模式(DMABURST),一次触发连续搬运多个CCR,减少DMA请求次数,降低总线占用频率,但需确保寄存器地址连续。
硬件小白 · 2026-08-27
补充:开启DMA的循环模式,并设置FIFO(若支持)缓冲数据,可减少突发传输对总线的占用,但注意FIFO深度需匹配比较值更新频率。
嵌入式老周 · 2026-08-27
核心思路是让DMA和CPU尽量不争抢同一总线,并利用定时器影子寄存器实现原子更新。实操建议:1)将PWM比较值数组放入SRAM1,DMA从SRAM1搬运到TIMx->CCR,同时确保DMA通道优先级高于CPU访问(在NVIC和DMA配置中设置);2)使用定时器的预装载功能(TIM_CCxPreloadControl),在更新事件时一次性加载所有CCR,避免逐通道更新造成的中间态;3)若抖动仍存在,改用双缓冲DMA(乒乓缓冲),在DMA中断中切换缓冲区,CPU只写后备区,彻底隔离访问;4)检查AHB/APB桥时钟,必要时将TIM和DMA挂到不同总线(如TIM2在APB1,DMA1在AHB),降低冲突概率。最后,用示波器验证抖动频率,若与DMA中断频率一致,则优先优化中断处理时间。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

🎛️ PWM 频率/占空比