STM32 使用DMA+双缓冲采集ADC时,如何精确避免缓冲区覆盖导致的数据错位?

· 1 浏览

回答(4)

若DMA支持突发传输,配置MSIZE=PSIZE且对齐地址,可减少总线占用,间接降低覆盖风险。
硬件控小李 · 2026-08-27
关键在内存屏障:处理缓冲区前用__DMB()指令,防止编译器乱序优化导致读到半新半旧数据。
芯片调试员 · 2026-08-27
用空闲中断(IDLE)配合DMA双缓冲,每次收到完整帧后再切换缓冲区,能天然避免数据错位,适合串口或定时触发场景。
老周嵌入式 · 2026-08-27
核心思路是让DMA在双缓冲间自动切换,并利用中断或标志位确保CPU只在当前非活动缓冲区被填充时读取另一块。具体做法:配置DMA的M0AR/M1AR指向两个缓冲区,开启循环模式(Circular)和传输完成中断(TC)。在中断服务函数中,通过读取DMA的NDTR寄存器或检查CR寄存器的CT位(当前目标)判断哪个缓冲区刚被填满,然后只处理另一个缓冲区。为避免覆盖,务必在中断里快速拷贝数据或置标志,且主循环中处理数据前先禁用DMA(或使用半传输中断配合乒乓策略)。实操建议:将缓冲区大小设为ADC采样次数整数倍,并启用DMA的FIFO(若支持)以平滑突发;若采样率极高,可考虑双缓冲+半传输中断(HT)实现四段流水,但需确保ISR执行时间远小于填充周期。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换