STM32 使用 DMA 多路 ADC 采样时,如何避免缓冲区错位与数据覆盖?

· 1 浏览

回答(4)

如果多路采样顺序固定,可在DMA传输完成中断中按通道索引读取数据,但更推荐使用双缓冲,因为中断处理时间短,能有效防止覆盖。
DMA优化师 · 2026-08-27
检查ADC的采样时间是否足够长,避免因采样时间过短导致数据不稳定,从而影响缓冲区数据一致性。可适当增加采样周期。
ADC小能手 · 2026-08-27
建议使用DMA的FIFO模式(若支持),并设置突发传输,可减少总线冲突,但需注意FIFO阈值与数据宽度匹配,否则易丢数据。
嵌入式老周 · 2026-08-27
核心思路是使用双缓冲(DMA循环模式+半传输/传输完成中断)或乒乓缓冲,并确保ADC配置为扫描模式且DMA传输宽度与ADC数据寄存器对齐。实操建议:1) 将DMA设置为循环模式,使能半传输和传输完成中断,在中断中交替处理两个缓冲区,避免CPU与DMA同时访问同一缓冲;2) 配置ADC的DMA请求为循环模式,并设置正确的数据对齐(如右对齐16位),确保每个通道数据占固定字节;3) 在启动DMA前,用__HAL_DMA_DISABLE和__HAL_DMA_CLEAR_FLAG清除标志,防止残留数据;4) 若使用HAL库,注意在回调中切换缓冲地址(如HAL_ADC_ConvCpltCallback中调用HAL_ADC_Start_DMA重新指定新地址),并确保缓冲大小等于通道数×采样次数。最后,用volatile修饰缓冲数组,防止编译器优化导致数据不一致。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换