AnsweredAssumed Answered

STM32l052 Vrefint 2048 problem

Question asked by Baev.Alexander on Sep 18, 2015
Hi.
I try to measure internal voltage and temperature. The first measurement of the both is good. In all the others voltage is 2048, while temperature is ok.
The controller uses MSI 2000000MHz.
The measurement occurs once in a minute (interrupt from RTC).
Here is the ADC initialization.
void MX_ADC_Init(void)
{

  ADC_ChannelConfTypeDef sConfig;

 
  hadc.Instance = ADC1;
  hadc.Init.OversamplingMode = DISABLE;
  hadc.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2;
  hadc.Init.Resolution = ADC_RESOLUTION12b;
  hadc.Init.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
  hadc.Init.ScanDirection = ADC_SCAN_DIRECTION_UPWARD;
  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc.Init.ContinuousConvMode = DISABLE;
  hadc.Init.DiscontinuousConvMode = DISABLE;
  hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIG_EDGE_NONE;
  hadc.Init.DMAContinuousRequests = DISABLE;
  hadc.Init.EOCSelection = EOC_SINGLE_CONV;
  hadc.Init.Overrun = OVR_DATA_OVERWRITTEN;
  hadc.Init.LowPowerAutoWait = DISABLE;
  hadc.Init.LowPowerFrequencyMode = DISABLE;
  hadc.Init.LowPowerAutoOff = DISABLE;
  HAL_ADC_Init(&hadc);

  sConfig.Channel = ADC_CHANNEL_TEMPSENSOR | ADC_CHANNEL_VREFINT;
  HAL_ADC_ConfigChannel(&hadc, &sConfig);
}

Here is the measurement part:

  ADC1->CR |= ADC_CR_ADSTART;
  while ((ADC1->ISR & ADC_ISR_EOC) == 0); /* Wait end of conversion */
  V_measured = hadc.Instance->DR;
  while ((ADC1->ISR & ADC_ISR_EOC) == 0);
  T_measured = hadc.Instance->DR;

The calibration is present and ok.
Why the value of Vrefint always measures as 2048?

Outcomes