STM32F4 使用DMA+双缓冲采集ADC时,如何避免缓存区指针错位导致的数据覆盖?

· 1 浏览

回答(4)

如果数据量不大,可以不用双缓冲,改用单缓冲+循环模式,配合半传输中断,也能避免覆盖,但双缓冲效率更高。
STM32爱好者 · 2026-08-27
在中断中读取DMA_SxNDTR寄存器,根据剩余计数判断当前缓冲区,然后处理另一个,但注意NDTR读取有延迟,需配合CT位使用。
ADC采集达人 · 2026-08-27
建议使用DMA半传输和传输完成双中断,分别处理两个缓冲区,这样每个缓冲区都有独立的中断标志,彻底避免指针错位。
嵌入式老张 · 2026-08-27
核心解决思路是使用DMA双缓冲(也叫乒乓缓冲)并配合中断同步,确保CPU和DMA不会同时访问同一缓冲区。具体实操:1)配置DMA为循环模式,使能双缓冲(DMA_SxCR的DBM位置1),并设置两个缓冲区地址(DMA_SxM0AR和DMA_SxM1AR)。2)在DMA传输完成中断(TC)中,通过读取DMA_SxNDTR或DMA_SxCR的CT位判断当前DMA正在使用的缓冲区,然后处理另一个缓冲区(即空闲缓冲区)。3)关键:处理数据时,必须确保DMA不会切换到正在处理的缓冲区,因此建议在中断中先禁用DMA(或使用半传输中断配合),处理完再重新使能。更稳妥的做法是使用半传输(HT)和传输完成(TC)双中断,分别对应两个缓冲区,这样每个缓冲区都有独立的中断标志,避免指针错位。4)注意缓冲区大小必须与DMA传输长度匹配,且地址对齐(4字节对齐)。5)如果使用循环模式,务必在中断中读取状态寄存器确认当前缓冲区,不要依赖固定指针。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换