Skip to main content
Associate
February 17, 2026
Question

ADC is definitely working, but variable is not changing its value in live expression window

  • February 17, 2026
  • 3 replies
  • 193 views

Hi everyone,

I'm relatively new to STM32 and I'm running into a confusing issue with the debugger in STM32CubeIDE.

I have a simple while loop where I read an ADC value (potentiometer) and use that value as the delay time for a blinking LED.

The code is definitely working physically. When I turn the potentiometer, the LED blinks faster or slower accordingly. This confirms `HAL_ADC_GetValue` is returning a changing value.

When I run the code in Debug mode and look at my variable (adcDeger) in the live expressions tab, it is stuck at 0. It never updates, even though the LED behavior proves the value is changing.

My variable is global and volatile (dont mind the printf i was trying to write the value to console):

#include "main.h"
#include "stdio.h"
#include "string.h"

ADC_HandleTypeDef hadc1;

volatile uint32_t adcDeger = 0;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);

int _write(int file, char *ptr, int len) {
 int DataIdx;
 for (DataIdx = 0; DataIdx < len; DataIdx++) {
 ITM_SendChar(*ptr++);
 }
 return len;
}

int main(void)
{
 HAL_Init();
 SystemClock_Config();
 MX_GPIO_Init();
 MX_ADC1_Init();

 while (1)
 {
 HAL_ADC_Start(&hadc1);

 if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK){
 uint32_t adcValue = HAL_ADC_GetValue(&hadc1);

 HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12|GPIO_PIN_14|GPIO_PIN_15);

 HAL_Delay(adcValue);
 adcDeger = HAL_ADC_GetValue(&hadc1);

 HAL_ADC_Stop(&hadc1);
 printf("ADC Value: %lu\n", adcDeger);
 }
 }
}

void SystemClock_Config(void)
{
 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

 __HAL_RCC_PWR_CLK_ENABLE();
 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
 {
 Error_Handler();
 }

 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
 |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
 {
 Error_Handler();
 }
}

static void MX_ADC1_Init(void)
{
 ADC_ChannelConfTypeDef sConfig = {0};

 hadc1.Instance = ADC1;
 hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
 hadc1.Init.Resolution = ADC_RESOLUTION_12B;
 hadc1.Init.ScanConvMode = DISABLE;
 hadc1.Init.ContinuousConvMode = ENABLE;
 hadc1.Init.DiscontinuousConvMode = DISABLE;
 hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
 hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
 hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
 hadc1.Init.NbrOfConversion = 1;
 hadc1.Init.DMAContinuousRequests = DISABLE;
 hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
 if (HAL_ADC_Init(&hadc1) != HAL_OK)
 {
 Error_Handler();
 }

 sConfig.Channel = ADC_CHANNEL_0;
 sConfig.Rank = 1;
 sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
 {
 Error_Handler();
 }
}

static void MX_GPIO_Init(void)
{
 GPIO_InitTypeDef GPIO_InitStruct = {0};

 __HAL_RCC_GPIOH_CLK_ENABLE();
 __HAL_RCC_GPIOA_CLK_ENABLE();
 __HAL_RCC_GPIOD_CLK_ENABLE();

 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET);

 GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}

void Error_Handler(void)
{
 __disable_irq();
 while (1)
 {
 }
}

#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif

3 replies

Associate
February 17, 2026

Also, I can see the correct value for a split second when I am starting a debug.

Associate
February 17, 2026

my issue is that live expressions wont update in real time, it shows the correct value when i remove and add the variable again, no idea how to fix it lol

TDK
Super User
February 17, 2026

Live expressions have always been buggy like this. It probably won't ever be fixed.

"If you feel a post has answered your question, please click ""Accept as Solution""."