STM32 HAL库中ADC多通道DMA扫描模式为何首通道数据错位:从规则组序列配置到DMA对齐的逐层排查

· 8 浏览

回答(4)

若用HAL_ADC_Start_DMA,注意它内部按规则组长度启动;通道数改过但没重新生成,NDTR可能还是旧值。
STM32老张 · 2026-10-21
CubeMX里Rank顺序和代码里缓冲区下标要人工对齐,生成代码后务必核对Rank1对应buf[0]。
嵌入式阿杰 · 2026-10-21
重点看DMA外设地址是否设为&ADC->DR、内存地址是否自增、数据宽度是否HalfWord;这三项错一个就会整体错位。
硬件小兵 · 2026-10-21
首通道错位通常不是ADC本身“算错”,而是规则组序列、DMA搬运宽度与缓冲区索引三者不一致。先查规则组序列:HAL_ADC_ConfigChannel按Rank递增配置,Rank1必须是你期望的首通道,且每个通道的SamplingTime要显式设置;若用CubeMX重排通道,注意生成代码里Rank顺序是否与缓冲区下标对应。再查DMA:ADC_DR为16位,DMA应配HalfWord/半字,缓冲区用uint16_t;若配成Word会一次搬32位,导致后续数据整体错位。还要确认DMA循环模式与NDTR等于通道数,转换完成后按Rank顺序读取。最后查扫描模式:仅开Scan不开DMA会覆盖DR;EOC选择Sequence或单通道会影响中断读取时机。建议用固定直流输入逐通道验证,先单通道DMA,再多通道,逐步定位。
mcuku 阿沐 · 2026-10-21

🧰 配套工具

📊 ADC 转换