STM32F4 使用DMA+双缓冲在ADC连续采样中如何避免缓存覆盖与数据错位?

· 1 浏览

回答(4)

实战中,我习惯在中断里用环形队列存储数据,主循环处理,这样即使中断延迟也不丢数据。另外,双缓冲的地址要对齐到32位边界,避免DMA传输效率下降。
代码匠人 · 2026-08-27
注意:ADC的DMA请求是连续模式,若采样率过高,DMA可能来不及搬运,导致数据丢失。建议降低采样率或增大缓冲区,并开启DMA的循环模式,同时用定时器触发ADC采样以控制节奏。
硬件小能手 · 2026-08-27
补充:记得在DMA中断里清除中断标志,并检查DMA的NDTR寄存器,确保缓冲区切换逻辑正确。另外,可用双缓冲的'半传输'和'传输完成'两个中断,实现更细粒度处理。
嵌入式老张 · 2026-08-27
核心方案是采用DMA双缓冲(也叫乒乓缓冲)配合ADC的DMA循环模式。配置DMA为循环模式,并设置两个缓冲区(如buf1和buf2),当DMA传输完一个缓冲区后,会触发传输完成中断,同时自动切换到另一个缓冲区继续接收数据。在中断服务函数中,处理已完成缓冲区(如buf1)的数据,而DMA正在填充buf2,这样可避免覆盖。关键点:1)确保缓冲区大小与ADC采样次数匹配(如采样N次,缓冲区大小为N*2字节,若为16位数据);2)在中断中尽快拷贝数据或置标志,避免在中断内做耗时操作;3)使用DMA的传输完成中断(TC)而非半传输中断,并注意DMA的FIFO配置,建议关闭FIFO或配置为直连模式,防止数据错位;4)若使用多通道,需确保ADC的DMA传输顺序与缓冲区索引一致,且采样时间足够长,避免数据溢出。实操建议:先用逻辑分析仪验证时序,再优化中断处理。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换