Hello,
I looked at your software and indeed that's normal because you're in interrupt mode.
In each conversion you need to read ADC_DR register which common to all channels conversion. So every interrupt will be refreshed by the conversion of the next channel that will overwrite the previous one. Your implementation doesn't seem good.
In DMA mode, the DMA manages this automatically and it's triggered automatically by the ADC for each conversion and increments the memory (when configured by the user) to write to the correct memory location.
So in interrupt mode you need to select to trigger the ADC interrupt at each end of conversion not all channel conversions and in the callback (HAL_ADC_ConvCpltCallback) read the ADC_DR register for each conversion to unsure that you are reading the correct channel.
I modified your example on which I read the 4 channels: 3 internal ADC channels and one external. I'm reading them one by one in this order:
- Temp sensor
- Vrefint
- VBAT
- CHANNEL1 (PA0)

I used F4-Discovery board for this.
Hope it helps.
Please close this thread on this reply if it does answer your question.