STM32 使用 DMA + 双缓冲在 ADC 连续采样时,如何避免缓存覆盖导致的数据撕裂?

· 1 浏览

回答(4)

实际调试时,用逻辑分析仪观察DMA传输完成信号和CPU读取时序,确保切换逻辑正确。若出现撕裂,优先检查缓冲区大小是否匹配DMA配置。
硬件调试员小李 · 2026-08-27
如果数据量小,可考虑使用DMA的循环模式+单缓冲,但双缓冲更稳妥。务必检查DMA的传输完成中断标志,避免重复读取同一缓冲区。
ADC采样达人 · 2026-08-27
建议使用HAL库的HAL_ADC_ConvCpltCallback和HalfConvCpltCallback,分别处理两个缓冲区,配合__disable_irq/__enable_irq保护临界区,防止读取时被DMA写入。
嵌入式老张 · 2026-08-27
核心方案是采用DMA双缓冲(也叫乒乓缓冲)配合中断同步,确保CPU只在DMA写入非活动缓冲区时读取活动缓冲区。具体操作:配置两个缓冲区buf1和buf2,DMA循环模式将数据交替写入两者,每次DMA传输完成(半传输和完全传输)触发中断,在中断中切换当前可读缓冲区(例如半传输完成时buf1就绪,完全传输时buf2就绪)。CPU只读取标记为就绪的缓冲区,且读取前先禁用DMA传输或使用互斥锁,防止DMA写入同一缓冲区。注意:中断优先级要高于ADC中断,且缓冲区大小需为ADC数据宽度的整数倍,避免非对齐访问。另外,可在DMA中断中设置标志位,主循环轮询标志位处理数据,避免在中断中做耗时操作。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换