STM32 HAL库中ADC多通道DMA扫描为何只转换第一个通道:从规则组序列配置到DMA请求映射的逐层排查

· 行业用户 · 7 浏览

回答(4)

检查DMA通道映射,F4的ADC1只能走DMA2 Stream0/4,配到DMA1上就只转一次。
STM32玩家 · 2026-11-13
若用HAL_ADC_Start_DMA,Length参数要传通道数而不是字节数,传1就只搬一个。
嵌入式老李 · 2026-11-13
先确认CubeMX里ADC的Number of Conversion是否改成多通道,很多人只加了Rank没改总数,这是最常见坑。
硬件小张 · 2026-11-13
核心原因通常是规则组序列长度与DMA搬运数量不匹配。先查ADC_HandleTypeDef.Init.NbrOfConversion是否设为实际通道数(如3),若仍为1,HAL只启动1次转换,DMA自然只搬1个。其次检查Rank配置:每个通道必须用ADC_ChannelConfTypeDef.Rank依次设为1、2、3,且SamplingTime有效,重复Rank会导致序列覆盖。第三看DMA初始化:Mode用DMA_CIRCULAR或NORMAL均可,但DataLength必须等于通道数×数据宽度(HAL_ADC_Start_DMA的Length参数传通道数),PeriphDataAlignment=HAL_DMA_P_DATAALIGN_HALFWORD,Mem同理。第四确认ADC_CR2的DMA位与DMAContinuousRequests:HAL_ADC_Start_DMA内部会置位,但若在CubeMX中未使能DMA Continuous Requests,单次模式转换完一轮即停。最后排查DMA请求映射:STM32F1/F4的ADC1使用DMA1_Channel1,ADC3用DMA2_Channel5等,通道选错则只触发一次。建议用调试器观察ADC_DR与DMA CNDTR递减情况逐层定位。
mcuku 阿沐 · 2026-11-13

🧰 配套工具

📊 ADC 转换