Intento configurar mi STM32 para obtener el menor consumo de energía. Para eso estoy usando la función deepsleep() de mbed librairies. Antes de eso deshabilito GPIO con esta función
void SystemPower_Config(void)
{
/* Enable Power Control clock */
__HAL_RCC_PWR_CLK_ENABLE();
/* Enable Ultra low power mode */
HAL_PWREx_EnableUltraLowPower();
//pc.printf("1\r\n");
/* Enable the fast wake up from Ultra low power mode */
HAL_PWREx_EnableFastWakeUp();
GPIO_InitTypeDef GPIO_InitStructure = {0};
GPIO_InitStructure.Pin = GPIO_PIN_All;
GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
GPIO_InitStructure.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);
HAL_GPIO_Init(GPIOH, &GPIO_InitStructure);
HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);
}
Mi aspecto principal es ese
int main()
{
Board_Init();
while(1)
{
SystemPower_Config();
wait(0.1);
deepsleep();
}
}
Para generar interrupciones utilizo alarmas RTC para salir del modo deepSleep. Esta parte funciona bien, pero el problema es que la primera vez (durante el primer sueño profundo) mi consumo es igual a 1uA. Después de eso, mi consumo es de alrededor de 2.5uA en cada deepSleep. Así que creo que la función deepSleep cambia algo la primera vez en los registros o algo así. Tienes alguna idea ?
Muchas gracias por tu ayuda de nuevo.
Simón NOWAK
Finalmente encuentro la solución. En lugar de usar la función de sueño profundo, uso la función HAL_PWR_EnterSTOPMode() con la bandera de activación clara. Como eso
HAL_PWR_EnterSTOPMode(PWR_CR_LPSDSR | PWR_CR_CWUF, PWR_STOPENTRY_WFI);
oscuro
Simón NOWAK
Sean Houlihane