STM32 使用 DMA 多通道采样时,如何避免缓冲区数据错位并保证时序一致性?

· 2 浏览

回答(4)

时序一致性关键在触发源,用定时器触发ADC,并让DMA传输与定时器同步,比软件触发更可靠。另外,开启DMA的循环模式后,记得在中断里清标志。
STM32小能手 · 2026-08-27
如果通道数多,建议用DMA的突发模式(Burst)配合FIFO,能减少总线占用,但要注意FIFO阈值设置,避免数据堆积。
芯海拾贝 · 2026-08-27
用循环DMA时,记得在中断里先关DMA再切换缓冲区,防止写入冲突。实测用双缓冲比单缓冲+memcpy更稳。
嵌入式老张 · 2026-08-27
核心思路是采用“双缓冲+定时器触发+DMA中断同步”方案。首先,将ADC配置为扫描模式,并启用DMA循环模式,但不要直接使用单一大缓冲区,而是定义两个大小相等的缓冲区(如buf1和buf2),通过DMA的半传输和传输完成中断交替切换。每次DMA中断时,在中断服务程序中记录当前缓冲区索引,并利用定时器(如TIM1)的更新事件作为ADC采样的外部触发源,确保每个通道的采样时刻严格对齐。同时,在DMA配置中,将数据宽度设为半字(16位),并确保缓冲区大小等于通道数×采样次数,避免因字节对齐问题导致错位。另外,建议在DMA中断中读取DMA的CNDTR寄存器(剩余数据量)来校验当前缓冲区位置,防止因中断延迟造成数据覆盖。最后,主循环中处理数据时,只访问非活动缓冲区,并通过标志位同步,这样可彻底避免错位和时序抖动。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换