首通道错位通常不是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