Activación STM32 desde el modo de parada mediante el evento GPIO EXTI

Estoy usando una MCU de la serie STM32L0. Configuré mi MCU para que se despertara del modo de parada usando una línea EXTI (EXTI0 en PORTA0) durante el flanco descendente. Al principio, no iba al modo de parada después de llamar a _WFE(). Después de probar varias cosas, llamé a _WFE() dos veces, una tras otra, y funcionó. Aunque esto resolvió mi problema, me preguntaba si alguien puede arrojar algo de luz. Tal vez me estoy perdiendo algo.

Aquí está mi código:

void HW_WakeupPinInit(void)
{
   GPIO_InitTypeDef gpioInitStruct = {0};

   gpioInitStruct.Mode      = GPIO_MODE_INPUT;
   gpioInitStruct.Pull      = GPIO_PULLDOWN;
   gpioInitStruct.Speed = GPIO_SPEED_HIGH;

   HW_GPIO_Init( WAKEUP_PORT, WAKEUP_PIN, &gpioInitStruct );

   LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG);
   LL_SYSCFG_SetEXTISource(LL_SYSCFG_EXTI_PORTA, LL_SYSCFG_EXTI_LINE0);


   LL_EXTI_InitTypeDef EXTIinitStruct = {0};
   EXTIinitStruct.Line_0_31 = LL_EXTI_LINE_0;
   EXTIinitStruct.LineCommand = ENABLE;
   EXTIinitStruct.Mode = LL_EXTI_MODE_EVENT;
   EXTIinitStruct.Trigger = LL_EXTI_TRIGGER_FALLING;
   LL_EXTI_Init(&EXTIinitStruct);
}

void HW_EnterStopMode(void)
{
   uint32_t tmpreg = 0U;
   BACKUP_PRIMASK();
   DISABLE_IRQ();
   HW_IoDeInit();

   /*clear wake up flag*/
   LL_PWR_ClearFlag_WU();

   RESTORE_PRIMASK();
   tmpreg = PWR->CR;

   /* Clear PDDS and LPSDSR bits */
   CLEAR_BIT(tmpreg, (PWR_CR_PDDS | PWR_CR_LPSDSR));

   Set LPSDSR bit according to PWR_Regulator value */
   SET_BIT(tmpreg, LL_PWR_REGU_LPMODES_LOW_POWER);

   /* Store the new value */
   PWR->CR = tmpreg;

   LL_LPM_EnableDeepSleep();

   __WFE();
   __WFE();  // <------- Calling __WFE() second time works.
}

Gracias de antemano.

Respuestas (1)

He resuelto su problema siguiendo el método.

/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();

/*Configure GPIO pin : PA10 */
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

LL_EXTI_InitTypeDef EXTIinitStruct = {0};
EXTIinitStruct.Line_0_31 = LL_EXTI_LINE_10;
EXTIinitStruct.LineCommand = ENABLE;
EXTIinitStruct.Mode = LL_EXTI_MODE_IT_EVENT;
EXTIinitStruct.Trigger = LL_EXTI_TRIGGER_RISING_FALLING;
LL_EXTI_Init(&EXTIinitStruct);

HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFE); 
LL_EXTI_DeInit();
Sería mejor si dijeras (como descripción) cuál fue la causa de la falla.
¿Por qué flanco ascendente en GPIO y ascendente/descendente en EXTI?
La implementación bastante interesante de HAL_PWR_EnterSTOPMode en realidad llama a _WFE() dos veces (que se puede ver aquí: line899 ). Así que supongo que así es como debería ser, ¡aunque la hoja de datos no dice nada! Marcaré esto como solucionado.