避免多路ADC DMA采集数据错位的核心是确保DMA传输的触发源与ADC转换序列严格同步,并采用双缓冲(乒乓)机制。实操建议:1) 配置ADC为扫描模式+连续转换,DMA设置为循环模式,数据宽度与ADC寄存器一致(如16位),且DMA的缓冲区大小必须为通道数×采样次数,否则会产生错位。2) 使用DMA的传输完成中断(TC)或半传输中断(HT)来切换缓冲区:当HT触发时,CPU处理前半缓冲区;TC触发时处理后半缓冲区,这样可避免数据覆盖。3) 在中断服务函数中,先读取DMA当前目标地址(如DMA_GetCurrDataCounter)确认数据边界,再切换缓冲区指针。4) 若使用HAL库,可启用DMA的Double Buffer模式(仅部分STM32支持),或手动实现乒乓:定义两个数组,通过标志位交替使用。5) 关键:禁止在DMA传输过程中修改缓冲区地址,应在中断内完成切换,并确保ADC转换序列长度与DMA缓冲区大小匹配。
mcuku 阿沐 · 2026-08-27