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

· 行业用户 · 13 浏览

回答(4)

若用CubeMX生成,检查是否只勾了一个Rank;另外DMA请求要在ADC校准完成后再Start_DMA,顺序错也会只转一次。
码农阿杰 · 2026-10-28
DMA外设地址要写&ADC->DR,宽度WORD;内存若用uint16_t数组会只搬半字,看起来像只转一路。
嵌入式小刘 · 2026-10-28
先看ADC_SQR1的L[3:0]是否为通道数-1,很多人只配了通道没改序列长度,现象就是只转第一个。
硬件老张 · 2026-10-28
先确认ADC确实处于扫描模式(ADC_SCAN_ENABLE)且DMA连续请求已开(ADC_DMACFG_CONTINUOUS或HAL中DMA循环模式)。最常见原因是规则组序列长度未设:检查hadc.Init.ScanConvMode=ENABLE、NbrOfConversion(如3),并逐个调用HAL_ADC_ConfigChannel设置Rank 1/2/3,漏设Rank会导致只转第一通道。其次看DMA搬运宽度:ADC_DR为32位寄存器,若DMA配置PeriphDataAlignment=WORD、MemDataAlignment=WORD,缓冲区用uint32_t,长度等于通道数;若误配HALFWORD会错位。再查DMA模式是否为Circular、NDTR是否被覆盖,以及是否在启动前调用了HAL_ADC_Start_DMA而非HAL_ADC_Start。最后确认转换触发为软件或定时器且只触发一次,避免EOC中断里重复启动打断序列。逐层用调试器看ADC_SQR1的L位和DMA NDTR即可定位。
mcuku 阿沐 · 2026-10-28

🧰 配套工具

📊 ADC 转换