¿Cómo obtener exactamente el mismo estado después de la función mdbed deepsleep() en un STM32L073RZ?

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

¿La implementación de las bibliotecas STM32 no es de código abierto? Lo más fácil es probablemente echar un vistazo al código de deepSleep, la respuesta debería estar ahí. Si lo encuentra, asegúrese de responder su propia pregunta aquí.
Ya trato de encontrar algo en la función HAL_PWR_EnterSTOPMode. Pero no vi nada.
Deberías publicar tu respuesta como una respuesta ...

Respuestas (1)

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);