Thank you for your answers.
Everything is working fine. This is how I managed to do it
while(1)
{
HAL_ADC_Start_DMA(&hadc1, (uint32_t*) s_analog_data,
SAMPLE_SIZE * ANALOG_IN_INDEX_max);
osDelay(pdMS_TO_TICKS(2));
HAL_ADC_Stop_DMA(&hadc1);
// suspend the scheduler to prevent race condition of variable
// s_ai_encoder_val, s_ai_second_val and s_ai_bat_voltage_val
vTaskSuspendAll();
s_ai_encoder_val = get_average(s_analog_data, ANALOG_IN_INDEX_encoder,
SAMPLE_SIZE);
s_ai_second_val = get_average(s_analog_data, ANALOG_IN_INDEX_second,
SAMPLE_SIZE);
if ((xTaskGetTickCount() - last_updated_tick > VBAT_PERIOD_TICK)
|| (0 == s_ai_bat_voltage_val))
{
last_updated_tick = xTaskGetTickCount();
ADC_InitTypeDef last_def;
mAnalogIn_configure_vbat(&last_def);
HAL_ADC_Start(&hadc1);
s_ai_bat_voltage_val = HAL_ADC_GetValue(&hadc1);
// Protect against an over and over reading of an
// not connected battery
if (0 == s_ai_bat_voltage_val)
{
s_ai_bat_voltage_val = 1;
}
mAnalogIn_configure_2_channels(&last_def);
}
// re-enable scheduler
xTaskResumeAll();
}
It miss some function definitions but I think it speeks for itself.