/** * @brief Receive an amount of data in non-blocking mode. * Function is called under interruption only, once * interruptions have been enabled by HAL_IRDA_Receive_IT(). * @param hirda: Pointer to a IRDA_HandleTypeDef structure that contains * the configuration information for the specified IRDA module. * @retval HAL status */ static HAL_StatusTypeDef IRDA_Receive_IT(IRDA_HandleTypeDef *hirda) { uint16_t* tmp; uint16_t uhMask = hirda->Mask; /* Check that a Rx process is ongoing */ if (hirda->RxState == HAL_IRDA_STATE_BUSY_RX) { if ((hirda->Init.WordLength == IRDA_WORDLENGTH_9B) && (hirda->Init.Parity == IRDA_PARITY_NONE)) { tmp = (uint16_t*) hirda->pRxBuffPtr ; *tmp = (uint16_t)(hirda->Instance->RDR & uhMask); hirda->pRxBuffPtr +=2; } else { *hirda->pRxBuffPtr++ = (uint8_t)(hirda->Instance->RDR & (uint8_t)uhMask); } if(--hirda->RxXferCount == 0) { __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_RXNE); /* Disable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */ __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR); /* Disable the IRDA Parity Error Interrupt */ __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_PE); /* Rx process is completed, restore hirda->RxState to Ready */ hirda->RxState = HAL_IRDA_STATE_READY; HAL_IRDA_RxCpltCallback(hirda); return HAL_OK; } return HAL_OK; } else { /* Clear RXNE interrupt flag */ __HAL_IRDA_SEND_REQ(hirda, IRDA_RXDATA_FLUSH_REQUEST); return HAL_BUSY; } }
/** * @brief This function handles IRDA interrupt request. * @param hirda: IRDA handle * @retval None */ void HAL_IRDA_IRQHandler(IRDA_HandleTypeDef *hirda) { /* IRDA parity error interrupt occurred -------------------------------------*/ if((__HAL_IRDA_GET_IT(hirda, IRDA_IT_PE) != RESET) && (__HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_PE) != RESET)) { __HAL_IRDA_CLEAR_PEFLAG(hirda); hirda->ErrorCode |= HAL_IRDA_ERROR_PE; /* Set the IRDA state ready to be able to start again the process */ hirda->State = HAL_IRDA_STATE_READY; } /* IRDA frame error interrupt occured --------------------------------------*/ if((__HAL_IRDA_GET_IT(hirda, IRDA_IT_FE) != RESET) && (__HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_ERR) != RESET)) { __HAL_IRDA_CLEAR_FEFLAG(hirda); hirda->ErrorCode |= HAL_IRDA_ERROR_FE; /* Set the IRDA state ready to be able to start again the process */ hirda->State = HAL_IRDA_STATE_READY; } /* IRDA noise error interrupt occured --------------------------------------*/ if((__HAL_IRDA_GET_IT(hirda, IRDA_IT_NE) != RESET) && (__HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_ERR) != RESET)) { __HAL_IRDA_CLEAR_NEFLAG(hirda); hirda->ErrorCode |= HAL_IRDA_ERROR_NE; /* Set the IRDA state ready to be able to start again the process */ hirda->State = HAL_IRDA_STATE_READY; } /* IRDA Over-Run interrupt occured -----------------------------------------*/ if((__HAL_IRDA_GET_IT(hirda, IRDA_IT_ORE) != RESET) && (__HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_ERR) != RESET)) { __HAL_IRDA_CLEAR_OREFLAG(hirda); hirda->ErrorCode |= HAL_IRDA_ERROR_ORE; /* Set the IRDA state ready to be able to start again the process */ hirda->State = HAL_IRDA_STATE_READY; } /* Call IRDA Error Call back function if need be --------------------------*/ if(hirda->ErrorCode != HAL_IRDA_ERROR_NONE) { HAL_IRDA_ErrorCallback(hirda); } /* IRDA in mode Receiver ---------------------------------------------------*/ if((__HAL_IRDA_GET_IT(hirda, IRDA_IT_RXNE) != RESET) && (__HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_RXNE) != RESET)) { IRDA_Receive_IT(hirda); /* Clear RXNE interrupt flag */ __HAL_IRDA_SEND_REQ(hirda, IRDA_RXDATA_FLUSH_REQUEST); } /* IRDA in mode Transmitter ------------------------------------------------*/ if((__HAL_IRDA_GET_IT(hirda, IRDA_IT_TXE) != RESET) &&(__HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_TXE) != RESET)) { IRDA_Transmit_IT(hirda); } /* IRDA in mode Transmitter (transmission end) -----------------------------*/ if((__HAL_IRDA_GET_IT(hirda, IRDA_IT_TC) != RESET) &&(__HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_TC) != RESET)) { IRDA_EndTransmit_IT(hirda); } }