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

1

Estoy usando una MCU de la serie STM32L0. Configuré mi MCU para que se activara desde el modo de parada utilizando una línea EXTI (EXTI0 en PORTA0) durante el flanco descendente. Al principio, no iba al modo de detención después de que llamé a _WFE (). Después de probar varias cosas, llamé a _WFE () dos veces, una después de la otra y con eso me sirvió. Aunque esto resolvió mi problema, me preguntaba si alguien podría arrojar algo de luz. Tal vez me esté 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.

    
pregunta Fahad Mirza

1 respuesta

0

He resuelto tu problema con el siguiente 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();
    
respondido por el suren

Lea otras preguntas en las etiquetas