STM32 使用 DMA 在双缓冲模式下传输 ADC 数据时,如何精确处理缓冲区切换标志以避免数据撕裂?

· 4 浏览

回答(4)

如果处理时间紧张,考虑使用乒乓缓冲加双缓冲DMA,并利用空闲中断或定时器同步,减少竞争窗口。
硬件控小王 · 2026-08-27
可以设置一个标志位数组,每个缓冲区对应一个标志,在中断中置位,主循环中检查并清零,注意用volatile修饰。
代码工匠 · 2026-08-27
建议使用DMA的传输完成和半传输中断,配合内存目标寄存器判断,确保在切换瞬间锁定数据,避免撕裂。
嵌入式老张 · 2026-08-27
在STM32双缓冲DMA传输ADC数据时,精确处理缓冲区切换标志的关键是使用DMA的中断标志(如DMA_IT_TC)和半传输中断(HT),而不是依赖软件轮询。配置DMA为循环模式并启用双缓冲,每个缓冲区大小对应一次完整采样集。在中断服务函数中,检查DMA_GetITStatus和DMA_GetCurrentMemoryTarget,当TC中断触发时,表示当前使用的缓冲区已满,此时可安全处理另一个缓冲区(即非当前目标)。为避免数据撕裂,务必在中断中先读取DMA_GetCurrentMemoryTarget确认缓冲区状态,再处理数据,且处理期间禁止DMA中断或使用临界区保护。实操建议:使用HAL库时,在HAL_ADC_ConvCpltCallback和HAL_ADC_ConvHalfCpltCallback中分别处理两个缓冲区,确保处理时间小于DMA传输周期,否则需增加缓冲区或降低采样率。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换