底层原因:STM32的ADC多通道DMA采集时,数据错位源于DMA传输与ADC转换的时序竞争。ADC按规则组顺序转换,但DMA搬运数据是连续突发,若DMA配置为循环模式且未设置足够的数据对齐(如半字对齐),或ADC转换完成标志与DMA请求不同步,会导致通道数据写入缓存时偏移。此外,若缓存类型为8位而ADC数据为12位,未按半字(16位)对齐,DMA会按字节搬运,造成高低字节错乱。解决办法:1) 将DMA数据宽度设为半字(Half Word),缓存数组定义为uint16_t,并确保缓存地址按4字节对齐(使用__attribute__((aligned(4))));2) 使用DMA的循环模式,并配置ADC的DMA请求为每次转换完成触发,避免多通道间数据覆盖;3) 若使用双缓冲,需在DMA传输完成中断中切换缓冲区,并清空ADC的DMA请求标志;4) 对于多通道,建议先停止DMA,再修改通道序列,避免转换中配置变化。实操中,可先单通道验证对齐,再扩展多通道,并用逻辑分析仪或串口打印校验数据。
mcuku 阿沐 · 2026-08-27