/** * @brief This function handles SMARTCARD Communication Timeout. * @param hsc: SMARTCARD handle * @param Flag: specifies the SMARTCARD flag to check. * @param Status: The new Flag status (SET or RESET). * @param Timeout: Timeout duration * @retval HAL status */ static HAL_StatusTypeDef SMARTCARD_WaitOnFlagUntilTimeout(SMARTCARD_HandleTypeDef *hsc, uint32_t Flag, FlagStatus Status, uint32_t Timeout) { uint32_t tickstart = 0x00; /* Get tick */ tickstart = HAL_GetTick(); /* Wait until flag is set */ if(Status == RESET) { while(__HAL_SMARTCARD_GET_FLAG(hsc, Flag) == RESET) { /* Check for the Timeout */ if(Timeout != HAL_MAX_DELAY) { if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) { /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */ __HAL_SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_TXE); __HAL_SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_RXNE); __HAL_SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_PE); __HAL_SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_ERR); hsc->State= HAL_SMARTCARD_STATE_READY; /* Process Unlocked */ __HAL_UNLOCK(hsc); return HAL_TIMEOUT; } } } } else { while(__HAL_SMARTCARD_GET_FLAG(hsc, Flag) != RESET) { /* Check for the Timeout */ if(Timeout != HAL_MAX_DELAY) { if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) { /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */ __HAL_SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_TXE); __HAL_SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_RXNE); __HAL_SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_PE); __HAL_SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_ERR); hsc->State= HAL_SMARTCARD_STATE_READY; /* Process Unlocked */ __HAL_UNLOCK(hsc); return HAL_TIMEOUT; } } } } return HAL_OK; }
/** * @brief This function handles SMARTCARD Communication Timeout. * @param hsc: SMARTCARD handle * @param Flag: specifies the SMARTCARD flag to check. * @param Status: The new Flag status (SET or RESET). * @param Timeout: Timeout duration * @retval HAL status */ static HAL_StatusTypeDef SMARTCARD_WaitOnFlagUntilTimeout(SMARTCARD_HandleTypeDef *hsc, uint32_t Flag, FlagStatus Status, uint32_t Timeout) { uint32_t timeout = 0; timeout = HAL_GetTick() + Timeout; /* Wait until flag is set */ if(Status == RESET) { while(__HAL_SMARTCARD_GET_FLAG(hsc, Flag) == RESET) { /* Check for the Timeout */ if(Timeout != HAL_MAX_DELAY) { if(HAL_GetTick() >= timeout) { /* Disable TXE and RXNE interrupts for the interrupt process */ __SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_TXE); __SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_RXNE); hsc->State= HAL_SMARTCARD_STATE_READY; /* Process Unlocked */ __HAL_UNLOCK(hsc); return HAL_TIMEOUT; } } } } else { while(__HAL_SMARTCARD_GET_FLAG(hsc, Flag) != RESET) { /* Check for the Timeout */ if(Timeout != HAL_MAX_DELAY) { if(HAL_GetTick() >= timeout) { /* Disable TXE and RXNE interrupts for the interrupt process */ __SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_TXE); __SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_RXNE); hsc->State= HAL_SMARTCARD_STATE_READY; /* Process Unlocked */ __HAL_UNLOCK(hsc); return HAL_TIMEOUT; } } } } return HAL_OK; }
/** * @brief This function handles SMARTCARD Communication Timeout. * @param hsc SMARTCARD handle * @param Flag specifies the SMARTCARD flag to check. * @param Status The new Flag status (SET or RESET). * @param Tickstart Tick start value * @param Timeout Timeout duration * @retval HAL status */ static HAL_StatusTypeDef SMARTCARD_WaitOnFlagUntilTimeout(SMARTCARD_HandleTypeDef *hsc, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout) { /* Wait until flag is set */ while((__HAL_SMARTCARD_GET_FLAG(hsc, Flag) ? SET : RESET) == Status) { /* Check for the Timeout */ if(Timeout != HAL_MAX_DELAY) { if((Timeout == 0U)||((HAL_GetTick() - Tickstart ) > Timeout)) { /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */ CLEAR_BIT(hsc->Instance->CR1, USART_CR1_TXEIE); CLEAR_BIT(hsc->Instance->CR1, USART_CR1_RXNEIE); __HAL_SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_PE); __HAL_SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_ERR); CLEAR_BIT(hsc->Instance->CR1, USART_CR1_PEIE); CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE); hsc->gState= HAL_SMARTCARD_STATE_READY; hsc->RxState= HAL_SMARTCARD_STATE_READY; /* Process Unlocked */ __HAL_UNLOCK(hsc); return HAL_TIMEOUT; } } } return HAL_OK; }
/** * @brief This function handles SMARTCARD interrupt request. * @param hsc: Pointer to a SMARTCARD_HandleTypeDef structure that contains * the configuration information for the specified SMARTCARD module. * @retval None */ void HAL_SMARTCARD_IRQHandler(SMARTCARD_HandleTypeDef *hsc) { uint32_t tmp1 = 0, tmp2 = 0; tmp1 = __HAL_SMARTCARD_GET_FLAG(hsc, SMARTCARD_FLAG_PE); tmp2 = __HAL_SMARTCARD_GET_IT_SOURCE(hsc, SMARTCARD_IT_PE); /* SMARTCARD parity error interrupt occurred -----------------------------------*/ if((tmp1 != RESET) && (tmp2 != RESET)) { __HAL_SMARTCARD_CLEAR_PEFLAG(hsc); hsc->ErrorCode |= HAL_SMARTCARD_ERROR_PE; } tmp1 = __HAL_SMARTCARD_GET_FLAG(hsc, SMARTCARD_FLAG_FE); tmp2 = __HAL_SMARTCARD_GET_IT_SOURCE(hsc, SMARTCARD_IT_ERR); /* SMARTCARD frame error interrupt occurred ------------------------------------*/ if((tmp1 != RESET) && (tmp2 != RESET)) { __HAL_SMARTCARD_CLEAR_FEFLAG(hsc); hsc->ErrorCode |= HAL_SMARTCARD_ERROR_FE; } tmp1 = __HAL_SMARTCARD_GET_FLAG(hsc, SMARTCARD_FLAG_NE); tmp2 = __HAL_SMARTCARD_GET_IT_SOURCE(hsc, SMARTCARD_IT_ERR); /* SMARTCARD noise error interrupt occurred ------------------------------------*/ if((tmp1 != RESET) && (tmp2 != RESET)) { __HAL_SMARTCARD_CLEAR_NEFLAG(hsc); hsc->ErrorCode |= HAL_SMARTCARD_ERROR_NE; } tmp1 = __HAL_SMARTCARD_GET_FLAG(hsc, SMARTCARD_FLAG_ORE); tmp2 = __HAL_SMARTCARD_GET_IT_SOURCE(hsc, SMARTCARD_IT_ERR); /* SMARTCARD Over-Run interrupt occurred ---------------------------------------*/ if((tmp1 != RESET) && (tmp2 != RESET)) { __HAL_SMARTCARD_CLEAR_OREFLAG(hsc); hsc->ErrorCode |= HAL_SMARTCARD_ERROR_ORE; } tmp1 = __HAL_SMARTCARD_GET_FLAG(hsc, SMARTCARD_FLAG_RXNE); tmp2 = __HAL_SMARTCARD_GET_IT_SOURCE(hsc, SMARTCARD_IT_RXNE); /* SMARTCARD in mode Receiver --------------------------------------------------*/ if((tmp1 != RESET) && (tmp2 != RESET)) { SMARTCARD_Receive_IT(hsc); } tmp1 = __HAL_SMARTCARD_GET_FLAG(hsc, SMARTCARD_FLAG_TXE); tmp2 = __HAL_SMARTCARD_GET_IT_SOURCE(hsc, SMARTCARD_IT_TXE); /* SMARTCARD in mode Transmitter -----------------------------------------------*/ if((tmp1 != RESET) && (tmp2 != RESET)) { SMARTCARD_Transmit_IT(hsc); } tmp1 = __HAL_SMARTCARD_GET_FLAG(hsc, SMARTCARD_FLAG_TC); tmp2 = __HAL_SMARTCARD_GET_IT_SOURCE(hsc, SMARTCARD_IT_TC); /* SMARTCARD in mode Transmitter (transmission end) ------------------------*/ if((tmp1 != RESET) && (tmp2 != RESET)) { SMARTCARD_EndTransmit_IT(hsc); } /* Call the Error call Back in case of Errors */ if(hsc->ErrorCode != HAL_SMARTCARD_ERROR_NONE) { /* Set the SMARTCARD state ready to be able to start again the process */ hsc->State= HAL_SMARTCARD_STATE_READY; HAL_SMARTCARD_ErrorCallback(hsc); } }