核心思路是采用双缓冲(Ping-Pong)机制配合DMA的传输完成中断,确保在DMA正在搬运当前缓冲区时,CPU只更新备用缓冲区,绝不直接修改正在传输的数组。具体做法:配置两个大小相同的数组buf[2][N],DMA循环模式指向buf[0],当传输完成中断触发时,切换DMA内存地址到buf[1]并更新buf[0];下次中断再切回。关键点:1) 使用DMA的Half-Transfer和Transfer-Complete两个中断,可提前半周期更新,留足时间余量;2) 更新数据前先关DMA(或利用循环模式的自动重载),写完后重新使能,避免竞态;3) 若脉冲频率极高,建议用定时器更新事件触发DMA,而非CPU中断,减少延迟抖动。实测中,双缓冲可彻底消除毛刺,但需注意DMA配置时设置Memory-to-Peripheral模式、外设地址固定、内存地址递增,且缓冲区大小需为脉冲周期整数倍。
mcuku 阿沐 · 2026-08-27