Dear Friends,
I am very interested to achieve low power consumption in STM32L152VD. So far, I followed the STM32L-Discovery board program written in Keil. My board which has only MCU soldered on it consumes 330 uA in low power sleep mode. I want to achieve consumption of few uA. I put the program code in below:
RCC_Configuration(); PWR_VoltageScalingConfig(PWR_VoltageScaling_Range1); /* Wait Until the Voltage Regulator is ready */ while (PWR_GetFlagStatus(PWR_FLAG_VOS) != RESET) ; /* Init I/O ports */ Init_GPIOs(); GPIO_LowPower_Config(); PWR_FastWakeUpCmd(DISABLE); Config_RCC(&SavRCC); SysTick->CTRL = 0; SetHSICLKToMSI(RCC_MSIRange_0,DIV2,NoRTC) ; disableInterrupts(); EnterLPSLEEPModeRAM(); enableInterrupts(); PWR_EnterSleepMode(PWR_Regulator_LowPower,PWR_SLEEPEntry_WFI);
void GPIO_LowPower_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Configure all GPIO port pins in Analog Input mode (floating input trigger OFF) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIOA->MODER = 0xFFFFFFFF; GPIOB->MODER = 0xFFFFFFFF; GPIOC->MODER = 0xFFFFFFFF; GPIOD->MODER = 0xFFFFFFFF; GPIOE->MODER = 0xFFFFFFFF; GPIOH->MODER = 0xFFFFFFFF; GPIOA->PUPDR=0x0; GPIOB->PUPDR=0x0; GPIOC->PUPDR=0x0; GPIOD->PUPDR=0x0; GPIOE->PUPDR=0x0; GPIOH->PUPDR=0x0; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_Init(GPIOE, &GPIO_InitStructure); }
void Config_RCC(RCC_TypeDef *sav_RCC) { /* To save the RCC configuration registers */ sav_RCC->AHBENR = RCC->AHBENR; sav_RCC->APB1ENR = RCC->APB1ENR; sav_RCC->APB2ENR = RCC->APB2ENR; sav_RCC->AHBLPENR = RCC->AHBLPENR; sav_RCC->APB1LPENR = RCC->APB1LPENR; sav_RCC->APB2LPENR = RCC->APB2LPENR; /* And set low power configuration */ RCC->AHBENR = 0x0;//0x05; // Ports A and C enable RCC->AHBLPENR =0x0;// 0x05; RCC->APB1ENR = RCC_APB1ENR_PWREN; // PWR management enable RCC->APB2ENR = 0; }
RAMFUNC void EnterLPSLEEPModeRAM(void) { uint32_t tmpreg = 0; RAM_FLASH_RUNPowerDownCmd(ENABLE); RAM_PWR_LowPowerRunModeCmd(ENABLE); /* The application Run with delay */ // GPIO_LOW(CTN_GPIO_PORT,CTN_CNTEN_GPIO_PIN); /* Select the regulator state in Sleep mode ---------------------------------*/ tmpreg = PWR->CR; /* Clear PDDS and LPDSR bits */ tmpreg &= CR_DS_MASK; /* Set LPDSR bit according to PWR_Regulator value */ tmpreg |= PWR_Regulator_LowPower; /* Store the new value */ PWR->CR = tmpreg; /* Clear SLEEPDEEP bit of Cortex System Control Register */ SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP); /* Request Wait For Event */ __WFE(); /* __ASM ("wfe"); */ /* __TEST KEIL */ RAM_FLASH_RUNPowerDownCmd(DISABLE); RAM_PWR_LowPowerRunModeCmd(DISABLE); }
where do you think 300uA is being consumed?