/** * @brief HAL_PCDEx_LPM_Callback : Send LPM message to user layer * @param hpcd: PCD handle * @param msg: LPM message * @retval HAL status */ void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg) { switch ( msg) { case PCD_LPM_L0_ACTIVE: if (hpcd->Init.low_power_enable) { SystemClock_Config(); /* Reset SLEEPDEEP bit of Cortex System Control Register */ SCB->SCR &= (uint32_t)~((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk)); } __HAL_PCD_UNGATE_PHYCLOCK(hpcd); USBD_LL_Resume(hpcd->pData); break; case PCD_LPM_L1_ACTIVE: __HAL_PCD_GATE_PHYCLOCK(hpcd); USBD_LL_Suspend(hpcd->pData); /*Enter in STOP mode */ if (hpcd->Init.low_power_enable) { /* Set SLEEPDEEP bit and SleepOnExit of Cortex System Control Register */ SCB->SCR |= (uint32_t)((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk)); } break; } }
/** * @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 == TAMPER_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(); } /* Ungate PHY clock */ __HAL_PCD_UNGATE_PHYCLOCK((&hpcd)); /* Activate Remote wakeup */ HAL_PCD_ActivateRemoteWakeup((&hpcd)); /* Remote wakeup delay */ HAL_Delay(10); /* Disable Remote wakeup */ HAL_PCD_DeActivateRemoteWakeup((&hpcd)); /* change state to configured */ ((USBD_HandleTypeDef *)hpcd.pData)->dev_state = USBD_STATE_CONFIGURED; /* Change remote_wakeup feature to 0*/ ((USBD_HandleTypeDef *)hpcd.pData)->dev_remote_wakeup=0; } } }
/** * @brief This function handles USB OTG Common FS/HS Wakeup functions. * @param *pcd_handle for FS or HS * @retval None */ STATIC void OTG_CMD_WKUP_Handler(PCD_HandleTypeDef *pcd_handle) { if (pcd_handle->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); while (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) {} /* ungate PHY clock */ __HAL_PCD_UNGATE_PHYCLOCK(pcd_handle); } }
/** * @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; } } }
/** * @brief Resume callback. When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it) * @param hpcd: PCD handle * @retval None */ void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) { /* USER CODE BEGIN 3 */ 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)); } /* USER CODE END 3 */ __HAL_PCD_UNGATE_PHYCLOCK(hpcd); USBD_LL_Resume(hpcd->pData); }
/** * @brief Resume callback. * @param hpcd: PCD handle * @retval None */ void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) { if ((hpcd->Init.low_power_enable)&&(remotewakeupon == 0)) { SystemClockConfig_STOP(); /* Reset SLEEPDEEP bit of Cortex System Control Register */ SCB->SCR &= (uint32_t)~((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk)); } __HAL_PCD_UNGATE_PHYCLOCK(hpcd); USBD_LL_Resume(hpcd->pData); remotewakeupon=0; }
/** * @brief This function handles USB OTG FS Wakeup IRQ Handler. * @param None * @retval None */ void OTG_FS_WKUP_IRQHandler(void) { 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 */ SystemClock_Config(); /* ungate PHY clock */ __HAL_PCD_UNGATE_PHYCLOCK((&hpcd)); } /* Clear EXTI pending Bit*/ __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG(); }
void OTG_HS_WKUP_IRQHandler(void) #endif { 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); while (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) {} /* ungate PHY clock */ __HAL_PCD_UNGATE_PHYCLOCK((&hpcd)); } #ifdef USE_USB_FS /* Clear EXTI pending Bit*/ __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG(); #else /* Clear EXTI pending Bit*/ __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG(); #endif }
void OTG_HS_WKUP_IRQHandler(void) #endif { 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(); /* Ungate PHY clock */ __HAL_PCD_UNGATE_PHYCLOCK((&hpcd)); } #ifdef USE_USB_FS /* Clear EXTI pending Bit*/ __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG(); #else /* Clear EXTI pending Bit*/ __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG(); #endif }
void OTG_HS_WKUP_IRQHandler(void) #endif { 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) */ SystemClock_Config(); /* ungate PHY clock */ __HAL_PCD_UNGATE_PHYCLOCK((&hpcd)); } #ifdef USE_USB_FS /* Clear EXTI pending Bit*/ __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG(); #else /* Clear EXTI pending Bit*/ __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG(); #endif }