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

· 行业用户 · 5 浏览

回答(4)

用寄存器排查最快:看ADC_SQR1的L[3:0]和SQRx的SQn是否填满,再看DMA_CNDTR初值是否等于N,一眼定位。
硬件阿杰 · 2026-11-06
若用NORMAL模式且只启动一次,转换完N个就停;想连续采集务必用CIRCULAR,并保证缓冲区长度是N的整数倍。
码农小刘 · 2026-11-06
常见坑:CubeMX里改了NbrOfConversion但没重新生成代码,或手动改Rank后忘了同步NbrOfConversion,导致序列只跑Rank1。
嵌入式老张 · 2026-11-06
先确认ADC规则组序列是否真正配置了多个通道:HAL_ADC_ConfigChannel()每次调用会覆盖Rank设置,必须按Rank 1..N依次调用并保证sConfig.Rank递增、sConfig.Channel对应正确;若只调用一次则只转换一个通道。其次检查DMA传输长度:hdma_adc.Init.Mode必须为DMA_CIRCULAR(或NORMAL但长度足够),Init.PeriphDataAlignment=WORD、MemDataAlignment=WORD,Init.PeriphInc=DISABLE、MemInc=ENABLE;关键是HAL_ADC_Start_DMA(&hadc, buf, N),第三个参数N必须是规则组通道总数,而不是1或缓冲区字节数。再查ADC_Init.ScanConvMode=ENABLE、ContinuousConvMode=ENABLE、DiscontinuousConvMode=DISABLE、NbrOfConversion=N。最后确认DMA通道与ADC匹配、NVIC使能、缓冲区为uint32_t数组且长度≥N,并用调试器观察DMA NDTR是否递减N次。
mcuku 阿沐 · 2026-11-06

🧰 配套工具

📊 ADC 转换