/** * @brief This function handles CRS Synchronization Timeout. * @param Timeout: Duration of the timeout * @note Timeout is based on the maximum time to receive a SYNC event based on synchronization * frequency. * @note If Timeout set to HAL_MAX_DELAY, HAL_TIMEOUT will be never returned. * @retval Combination of Synchronization status * This parameter can be a combination of the following values: * @arg RCC_CRS_TIMEOUT * @arg RCC_CRS_SYNCOK * @arg RCC_CRS_SYNCWARM * @arg RCC_CRS_SYNCERR * @arg RCC_CRS_SYNCMISS * @arg RCC_CRS_TRIMOV */ RCC_CRSStatusTypeDef HAL_RCCEx_CRSWaitSynchronization(uint32_t Timeout) { RCC_CRSStatusTypeDef crsstatus = RCC_CRS_NONE; uint32_t tickstart = 0; /* Get timeout */ tickstart = HAL_GetTick(); /* Check that if one of CRS flags have been set */ while(RCC_CRS_NONE == crsstatus) { if(Timeout != HAL_MAX_DELAY) { if((HAL_GetTick() - tickstart ) > Timeout) { crsstatus = RCC_CRS_TIMEOUT; } } /* Check CRS SYNCOK flag */ if(__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCOK)) { /* CRS SYNC event OK */ crsstatus |= RCC_CRS_SYNCOK; /* Clear CRS SYNC event OK bit */ __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_SYNCOK); } /* Check CRS SYNCWARN flag */ if(__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCWARN)) { /* CRS SYNC warning */ crsstatus |= RCC_CRS_SYNCWARM; /* Clear CRS SYNCWARN bit */ __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_SYNCWARN); } /* Check CRS TRIM overflow flag */ if(__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_TRIMOVF)) { /* CRS SYNC Error */ crsstatus |= RCC_CRS_TRIMOV; /* Clear CRS Error bit */ __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_TRIMOVF); } /* Check CRS Error flag */ if(__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCERR)) { /* CRS SYNC Error */ crsstatus |= RCC_CRS_SYNCERR; /* Clear CRS Error bit */ __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_SYNCERR); } /* Check CRS SYNC Missed flag */ if(__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCMISS)) { /* CRS SYNC Missed */ crsstatus |= RCC_CRS_SYNCMISS; /* Clear CRS SYNC Missed bit */ __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_SYNCMISS); } /* Check CRS Expected SYNC flag */ if(__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_ESYNC)) { /* frequency error counter reached a zero value */ __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_ESYNC); } } return crsstatus; }
/** * @brief Handle CRS interuption * @param none * @retval none */ void CRS_HandlerIT(void) { /* Check CRS SYNCOK flag */ if ((__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCOK)) && (__HAL_RCC_CRS_GET_IT_SOURCE(RCC_CRS_IT_SYNCOK))) { /* Power on LED1 */ BSP_LED_On(LED1); /* Power off LED2*/ BSP_LED_Off(LED2); /* Power off LED4*/ BSP_LED_Off(LED4); CRSSyncStatus = 0; /* Clear CRS SYNC event OK bit */ __HAL_RCC_CRS_CLEAR_IT(RCC_CRS_FLAG_SYNCOK); } /* Check CRS SYNCWARN flag */ if ((__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCWARN)) && (__HAL_RCC_CRS_GET_IT_SOURCE(RCC_CRS_IT_SYNCWARN))) { /* Power off LED1 */ BSP_LED_Off(LED1); /* Power on LED2*/ BSP_LED_On(LED2); /* Power off LED4*/ BSP_LED_Off(LED4); CRSSyncStatus = 1; /* Clear CRS SYNCWARN bit */ __HAL_RCC_CRS_CLEAR_IT(RCC_CRS_FLAG_SYNCWARN); } /* Check CRS Error flag */ if ((__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCERR)) && (__HAL_RCC_CRS_GET_IT_SOURCE(RCC_CRS_IT_SYNCERR))) { /* Power off LED1 */ BSP_LED_Off(LED1); /* Power off LED2*/ BSP_LED_Off(LED2); /* Power on LED4*/ BSP_LED_On(LED4); CRSSyncStatus = 2; /* Clear CRS Error bit */ __HAL_RCC_CRS_CLEAR_IT(RCC_CRS_FLAG_SYNCERR); } /* Check CRS SYNC Missed flag */ if ((__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCMISS)) && (__HAL_RCC_CRS_GET_IT_SOURCE(RCC_CRS_IT_ERR))) { /* Power off LED1 */ BSP_LED_Off(LED1); /* Power off LED2*/ BSP_LED_Off(LED2); /* Power on LED4*/ BSP_LED_On(LED4); CRSSyncStatus = 2; /* Clear CRS SYNC Missed bit */ __HAL_RCC_CRS_CLEAR_IT(RCC_CRS_FLAG_SYNCMISS); } /* Check CRS Expected SYNC flag */ if ((__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_ESYNC)) && (__HAL_RCC_CRS_GET_IT_SOURCE(RCC_CRS_IT_ESYNC))) { /* frequency error counter reached a zero value */ __HAL_RCC_CRS_CLEAR_IT(RCC_CRS_FLAG_ESYNC); } }