2024-10-07 08:23 AM
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:
Is there anything I am missing on how to reduce the current consumption?
Regards
Alvin
2024-10-07 08:27 AM
Check you dont enable debug in lowpower modes or turn power after flash loaded completely off and measure turn on without debuger stlink connected.
2024-10-07 08:29 AM
@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:
2024-10-08 12:47 AM
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
2024-10-08 01:19 AM - edited 2024-10-08 01:22 AM
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.