cancel
Showing results for 
Search instead for 
Did you mean: 

STM32G031K8 consumes 100uA in Stop1 mode

levantg
Associate II

Hi,

I am currently working on the firmware of a PCB with an STM32G031K8T6 as the MCU, supplied by a 1.8V voltage.

When I enter Stop 1 mode, the consumption of the MCU drops to 100uA, instead of the 7uA stated in the datasheet.

The app_stop function is as follows :

void app_stop(void)
{
    timer_uninit();
    i2c_slave_uninit();
    i2c_master_uninit();
    gpio_stop_mode();
    HAL_SuspendTick();
    SystemClock_Config_StopMode();
    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
}

void gpio_stop_mode(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;

    GPIO_InitStruct.Pin = GPIO_PIN_All;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_All;
    GPIO_InitStruct.Pin &= ~(GPIO_WAKEUP_PIN);
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    __HAL_RCC_GPIOB_CLK_DISABLE();
    __HAL_RCC_GPIOC_CLK_DISABLE();
}

uint8_t timer_uninit(void)
{
    timer_off();
    return HAL_TIM_Base_DeInit(&timer_handler);
}

uint8_t timer_off(void)
{
    if(timer_handler.Instance != 0)
    {
        int irq_status = (timer_handler.Instance->DIER & TIM_IT_UPDATE) ? 1 : 0;
        HAL_TIM_Base_Stop_IT(&timer_handler);
        return irq_status;
    }
    return 0;
}

uint8_t i2c_slave_uninit(void)
{
    return HAL_I2C_DeInit(&i2c_slave_handler);
}

uint8_t i2c_master_uninit(void)
{
    return HAL_I2C_DeInit(&i2c_master_handler);
}

void SystemClock_Config_StopMode(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    //RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

    /** Initializes the RCC Oscillators according to the specified parameters
    * in the RCC_OscInitTypeDef structure.
    */
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI;
    RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_OFF;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_NONE;
    HAL_RCC_OscConfig(&RCC_OscInitStruct);
    /** Initializes the CPU, AHB and APB buses clocks
    */
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                  | RCC_CLOCKTYPE_PCLK1;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_LSI;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);

    /** Configure the main internal regulator output voltage
    */
    HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE2);
}

 I checked all the IO levels, non of them are drawing current through a pull resistor.The SWD probe is removed.

Could you please tell me what I am missing ?

 

Best regards,

21 REPLIES 21

Hi @Gyessine ,

 

I finally managed to download you zip file. I compiled the project and programmed the MCU on my PCB with it, and the consumption falls to 2.7uA. 

Then I copied the main and the SystemClock_Config functions into my project, recompiled and programmed it on the STM32, which brought back the consumption to roughly 100uA.

The HAL_Init functions are the same for both projects as well.

In the makefile of my project -Os and -g3 options are used, could it make a difference ?

Best regards,

Gyessine
ST Employee

Hello @levantg 
I don't think it's a problem about make file configuration
I noticed that you are using LSI as clock source while the provided project using HSI
with HSI I did not find any problems.
the reference manual stated that when using LSI to enter stop mode you should enable the clock individually by using this line of code

 /* USER CODE BEGIN 2 */
  __HAL_RCC_LSI_ENABLE();

  /* USER CODE END 2 */

using LSI or LSE without that line of code will not make the stm32 able to enter stop mode 

Gyessine_1-1767866476863.png

you can try this code sequence

 /* USER CODE BEGIN 2 */
  __HAL_RCC_LSI_ENABLE();

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  HAL_Delay(2000);
	  	  HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
  }
  /* USER CODE END 3 */
}

 if it did not solve your issue return to us with feedback
Hope that solved your problem, if yes please accept it as solution to make it visible for other users
Gyessine

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.