/** * @brief GPIO EXTI Callback function * Handle remote-wakeup through key button * @param GPIO_Pin * @retval None */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == USER_BUTTON_PIN) { if ((((USBD_HandleTypeDef *)hpcd.pData)->dev_remote_wakeup == 1)&& (((USBD_HandleTypeDef *)hpcd.pData)->dev_state == USBD_STATE_SUSPENDED)) { if ((&hpcd)->Init.low_power_enable) { /* Reset SLEEPDEEP bit of Cortex System Control Register */ SCB->SCR &= (uint32_t)~((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk)); SystemClockConfig_STOP(); } /* Activate Remote wakeup */ HAL_PCD_ActiveRemoteWakeup((&hpcd)); /* remote wakeup delay */ HAL_Delay(10); /* Disable Remote wakeup */ HAL_PCD_DeActiveRemoteWakeup((&hpcd)); /* change remote_wakeup feature to 0*/ ((USBD_HandleTypeDef *)hpcd.pData)->dev_remote_wakeup=0; remotewakeupon = 1; } } }
/** * @brief GPIO EXTI Callback function * Handle remote-wakeup through key button * @param GPIO_Pin * @retval None */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == KEY_BUTTON_PIN) { if ((USBD_Device.dev_remote_wakeup == 1)&&(USBD_Device.dev_state == USBD_STATE_SUSPENDED)) { if ((&hpcd)->Init.low_power_enable) { /* Reset SLEEPDEEP bit of Cortex System Control Register */ SCB->SCR &= (uint32_t)~((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk)); /* Configures system clock after wake-up from STOP: enable HSE, PLL and select PLL as system clock source (HSE and PLL are disabled in STOP mode) */ __HAL_RCC_HSE_CONFIG(RCC_HSE_ON); /* Wait till HSE is ready */ while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) {} /* Enable the main PLL. */ __HAL_RCC_PLL_ENABLE(); /* Wait till PLL is ready */ while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) {} /* Select PLL as SYSCLK */ MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_SYSCLKSOURCE_PLLCLK); /* Wait till system clock switch to PLL */ while (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) {} } /* ungate PHY clock */ __HAL_PCD_UNGATE_PHYCLOCK((&hpcd)); /* Activate Remote wakeup */ HAL_PCD_ActiveRemoteWakeup((&hpcd)); /* remote wakeup delay */ HAL_Delay(10); /* Desactivate Remote wakeup */ HAL_PCD_DeActiveRemoteWakeup((&hpcd)); /* change state to configured */ USBD_Device.dev_state = USBD_STATE_CONFIGURED; /* change remote_wakeup feature to 0*/ USBD_Device.dev_remote_wakeup=0; } } }