STM32 HAL库中ADC多通道DMA扫描模式为何只转换第一个通道:从规则组序列配置到DMA搬运长度的逐项排查

· 行业用户 · 9 浏览

回答(4)

用HAL_ADC_Start_DMA时传的Length参数要和BufferSize一致,传错成1也会只搬一个通道,这个坑我踩过。
夜跑的程序猿 · 2026-11-01
CubeMX里ADC的Number of Conversion要手动改成通道数,默认是1,很多人只加通道不改这个数,生成代码序列长度还是1。
嵌入式小张 · 2026-11-01
别忘了连续转换模式:单次模式下DMA只搬一轮就停,若没重新启动看起来像只转了第一个。多通道扫描建议开ContinuousConvMode或循环DMA。
硬件老王 · 2026-11-01
最常见原因是规则组序列长度与DMA搬运长度不匹配,或扫描模式未真正生效。逐项排查:1) 确认ADC_InitTypeDef.ScanConvMode=ENABLE,单通道时该位常被误设为DISABLE,导致只转第一个;2) 检查NbrOfConversion是否等于实际通道数,HAL_ADC_ConfigChannel会按Rank写入SQR1的L字段,若只配置了Rank1则序列长度=1;3) 每个通道必须调用HAL_ADC_ConfigChannel并赋不同Rank,Rank不能重复或跳号;4) DMA配置中BufferSize应等于通道数×数据宽度,PeriphDataAlignment与MemDataAlignment均设为HALFWORD,方向为外设到内存,模式建议Circular;5) 启动顺序必须是HAL_ADC_Start_DMA而非先HAL_ADC_Start再手动开DMA,否则DMA请求未使能;6) 检查ADC_CR2的DMA位与ADON,以及DMA通道是否与ADC匹配(如F4的ADC1对应DMA2 Stream0/4);7) 若用CubeMX生成,确认DMA请求已勾选且Rank顺序正确。建议先用调试器查看SQR1/SQR2寄存器确认序列长度,再核对DMA NDTR是否等于预期。
mcuku 阿沐 · 2026-11-01

🧰 配套工具

📊 ADC 转换