I believe there is a bug in HAL_ADC_ConfigChannel(). Using the STM32g071, with ADC_SCAN_SEQ_FIXED, ADC_EOC_SINGLE_CONV, and NbrOfConversion == 1, when HAL_ADC_ConfigChannel() is called, it OR's in the new channel number, which is incorrect.
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = DISABLE;
hadc1.Init.LowPowerAutoPowerOff = DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.DMAContinuousRequests = DISABLE;
hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_19CYCLES_5;
hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_79CYCLES_5;
hadc1.Init.OversamplingMode = DISABLE;
hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
after initialization, when HAL_ADC_ConfigChannel() is called to switch (single) channels, it OR's the new channel number into ADC_CHSELR, instead of just writing the new channel number in. The workaround is to call LL_ADC_REG_SetSequencerChannels() after every HAL_ADC_ConfigChannel() call.
