cancel
Showing results for 
Search instead for 
Did you mean: 

Standby mode current consumption is not reduced to expected value

Sagar Nayak
Associate II
Posted on August 29, 2017 at 15:52

Hello everyone, I am trying to measure the current consumption in STM32L011F4 microcontroller. I tried the STANDBY mode sample code provide by STM in 'stm32cubel0'. Standby mode current consumption is about 320�A when I measured it using a multimeter. The datasheet says that the maximum current consumption is 0.6�A for temperature between -40�C to 25�C with Independent watchdog and LSI OFF. The code is shown below. Does anyone have an idea why the current consumption is more that expected?

int main(void)

{

  /* STM32L0xx HAL library initialization */

  HAL_Init();

  /* Configure the system clock to 2 MHz */

  SystemClock_Config();

  /* System Power Configuration */

  SystemPower_Config()  ;

 

  /* Check if the system was resumed from Standby mode */

  if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)

  {

    /* Clear Standby flag */

    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);

  }

  /* Insert 5 seconds delay */

  HAL_Delay(5000);

 /* The Following Wakeup sequence is highly recommended prior to each Standby mode entry

    mainly when using more than one wakeup source this is to not miss any wakeup event.

     - Disable all used wakeup sources,

     - Clear all related wakeup flags,

     - Re-enable all used wakeup sources,

     - Enter the Standby mode.

  */

  /* Disable all used wakeup sources: PWR_WAKEUP_PIN3 */

  HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN3);

  /* Clear all related wakeup flags*/

  __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);

    

  /* Enable WakeUp Pin PWR_WAKEUP_PIN3 connected to PA.02 (Arduino A7) */

  HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN3);

  /* Enter the Standby mode */

  HAL_PWR_EnterSTANDBYMode();

  /* This code will never be reached! */

  while (1)

  {

  }

}

/**

  * @brief  System Clock Configuration

  *         The system Clock is configured as follow :

  *            System Clock source            = MSI

  *            SYSCLK(Hz)                     = 2000000

  *            HCLK(Hz)                       = 2000000

  *            AHB Prescaler                  = 1

  *            APB1 Prescaler                 = 1

  *            APB2 Prescaler                 = 1

  *            Flash Latency(WS)              = 0

  *            Main regulator output voltage  = Scale3 mode

  * @retval None

  */

void SystemClock_Config(void)

{

  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  RCC_OscInitTypeDef RCC_OscInitStruct = {0};

 

  /* Enable MSI Oscillator */

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;

  RCC_OscInitStruct.MSIState = RCC_MSI_ON;

  RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_5;

  RCC_OscInitStruct.MSICalibrationValue=0x00;

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK)

  {

    /* Initialization Error */

    while(1);

  }

 

  /* Select MSI as system clock source and configure the HCLK, PCLK1 and PCLK2

     clocks dividers */

  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK |  RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;

  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)

  {

    /* Initialization Error */

    while(1);

  }

  /* Enable Power Control clock */

  __HAL_RCC_PWR_CLK_ENABLE();

 

  /* The voltage scaling allows optimizing the power consumption when the device is

     clocked below the maximum system frequency, to update the voltage scaling value

     regarding system frequency refer to product datasheet.  */

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);

 

  /* Disable Power Control clock */

  __HAL_RCC_PWR_CLK_DISABLE();

 

}

/**

  * @brief  System Power Configuration

  *         The system Power is configured as follow :

  *            + VREFINT OFF, with fast wakeup enabled

  *            + No IWDG

  *            + Wakeup using PWR_WAKEUP_PIN3

  * @param None

  * @retval None

  */

static void SystemPower_Config(void)

{

  /* Enable Power Control clock */

  __HAL_RCC_PWR_CLK_ENABLE();

  /* Enable Ultra low power mode */

  HAL_PWREx_EnableUltraLowPower();

 

  /* Enable the fast wake up from Ultra low power mode */

  HAL_PWREx_EnableFastWakeUp();

}

#current-consumption #stm32 #stm32l0 #standby-mode
4 REPLIES 4
Jaroslav BECKA
ST Employee
Posted on August 29, 2017 at 18:43

Hello Sagar,

try not to enable the WKUP pin and measure the power consumption once again.

In order to do that you can comment the following line in the code:

  /* Enable WakeUp Pin PWR_WAKEUP_PIN3 connected to PA.02 (Arduino A7) */

  HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN3);

Does it have any impact on the power consumption?

Posted on August 29, 2017 at 19:06

Hello Jaroslav,

Thank you for your suggestion. I have tried not to enable the WKUP pin and measure the power consumption once again. But I still get the same current consumption of 320µA. WKUP pin has not impact

on the power consumption

.
Posted on August 30, 2017 at 17:04

Hi Sagar,

Do you run the binary code from the debugger? The Debug MCU configuration register may have a value that prevents a real entry in STANDBY mode for debug purpose (in particular DBG_STANDBY bit that may keep some clock on and keep some part being powered). See Reference manual

http://www.st.com/content/ccc/resource/technical/document/reference_manual/21/bd/0f/bd/1c/88/40/f0/DM00108282.pdf/files/DM00108282.pdf/jcr:content/translations/en.DM00108282.pdf

§ 27.9.1 Debug support for low-power modes.

I would recommend to run power consumption tests outside of the debugger.

In order to reach the maximum power saving, you might have to modify the sample code e.g. configure all IOs in analog input mode, set the ULP bit (see RM0377 §

6.2.4 Internal voltage reference), etc.

Also, can you make sure to have PA.02 being connected to GND to avoid unexpected exit from STANDBY mode? Can you make the LED blinking if you exit from STANDBY just to make sure that there is no wakeup from STANDBY? (In the latest STM32Cube_FW_L0_V1.9.0\Projects\STM32L011K4-Nucleo\Examples\PWR\PWR_STANDBY, the LED3 is on during 200ms when resuming from STANDBY. I would suggest to rebase on FW L0 V1.9.0 or newer).

I've done some tests on Nucleo-L011K4: Idd in STANDBY mode is aligned with Datasheet typical value (0.23µA @25°C). Note: 0.6µA is the max value, not the typical one.

Rgds

Bruno

In order 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.
Posted on August 31, 2017 at 15:13

Hi Bruno,

Thank you for your useful suggestions. I am doing measurements for STM32L011F4 microcontroller on a PCB. I have an accelerometer and RFID IC on the PCB and measurements are done without isolating the microcontroller. Turning on/off of the RFID is controlled by the microcontroller's GPIO. So it has no effect on current consumption. LED blinking is not possible since I do not have an LED on the PCB. I am using ST-LINK/V2 (an in-circuit debugger and programmer) for debugging and loading the program. I removed the wires connecting to ST-LINK/V2 and the current consumption reduced to 2.8µA which is great! I will try to configure all IOs in analog input mode, set the ULP bit and see if there are improvements.