cancel
Showing results for 
Search instead for 
Did you mean: 

Currently project based on NUCLEO-H743ZI2. In this project there is a ADC DMA sequence used for VBat, vrefint and temperature. At boot the HAL_ADC_START_DMA() failed with HAL_ERROR.

PeterKwek
Associate II

I trace this back to the call tmp_hal_status = ADC_Enable(hadc) in HAL_ADC_START_DMA() in stm32h7xx_hal_adc.c.

When I look into ADC_Enable(), I see comment about a workaround.

There is waited for ADC_ENABLE_TIMEOUT. But with the settings I use, this ADC_ENABLE_TIMEOUT (2) is not enough. There need to be a delay of at least (3) to have succes.

I'm using a very low clock for the ADC, this should be the reason. But the comments in "stm32h7xx_hal_adc.c." suggest this is already taking into account.

please explain why this still gives HAL_ERROR?

For the time being I use a loop tho check  ADC_Enable(&hadc3) or can increase ADC_ENABLE_TIMEOUT . The last can be tricky when the HAL layer is updated.

Input frequency HSE: 25Mhz

SYSCLOCK: 200Mhz

ADC clock mux: 2Mhz (by PLL3R)

Used settings based on cubeIde code:

 void MX_ADC3_Init(void)

{

 ADC_ChannelConfTypeDef sConfig = {0};

 /** Common config

 */

 hadc3.Instance = ADC3;

 hadc3.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV256;

 hadc3.Init.Resolution = ADC_RESOLUTION_16B;

 hadc3.Init.ScanConvMode = ADC_SCAN_DISABLE;//ADC_SCAN_ENABLE;

 hadc3.Init.EOCSelection = ADC_EOC_SEQ_CONV;

 hadc3.Init.LowPowerAutoWait = DISABLE;

 hadc3.Init.ContinuousConvMode = ENABLE;

 hadc3.Init.NbrOfConversion = 3;

 hadc3.Init.DiscontinuousConvMode = DISABLE;

 hadc3.Init.ExternalTrigConv = ADC_SOFTWARE_START;

 hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;

 hadc3.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;

 hadc3.Init.Overrun = ADC_OVR_DATA_PRESERVED;

 hadc3.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;

 hadc3.Init.OversamplingMode = DISABLE;

 if (HAL_ADC_Init(&hadc3) != HAL_OK)

 {

  Error_Handler();

 }

 /** Configure Regular Channel

 */

 sConfig.Channel = ADC_CHANNEL_VBAT;

 sConfig.Rank = ADC_REGULAR_RANK_1;

 sConfig.SamplingTime = ADC_SAMPLETIME_387CYCLES_5;

 sConfig.SingleDiff = ADC_SINGLE_ENDED;

 sConfig.OffsetNumber = ADC_OFFSET_1;

 sConfig.Offset = 0;

 sConfig.OffsetRightShift = DISABLE;

 sConfig.OffsetSignedSaturation = DISABLE;

 if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)

 {

  Error_Handler();

 }

 /** Configure Regular Channel

 */

 sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;

 sConfig.Rank = ADC_REGULAR_RANK_2;

 sConfig.Offset = 1;

 if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)

 {

  Error_Handler();

 }

 /** Configure Regular Channel

 */

 sConfig.Channel = ADC_CHANNEL_VREFINT;

 sConfig.Rank = ADC_REGULAR_RANK_3;

 sConfig.Offset = 2;

 if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)

 {

  Error_Handler();

 }

}

0 REPLIES 0