STM32 ADC conversion using HAL
In your original code, set the End of Conversion Selection to disabled.
hadc1.Init.EOCSelection = DISABLE;
It turned out that #define ADC_EOC_SEQ_CONV ((uint32_t)0x00000000)
value is equal to DISABLE
. So actually the EOCSelection should be configured as:
to be able to poll the ADC multiple times.
Then you can read the ADC continously without stopping and starting the ADC:
int main(void)
{
HAL_Init();
SystemClock_Config();
ConfigureADC();
HAL_ADC_Start(&hadc1);
while(1)
{
if (HAL_ADC_PollForConversion(&hadc1, 1000000) == HAL_OK)
{
ADCValue = HAL_ADC_GetValue(&hadc1);
}
}
}
This way it worked fine for me.
Since HAL is a quite new library there are not a lot of resources to be find but not impossible. I learned a lot from this tutorial, it demonstrates all possible ADC useage step by step; from simple polling, to using interrupts and DMA.
I would like to add that for my setup (nucleo-h743) it was not enough to set:
hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
I also had to enable the overrun setting as well:
hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
Without this the HAL_ADC_PollForConversion was still blocking. I do not fully understand why this was necessary but it does allow me to poll in continuous mode.
Hm... I found couple of tutorials that used HAL_ADC_Stop(&hadc1) to end the convertion... I was looking at these tutorials before and thought that this is rather barbaric way, seems it disables ADC completely, so I though there should be different method. But it seems, that this actually works well.
Be welcome to post answer if there is more elegant way of doing this, since I think using HAL_ADC_Stop() is pretty awful, but can be used for learning purposes.
while (1)
{
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, 1000000) == HAL_OK)
{
ADCValue = HAL_ADC_GetValue(&hadc1);
sprintf(str, "%d", ADCValue);
BSP_LCD_DisplayStringAt(130,30, (uint8_t*)str, LEFT_MODE);
}
HAL_ADC_Stop(&hadc1);
}