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

4

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 así


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 sueño profundo. Así que creo que la función deepSleep cambia algo la primera vez en los registradores o algo así. Tienes alguna idea ?

Muchas gracias por tu ayuda angain.

Simon NOWAK

    
pregunta Simon NOWAK

1 respuesta

3

Finalmente encuentro la solución. En lugar de usar la función deepsleep, uso la función HAL_PWR_EnterSTOPMode () con el indicador de activación clara. Así

HAL_PWR_EnterSTOPMode(PWR_CR_LPSDSR | PWR_CR_CWUF, PWR_STOPENTRY_WFI);
    
respondido por el Simon NOWAK

Lea otras preguntas en las etiquetas