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.
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();
Sean Houlihane
ColinH
Fahad