Skip to main content
Associate
October 7, 2024
Question

STM32L031F4 power consumption too high

Hello,

I have a project that uses the STM32L031F4. I need the board to have the current under 1mA whilst running. However, I cannot get the current this low, even according to the data sheet, the max current consumption for Vcore=1.2V should be 0.2mA.

To test the minimum current for the board, I have set up the following:

  • Using the MSI oscillator as the system clock.
  • Configured MSI for range1 (131.072kHz).
  • Set Vcore to 1.2V
  • Set SLEEP_PD in FLASH_ACR register to switch of Flash while asleep.
  • LPRUN and LPSDSR bits set in PWR_CR
  • Set SLEEPDEEP bit in system control register (to stop the MCU)
  •  PDDS bit=0 and WUF bit =0 in PWR_CR.
  • Timer2 clock is enabled.

Is there anything I am missing on how to reduce the current consumption?

Regards

Alvin

This topic has been closed for replies.

4 replies

MM..1
Super User
October 7, 2024

Check you dont enable debug in lowpower modes or turn power after flash loaded completely off and measure turn on without debuger stlink connected.

Andrew Neil
Super User
October 7, 2024

@Alvanicus wrote:

Is there anything I am missing


You haven't said anything about what else is on the board besides the STM32L031F4.

post your schematic, and show your code:

https://community.st.com/t5/community-guidelines/how-to-write-your-question-to-maximize-your-chances-to-find-a/ta-p/575228

 

A complex system that works is invariably found to have evolved from a simple system that worked.A complex system designed from scratch never works and cannot be patched up to make it work.
AlvanicusAuthor
Associate
October 8, 2024

Thanks for your reply.

The code for the project is in Pascal. I have not implemented any of the features for the project yet. I just wanted to see the minimum current consumption of the board, so I could then work with that. Even though I have initialized the timer, I have not implemented the interrupt yet.

begin
 { Initialise MCU port pins }
 InitGPIO();
 
 { Change MSI clock range to range 1 - 131.072kHz }
 RCC_ICSCR.MSIRANGE0 := 1;
 RCC_ICSCR.MSIRANGE1 := 0;
 RCC_ICSCR.MSIRANGE2 := 0;
 
 { Set low power mode }
 PWR_CR.LPDS := 1;
 PWR_CR.LPRUN := 1;

 { Disable Flash while asleep }
 FLASH_ACR.SLEEP_PD := 1;
 
 { Enable STOP }
 SCB_CCR.SLEEPDEEP := 1;
 PWR_CR := 0;
 PWR_CR.WUF := 0;
 RCC_CFGR.STOPWUCK := 0;

 { Initialise sleep timer }
 InitTimer();
 
 { Turn LEDs off }
 RedLed := 1;
 BlueLed := 1;
 GreenLed := 1;
 
 while (true) do
 begin
 asm
 wfi;
 end;
 end;
end;

procedure InitGPIO( );
begin
 GPIO_Analog_Input ( @GPIOA_BASE, _GPIO_PINMASK_0 ); // Line monitor ADC.
 GPIO_Analog_Input ( @GPIOA_BASE, _GPIO_PINMASK_1 ); // Line state ADC.
 GPIO_Digital_Output( @GPIOA_BASE, _GPIO_PINMASK_2 ); // Call Line pin.
 GPIO_Digital_Output( @GPIOA_BASE, _GPIO_PINMASK_3 ); // Blue LED
 GPIO_Digital_Output( @GPIOA_BASE, _GPIO_PINMASK_4 ); // Red LED
 GPIO_Digital_Output( @GPIOA_BASE, _GPIO_PINMASK_5 ); // Green LED
 GPIO_Digital_Output( @GPIOA_BASE, _GPIO_PINMASK_6 ); // EOL
 
 GPIO_Digital_Output( @GPIOA_BASE, _GPIO_PINMASK_9 ); // TX
 GPIO_Digital_Input ( @GPIOA_BASE, _GPIO_PINMASK_10 ); //RX

 { Monitoring enable switch }
 GPIO_Config( @GPIOB_BASE, _GPIO_PINMASK_1, _GPIO_CFG_DIGITAL_INPUT or _GPIO_CFG_PULL_UP );

 { Status LED Colour when active }
 GPIO_Config( @GPIOC_BASE, _GPIO_PINMASK_14, _GPIO_CFG_DIGITAL_INPUT or _GPIO_CFG_PULL_UP );
 
 { Normally open/closed switch }
 GPIO_Config( @GPIOC_BASE, _GPIO_PINMASK_15, _GPIO_CFG_DIGITAL_INPUT or _GPIO_CFG_PULL_UP );
end;

procedure InitTimer( );
begin
 { Enable clock power }
 RCC_APB1ENR.TIM2EN := 1;

 { Disable timer before configuring it }
 TIM2_CR1.CEN := 0;

 { Clear the update event flags }
 TIM2_SR := 0;

 { Set timer }
 TIM2_PSC := 499;
 TIM2_ARR := 999;

 NVIC_IntEnable(IVT_INT_TIM2); // Enable timer interrupt
 TIM2_DIER.UIE := 1; // Update interrupt enable
 TIM2_CR1.CEN := 1; // Enable timer
end;

 Even th 

MM..1
Super User
October 8, 2024

On normal physics law is irelevant how speed you do job, energy will constant. Then on MCU is better balance short high speed jobs with long total stop mode, instead slow continuos exec...

And from your code you set STOP mode but first wake end it and newer start back.