/** * @brief SMARTCARD error callbacks * @param hsc: usart handle * @retval None */ void HAL_SMARTCARD_ErrorCallback(SMARTCARD_HandleTypeDef *hsc) { if(HAL_SMARTCARD_GetError(hsc) & HAL_SMARTCARD_ERROR_FE) { __HAL_SMARTCARD_FLUSH_DRREGISTER(hsc); /* Resend the byte that failed to be received (by the Smartcard) correctly */ SC_ParityErrorHandler(); } if(HAL_SMARTCARD_GetError(hsc) & HAL_SMARTCARD_ERROR_PE) { /* Enable SC_USART RXNE Interrupt (until receiving the corrupted byte) */ __HAL_SMARTCARD_ENABLE_IT(hsc, SMARTCARD_IT_RXNE); /* Flush the SC_USART DR register */ __HAL_SMARTCARD_FLUSH_DRREGISTER(hsc); } if(HAL_SMARTCARD_GetError(hsc) & HAL_SMARTCARD_ERROR_NE) { __HAL_SMARTCARD_FLUSH_DRREGISTER(hsc); } if(HAL_SMARTCARD_GetError(hsc) & HAL_SMARTCARD_ERROR_ORE) { __HAL_SMARTCARD_FLUSH_DRREGISTER(hsc); } }
/** * @brief This function handles SC_USART global interrupt request. * @param None * @retval None */ void SC_USART_IRQHandler(void) { /* If a Frame error is signaled by the card */ if(USART_GetITStatus(SC_USART, USART_IT_FE) != RESET) { USART_ReceiveData(SC_USART); /* Resend the byte that failed to be received (by the Smartcard) correctly */ SC_ParityErrorHandler(); } /* If the SC_USART detects a parity error */ if(USART_GetITStatus(SC_USART, USART_IT_PE) != RESET) { /* Flush the SC_USART DR register */ USART_ReceiveData(SC_USART); } /* If a Overrun error is signaled by the card */ if(USART_GetITStatus(SC_USART, USART_IT_ORE) != RESET) { /* Flush the SC_USART DR register */ USART_ReceiveData(SC_USART); } /* If a Noise error is signaled by the card */ if(USART_GetITStatus(SC_USART, USART_IT_NE) != RESET) { /* Flush the SC_USART DR register */ USART_ReceiveData(SC_USART); } }
/** * @brief This function handles SC_USART global interrupt request. * @param None * @retval None */ void SC_USART_IRQHandler(void) { /* If a Frame error is signaled by the card */ if(USART_GetITStatus(SC_USART, USART_IT_FE) != RESET) { USART_ReceiveData(SC_USART); /* Resend the byte that failed to be received (by the Smartcard) correctly */ SC_ParityErrorHandler(); } /* If the SC_USART detects a parity error */ if(USART_GetITStatus(SC_USART, USART_IT_PE) != RESET) { /* Enable SC_USART RXNE Interrupt (until receiving the corrupted byte) */ USART_ITConfig(SC_USART, USART_IT_RXNE, ENABLE); /* Flush the SC_USART DR register */ USART_ReceiveData(SC_USART); } if(USART_GetITStatus(SC_USART, USART_IT_RXNE) != RESET) { /* Disable SC_USART RXNE Interrupt */ USART_ITConfig(SC_USART, USART_IT_RXNE, DISABLE); USART_ReceiveData(SC_USART); } /* If a Overrun error is signaled by the card */ if(USART_GetITStatus(SC_USART, USART_IT_ORE) != RESET) { USART_ReceiveData(SC_USART); } /* If a Noise error is signaled by the card */ if(USART_GetITStatus(SC_USART, USART_IT_NE) != RESET) { USART_ReceiveData(SC_USART); } }
/** * @brief This function handles USART3 global interrupt request. * @param None * @retval None */ void USART3_IRQHandler(void) { /* If a Frame error is signaled by the card */ if(USART_GetITStatus(USART3, USART_IT_FE) != RESET) { /* Clear the USART3 Frame error pending bit */ USART_ClearITPendingBit(USART3, USART_IT_FE); USART_ReceiveData(USART3); /* Resend the byte that failed to be received (by the Smartcard) correctly */ SC_ParityErrorHandler(); } /* If the USART3 detects a parity error */ if(USART_GetITStatus(USART3, USART_IT_PE) != RESET) { while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET) { } /* Clear the USART3 Parity error pending bit */ USART_ClearITPendingBit(USART3, USART_IT_PE); USART_ReceiveData(USART3); } /* If a Overrun error is signaled by the card */ if(USART_GetITStatus(USART3, USART_IT_ORE) != RESET) { /* Clear the USART3 Frame error pending bit */ USART_ClearITPendingBit(USART3, USART_IT_ORE); USART_ReceiveData(USART3); } /* If a Noise error is signaled by the card */ if(USART_GetITStatus(USART3, USART_IT_NE) != RESET) { /* Clear the USART3 Frame error pending bit */ USART_ClearITPendingBit(USART3, USART_IT_NE); USART_ReceiveData(USART3); } }