STM32 使用 DMA 多通道采集 ADC 时,数据错位与缓存对齐的底层原因及解决办法

· 1 浏览

回答(4)

补充:若数据仍错位,可尝试关闭ADC的连续转换模式,改为软件触发单次转换,配合DMA的普通模式,每次转换后重新配置,牺牲速度换稳定性。
硬件工程师阿强 · 2026-08-27
补充:使用HAL库时,可启用ADC的DMA循环模式,并调用HAL_ADC_Start_DMA,但需在回调中处理半传输和完成中断,确保缓存索引正确。
码农小飞 · 2026-08-27
补充:注意ADC的DMA传输计数应等于通道数,且每次转换后DMA指针自动递增。若错位,检查DMA的NDTR值是否被意外修改,或中断中误操作。
嵌入式老周 · 2026-08-27
底层原因: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

🧰 配套工具

📊 ADC 转换