cancel
Showing results for 
Search instead for 
Did you mean: 

Need help getting ADC to work with CubeMX HAL v1.13.0 on STM32L4R5

mande.274
Associate

Hi,

We are having issues getting the ADC to work on our STM32L4R5 MCU using the CubeMX HAL. We are trying to read VREFINT, but cannot get a value other than 0xFFF to be returned from the ADC. No errors are reported from HAL_ADC_Start, HAL_ADC_PollForConversion, or HAL_ADC_Stop. Can anyone suggest what we are doing wrong? We have tried lots of different options but cannot get a value other than 0xFFF.

The relevant code is as follows:

MCU: STM32l4R5QIIx

Cube FW Package: V1.13.0

Clock:

void SystemClock_Config(void)

{

 RCC_OscInitTypeDef RCC_OscInitStruct = {0};

 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

 RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

 /** Configure the main internal regulator output voltage 

 */

 if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1_BOOST) != HAL_OK)

 {

  Error_Handler();

 }

 /** Configure LSE Drive Capability 

 */

 HAL_PWR_EnableBkUpAccess();

 __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);

 /** Initializes the CPU, AHB and APB busses clocks 

 */

 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI

               |RCC_OSCILLATORTYPE_LSE;

 RCC_OscInitStruct.LSEState = RCC_LSE_ON;

 RCC_OscInitStruct.HSIState = RCC_HSI_ON;

 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

 RCC_OscInitStruct.LSIState = RCC_LSI_ON;

 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;

 RCC_OscInitStruct.PLL.PLLM = 2;

 RCC_OscInitStruct.PLL.PLLN = 30;

 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;

 RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV4;

 RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;

 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

 {

  Error_Handler();

 }

 /** Initializes the CPU, AHB and APB busses clocks 

 */

 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV8;

 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)

 {

  Error_Handler();

 }

 PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1

               |RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_USART3

               |RCC_PERIPHCLK_UART4|RCC_PERIPHCLK_LPUART1

               |RCC_PERIPHCLK_LPTIM1|RCC_PERIPHCLK_I2C1

               |RCC_PERIPHCLK_I2C2|RCC_PERIPHCLK_RNG

               |RCC_PERIPHCLK_ADC|RCC_PERIPHCLK_OSPI;

 PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_SYSCLK;

 PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_SYSCLK;

 PeriphClkInit.Usart3ClockSelection = RCC_USART3CLKSOURCE_SYSCLK;

 PeriphClkInit.Uart4ClockSelection = RCC_UART4CLKSOURCE_SYSCLK;

 PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_HSI;

 PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1;

 PeriphClkInit.I2c2ClockSelection = RCC_I2C2CLKSOURCE_PCLK1;

 PeriphClkInit.Lptim1ClockSelection = RCC_LPTIM1CLKSOURCE_LSE;

 PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_PLLSAI1;

 PeriphClkInit.OspiClockSelection = RCC_OSPICLKSOURCE_PLL;

 PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;

 PeriphClkInit.RngClockSelection = RCC_RNGCLKSOURCE_PLLSAI1;

 PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_HSI;

 PeriphClkInit.PLLSAI1.PLLSAI1M = 2;

 PeriphClkInit.PLLSAI1.PLLSAI1N = 20;

 PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV2;

 PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV4;

 PeriphClkInit.PLLSAI1.PLLSAI1R = RCC_PLLR_DIV2;

 PeriphClkInit.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_48M2CLK|RCC_PLLSAI1_ADC1CLK;

 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)

 {

  Error_Handler();

 }

}

ADC Init:

static void MX_ADC1_Init(void)

{

 /* USER CODE BEGIN ADC1_Init 0 */

 HAL_ADC_MspInit(&hadc1);

 /* USER CODE END ADC1_Init 0 */

 ADC_ChannelConfTypeDef sConfig = {0};

 /* USER CODE BEGIN ADC1_Init 1 */

 /* USER CODE END ADC1_Init 1 */

 /** Common config 

 */

 hadc1.Instance = ADC1;

 hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;

 hadc1.Init.Resolution = ADC_RESOLUTION_12B;

 hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;

 hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;

 hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;

 hadc1.Init.LowPowerAutoWait = DISABLE;

 hadc1.Init.ContinuousConvMode = DISABLE;

 hadc1.Init.NbrOfConversion = 1;

 hadc1.Init.DiscontinuousConvMode = DISABLE;

 hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;

 hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;

 hadc1.Init.DMAContinuousRequests = DISABLE;

 hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;

 hadc1.Init.OversamplingMode = DISABLE;

 if (HAL_ADC_Init(&hadc1) != HAL_OK)

 {

  Error_Handler();

 }

 /** Configure Regular Channel 

 */

 sConfig.Channel = ADC_CHANNEL_VREFINT;

 sConfig.Rank = ADC_REGULAR_RANK_1;

 sConfig.SamplingTime = ADC_SAMPLETIME_247CYCLES_5;

 sConfig.SingleDiff = ADC_SINGLE_ENDED;

 sConfig.OffsetNumber = ADC_OFFSET_NONE;

 sConfig.Offset = 0;

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

 {

  Error_Handler();

 }

 /* USER CODE BEGIN ADC1_Init 2 */

 while(HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED) != HAL_OK);

 /* USER CODE END ADC1_Init 2 */

}

Code to read the ADC:

uint32_t ADC_read(void)

{

 uint32_t adc_value = 0;

 hadc1.Instance->DIFSEL = 0;

 HAL_ADC_MspInit(&hadc1);

 HAL_StatusTypeDef res;

 res = HAL_ADC_Start(&hadc1);

 if (res != HAL_OK)

 {

  log_error("failed to start ADC for VREF %d", res);

  return 0;

 }

 res = HAL_ADC_PollForConversion(&hadc1, 50000);

 if (res != HAL_OK)

 {

  log_error("failed to acquire VREF voltage %d", res);

  return 0;

 }

 adc_value = HAL_ADC_GetValue(&hadc1);

 res = HAL_ADC_Stop(&hadc1);

 if (res != HAL_OK)

 {

  log_error("failed to stop ADC %d", res);

  return 0;

 }

 HAL_ADC_MspDeInit(&hadc1);

 log_info("ADC: 0x%08x", adc_value);

 return adc_value;

};

0 REPLIES 0