STM32 使用 DMA 采集多通道 ADC 时,如何避免数据错位并正确解析各通道结果?

· 1 浏览

回答(4)

若数据仍错位,检查DMA配置中的外设地址是否固定为ADC->DR,内存地址递增,且外设地址不递增。
硬件工程师小李 · 2026-08-27
注意:DMA缓冲区大小必须为通道数,且ADC分辨率影响数据位宽,若为12位,数据右对齐,读取时无需移位。
STM32小白 · 2026-08-27
补充:建议使用HAL库的HAL_ADC_Start_DMA,并在回调函数HAL_ADC_ConvCpltCallback中处理数据,避免手动管理中断。
嵌入式老张 · 2026-08-27
避免数据错位关键在于DMA传输模式与ADC通道配置的严格匹配。首先,确保ADC扫描模式(SCAN)和DMA循环模式(CIRCULAR)同时启用,且DMA数据宽度与ADC数据寄存器(16位)一致。其次,在初始化时,按顺序配置通道序列(如CH0,CH1,CH2),DMA缓冲区大小必须等于通道数×2字节,且缓冲区类型为uint16_t数组。解析时,直接按数组索引读取,索引0对应序列第一个通道,依此类推。若使用非循环模式,需在DMA传输完成中断中重置传输计数,避免覆盖。实操建议:在DMA中断中设置标志位,主循环中读取缓冲区前先复制到局部变量,防止数据更新导致错位。另外,若使用多ADC(如ADC1/ADC2),需分别配置DMA流,并确保各ADC的触发同步。最后,验证时可用固定电压源逐通道测试,观察数据是否按序对应。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换