Hi, I am using the below function to enter low power mode in STM32L152, but yet the current consumption of MCU is about 4 mA. is there other configurations?
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE); PWR_EnterLowPowerRunMode(ENABLE);
The clock settings is as follows:
*============================================================================= * System Clock Configuration *============================================================================= * System Clock source | MSI(Range0) *----------------------------------------------------------------------------- * SYSCLK | 65000 Hz *----------------------------------------------------------------------------- * HCLK | 65000 Hz *----------------------------------------------------------------------------- * AHB Prescaler | 1 *----------------------------------------------------------------------------- * APB1 Prescaler | 1 *----------------------------------------------------------------------------- * APB2 Prescaler | 1 *----------------------------------------------------------------------------- * HSE Frequency | 8000000 Hz *----------------------------------------------------------------------------- * PLL DIV | Not Used *----------------------------------------------------------------------------- * PLL MUL | Not Used *----------------------------------------------------------------------------- * VDD | 3.3 V *----------------------------------------------------------------------------- * Vcore | 1.2 V (Range 3) *----------------------------------------------------------------------------- * Flash Latency | 0 WS *----------------------------------------------------------------------------- * Require 48MHz for USB clock | Disabled *----------------------------------------------------------------------------- *=============================================================================
and in main.c :
int main(void) { SystemInit(); SystemCoreClockUpdate(); /* Configure all GPIO as analog to reduce current consumption on non used IOs */ /* Enable GPIOs clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOD | RCC_AHBPeriph_GPIOE | RCC_AHBPeriph_GPIOH | RCC_AHBPeriph_GPIOF | RCC_AHBPeriph_GPIOG, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_Init(GPIOH, &GPIO_InitStructure); GPIO_Init(GPIOF, &GPIO_InitStructure); GPIO_Init(GPIOG, &GPIO_InitStructure); GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_Init(GPIOB, &GPIO_InitStructure); /* Disable GPIOs clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOD | RCC_AHBPeriph_GPIOE | RCC_AHBPeriph_GPIOH | RCC_AHBPeriph_GPIOF | RCC_AHBPeriph_GPIOG, DISABLE); PWR_EnterLowPowerRunMode(ENABLE); /* Wait until the system enters RUN LP and the Regulator is in LP mode */ while(PWR_GetFlagStatus(PWR_FLAG_REGLP) == RESET) { } while(1) { }
I don't work with your processor.
But if the current is the same when you change the amount of instructions/second your processor runs, then your issue isn't dynamic consumption but static consumption. So you have to investigate what sources you have of static consumption. It's enough with a single processor pin that fights something to consume 4mA. Next thing is that you normally don't want to busy-loop a processor when you want lowest power. You want to sleep it and only wake up for interrupts. Then directly send it back to sleep again. Remember that a while loop does nothing useful, but still forces the processor to tick instructions at the maximum speed the clock allows - that's wasted energy when the program might just need to wake once/second or if a specific GPIO pin changes state.
What current are you measuring where?
On the L1-DISCO board you should be most interested in the JP1 jumper, at that point you've partitioned the chip from the ST-LINK and other circuitry. Measuring the current drawn on the 5V rail on the backside of the regulator is probably not going to provide useful numbers.
You should probably more selective in your GPIO configuration so as not to break the debugger connection. Although having the debugger attached is going to skew the results.
As noted, the low power current should not be measured with any JTAG interface connected.
Next thing is that it's important to select a proper voltage regulator. A normal voltage regulator can have quite high idle current because it's designed to have good load regulation, i.e. very little output voltage variation if you draw 1mA or if you draw 1000mA. A voltage regulator for low-energy battery operation need not have as good load regulation - but must instead have a very, very low idle current so you don't get the majority of the power consumption in the regulator itself.