Current consumption of MCU is still around 2-3mA which cannot be right......Datasheet suggests around 500uA when HSI is 16Mhz with PLL off and Peripherals disabled.
Heres the console code that puts it to sleep.
Code: Select all
static void cmd_sleep(BaseSequentialStream *chp, int argc, char *argv[]) {
int i;
char cmd[20];
msg_t result;
char *response;
(void)argv;
if (argc > 0)
{
if (strstr(argv[0], "zzz") != NULL)
{
/* Switch off the gsm modem */
result = modemTakeAccess(MS2ST( 20000 ));
if( result != MSG_OK )
{
chprintf(chp, "gsm access err\r\n");
return;
}
else
{
chsnprintf(cmd, sizeof(cmd),
"%s\r", "at+qpowd=0;");
response = modemExecCommand(cmd, 3 );
if( strstr( response, "OK" ) != NULL )
{
chprintf(chp, "gsm powered off\r\n");
/* Disable the power to the gnss */
palSetPad( GPIOE, GPIOE_GNSS_PWR );
chprintf(chp, "gnss powered off\r\n");
/* Configure exti to events mode */
extiConfigLowPowerMode();
chprintf( chp, "setup exti event\r\n" );
/* Set alarm to wakup in 60 seconds */
clkAlarmSet( ALMMUL_SEC, 60 );
chprintf( chp, "alarm wakeup 60s\r\n" );
chThdSleepMilliseconds(1000);
chprintf(chp, "Entering sleep zzz \r\n");
chThdSleepMilliseconds(1000);
/* Set all I/O pins to Analog inputs */
for( i = 0; i < 16; i++ )
{
palSetPadMode( GPIOA, i,
PAL_MODE_INPUT_ANALOG );
palSetPadMode( GPIOB, i,
PAL_MODE_INPUT_ANALOG );
palSetPadMode( GPIOC, i,
PAL_MODE_INPUT_ANALOG );
palSetPadMode( GPIOD, i,
PAL_MODE_INPUT_ANALOG );
palSetPadMode( GPIOE, i,
PAL_MODE_INPUT_ANALOG );
palSetPadMode( GPIOH, ( i % 2 ),
PAL_MODE_INPUT_ANALOG );
}
/* disable clock sources on the buses */
RCC->AHB2ENR &= ~( RCC_AHB2ENR_OTGFSEN );
RCC->APB1ENR &= ~( RCC_APB1ENR_TIM2EN | \
RCC_APB1ENR_TIM3EN | \
RCC_APB1ENR_TIM4EN | \
RCC_APB1ENR_TIM5EN | \
RCC_APB1ENR_WWDGEN | \
RCC_APB1ENR_SPI2EN | \
RCC_APB1ENR_SPI3EN | \
RCC_APB1ENR_I2C1EN | \
RCC_APB1ENR_I2C2EN | \
RCC_APB1ENR_I2C3EN | \
RCC_APB1ENR_USART2EN );
RCC->AHB1ENR &= ~( RCC_AHB1ENR_DMA1EN | \
RCC_AHB1ENR_DMA2EN | \
RCC_AHB1ENR_GPIOAEN | \
RCC_AHB1ENR_GPIOBEN | \
RCC_AHB1ENR_GPIOCEN | \
RCC_AHB1ENR_GPIODEN | \
RCC_AHB1ENR_GPIOEEN | \
RCC_AHB1ENR_GPIOHEN );
RCC->APB2ENR &= ~( RCC_APB2ENR_TIM1EN | \
RCC_APB2ENR_ADC1EN | \
RCC_APB2ENR_SDIOEN | \
RCC_APB2ENR_SPI1EN | \
RCC_APB2ENR_SPI4EN | \
RCC_APB2ENR_SPI5EN | \
RCC_APB2ENR_TIM9EN | \
RCC_APB2ENR_TIM10EN | \
RCC_APB2ENR_TIM11EN | \
RCC_APB2ENR_SYSCFGEN | \
RCC_APB2ENR_USART1EN | \
RCC_APB2ENR_USART6EN );
/* swtich clock source to HSI as we need
* to disable the phase locked loop */
/* Enable HSI clock */
RCC->CR |= RCC_CR_HSION;
/* Wait for HSI is ready */
while (!(RCC->CR & RCC_CR_HSIRDY));
/* Select HSI clock as main clock */
RCC->CFGR &= ~( RCC_CFGR_SW );
RCC->CFGR |= RCC_CFGR_SW_HSI;
/* Disable PLL clock */
RCC->CR &= ~RCC_CR_PLLON;
/* start teh process of entering sleep
* mode. On exit we do system reset */
/* clear PDDS bit safety */
PWR->CR &= ~( PWR_CR_PDDS );
/* set LPDS, clear flags */
PWR->CR |= ( PWR_CR_LPDS | \
PWR_CR_CSBF | \
PWR_CR_CWUF | \
PWR_CR_FPDS );
/* set the deep sleep mask */
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
chSysLock();
__SEV();
__WFE();
__WFE();
chSysUnlock();
/* clear the deep sleep mask */
SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;
/* reset the system to restart */
__ASM volatile ("dsb");
/* Keep priority group unchanged */
SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | \
(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | \
SCB_AIRCR_SYSRESETREQ_Msk);
__ASM volatile ("dsb");
return;
}
else
{
chprintf(chp, "modem command err\r\n");
}
modemGiveAccess();
}
return;
}
}
}