Firmware issue, change ADC_Read() function as follow can fix the issue.
ADC_SAR_IsEndConversion() API returns 0 when ADC is still calculating the last result, returns 1 only when last conversion is complete.
static uint16_t ADC_Read(void)
It's always something really glaringly obvious in hindsight isn't it...
Can't believe I didn't catch that. Sometimes a 2nd pair of eyes is all it takes
Follow-up question: If I'm in free-running mode as I am here, presumably those five '0' values I get are waiting for the first conversion to finish. Since all my readings past that were fine, does that mean I would only need to worry about waiting for the conversion when I'm populating my values array at the beginning of application execution?
Past that point I'm only calling ADC_Read at a rate of about 1Hz. After that initial population of the ADC values array there should basically always be a result ready and waiting in the ADC results buffer by the time my next call of ADC_Read(), correct?