199 #ifdef HAL_IRDA_MODULE_ENABLED 206 #define IRDA_TEACK_REACK_TIMEOUT 1000U 208 #define IRDA_CR1_FIELDS ((uint32_t)(USART_CR1_M | USART_CR1_PCE \ 209 | USART_CR1_PS | USART_CR1_TE | USART_CR1_RE)) 211 #define USART_BRR_MIN 0x10U 213 #define USART_BRR_MAX 0x0000FFFFU 222 #if defined(USART_PRESC_PRESCALER) 229 #define IRDA_DIV_SAMPLING16(__PCLK__, __BAUD__, __PRESCALER__) ((((__PCLK__)/IRDAPrescTable[(__PRESCALER__)])\ 230 + ((__BAUD__)/2U)) / (__BAUD__)) 237 #define IRDA_DIV_SAMPLING16(__PCLK__, __BAUD__) (((__PCLK__) + ((__BAUD__)/2U)) / (__BAUD__)) 248 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 254 uint32_t Tickstart, uint32_t Timeout);
347 if (hirda->gState == HAL_IRDA_STATE_RESET)
352 #if USE_HAL_IRDA_REGISTER_CALLBACKS == 1 355 if (hirda->MspInitCallback == NULL)
361 hirda->MspInitCallback(hirda);
368 hirda->gState = HAL_IRDA_STATE_BUSY;
371 __HAL_IRDA_DISABLE(hirda);
382 CLEAR_BIT(hirda->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN | USART_CR2_STOP));
383 CLEAR_BIT(hirda->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL));
386 hirda->Instance->CR3 |= USART_CR3_IREN;
389 __HAL_IRDA_ENABLE(hirda);
412 hirda->gState = HAL_IRDA_STATE_BUSY;
415 #if USE_HAL_IRDA_REGISTER_CALLBACKS == 1 416 if (hirda->MspDeInitCallback == NULL)
421 hirda->MspDeInitCallback(hirda);
426 __HAL_IRDA_DISABLE(hirda);
428 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
429 hirda->gState = HAL_IRDA_STATE_RESET;
430 hirda->RxState = HAL_IRDA_STATE_RESET;
470 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 493 HAL_StatusTypeDef status =
HAL_OK;
495 if (pCallback == NULL)
498 hirda->ErrorCode |= HAL_IRDA_ERROR_INVALID_CALLBACK;
505 if (hirda->gState == HAL_IRDA_STATE_READY)
510 hirda->TxHalfCpltCallback = pCallback;
514 hirda->TxCpltCallback = pCallback;
518 hirda->RxHalfCpltCallback = pCallback;
522 hirda->RxCpltCallback = pCallback;
526 hirda->ErrorCallback = pCallback;
530 hirda->AbortCpltCallback = pCallback;
534 hirda->AbortTransmitCpltCallback = pCallback;
538 hirda->AbortReceiveCpltCallback = pCallback;
542 hirda->MspInitCallback = pCallback;
546 hirda->MspDeInitCallback = pCallback;
551 hirda->ErrorCode |= HAL_IRDA_ERROR_INVALID_CALLBACK;
558 else if (hirda->gState == HAL_IRDA_STATE_RESET)
563 hirda->MspInitCallback = pCallback;
567 hirda->MspDeInitCallback = pCallback;
572 hirda->ErrorCode |= HAL_IRDA_ERROR_INVALID_CALLBACK;
582 hirda->ErrorCode |= HAL_IRDA_ERROR_INVALID_CALLBACK;
614 HAL_StatusTypeDef status =
HAL_OK;
619 if (HAL_IRDA_STATE_READY == hirda->gState)
665 hirda->ErrorCode |= HAL_IRDA_ERROR_INVALID_CALLBACK;
672 else if (HAL_IRDA_STATE_RESET == hirda->gState)
686 hirda->ErrorCode |= HAL_IRDA_ERROR_INVALID_CALLBACK;
696 hirda->ErrorCode |= HAL_IRDA_ERROR_INVALID_CALLBACK;
806 uint16_t *pdata16bits;
810 if (hirda->gState == HAL_IRDA_STATE_READY)
812 if ((pData == NULL) || (Size == 0U))
820 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
821 hirda->gState = HAL_IRDA_STATE_BUSY_TX;
826 hirda->TxXferSize = Size;
827 hirda->TxXferCount = Size;
830 if ((hirda->Init.WordLength == IRDA_WORDLENGTH_9B) && (hirda->Init.Parity == IRDA_PARITY_NONE))
833 pdata16bits = (uint16_t *) pData;
841 while (hirda->TxXferCount > 0U)
843 hirda->TxXferCount--;
849 if (pdata8bits == NULL)
851 hirda->Instance->TDR = (uint16_t)(*pdata16bits & 0x01FFU);
856 hirda->Instance->TDR = (uint8_t)(*pdata8bits & 0xFFU);
867 hirda->gState = HAL_IRDA_STATE_READY;
892 uint16_t *pdata16bits;
897 if (hirda->RxState == HAL_IRDA_STATE_READY)
899 if ((pData == NULL) || (Size == 0U))
907 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
908 hirda->RxState = HAL_IRDA_STATE_BUSY_RX;
913 hirda->RxXferSize = Size;
914 hirda->RxXferCount = Size;
918 IRDA_MASK_COMPUTATION(hirda);
919 uhMask = hirda->Mask;
922 if ((hirda->Init.WordLength == IRDA_WORDLENGTH_9B) && (hirda->Init.Parity == IRDA_PARITY_NONE))
925 pdata16bits = (uint16_t *) pData;
934 while (hirda->RxXferCount > 0U)
936 hirda->RxXferCount--;
942 if (pdata8bits == NULL)
944 *pdata16bits = (uint16_t)(hirda->Instance->RDR & uhMask);
949 *pdata8bits = (uint8_t)(hirda->Instance->RDR & (uint8_t)uhMask);
955 hirda->RxState = HAL_IRDA_STATE_READY;
979 if (hirda->gState == HAL_IRDA_STATE_READY)
981 if ((pData == NULL) || (Size == 0U))
989 hirda->pTxBuffPtr = pData;
990 hirda->TxXferSize = Size;
991 hirda->TxXferCount = Size;
993 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
994 hirda->gState = HAL_IRDA_STATE_BUSY_TX;
1000 #if defined(USART_CR1_FIFOEN) 1001 SET_BIT(hirda->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);
1003 SET_BIT(hirda->Instance->CR1, USART_CR1_TXEIE);
1025 if (hirda->RxState == HAL_IRDA_STATE_READY)
1027 if ((pData == NULL) || (Size == 0U))
1035 hirda->pRxBuffPtr = pData;
1036 hirda->RxXferSize = Size;
1037 hirda->RxXferCount = Size;
1041 IRDA_MASK_COMPUTATION(hirda);
1043 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
1044 hirda->RxState = HAL_IRDA_STATE_BUSY_RX;
1050 #if defined(USART_CR1_FIFOEN) 1051 SET_BIT(hirda->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE);
1053 SET_BIT(hirda->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE);
1057 SET_BIT(hirda->Instance->CR3, USART_CR3_EIE);
1078 if (hirda->gState == HAL_IRDA_STATE_READY)
1080 if ((pData == NULL) || (Size == 0U))
1088 hirda->pTxBuffPtr = pData;
1089 hirda->TxXferSize = Size;
1090 hirda->TxXferCount = Size;
1092 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
1093 hirda->gState = HAL_IRDA_STATE_BUSY_TX;
1105 hirda->hdmatx->XferAbortCallback = NULL;
1108 if (
HAL_DMA_Start_IT(hirda->hdmatx, (uint32_t)hirda->pTxBuffPtr, (uint32_t)&hirda->Instance->TDR, Size) ==
HAL_OK)
1111 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_TCF);
1118 SET_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
1125 hirda->ErrorCode = HAL_IRDA_ERROR_DMA;
1131 hirda->gState = HAL_IRDA_STATE_READY;
1155 if (hirda->RxState == HAL_IRDA_STATE_READY)
1157 if ((pData == NULL) || (Size == 0U))
1165 hirda->pRxBuffPtr = pData;
1166 hirda->RxXferSize = Size;
1168 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
1169 hirda->RxState = HAL_IRDA_STATE_BUSY_RX;
1181 hirda->hdmarx->XferAbortCallback = NULL;
1184 if (
HAL_DMA_Start_IT(hirda->hdmarx, (uint32_t)&hirda->Instance->RDR, (uint32_t)hirda->pRxBuffPtr, Size) ==
HAL_OK)
1190 SET_BIT(hirda->Instance->CR1, USART_CR1_PEIE);
1193 SET_BIT(hirda->Instance->CR3, USART_CR3_EIE);
1197 SET_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
1204 hirda->ErrorCode = HAL_IRDA_ERROR_DMA;
1210 hirda->RxState = HAL_IRDA_STATE_READY;
1233 if (hirda->gState == HAL_IRDA_STATE_BUSY_TX)
1235 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT))
1238 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
1241 if (hirda->RxState == HAL_IRDA_STATE_BUSY_RX)
1243 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
1246 CLEAR_BIT(hirda->Instance->CR1, USART_CR1_PEIE);
1247 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
1250 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
1271 if (hirda->gState == HAL_IRDA_STATE_BUSY_TX)
1274 SET_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
1276 if (hirda->RxState == HAL_IRDA_STATE_BUSY_RX)
1279 __HAL_IRDA_CLEAR_OREFLAG(hirda);
1282 SET_BIT(hirda->Instance->CR1, USART_CR1_PEIE);
1283 SET_BIT(hirda->Instance->CR3, USART_CR3_EIE);
1286 SET_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
1311 if (hirda->gState == HAL_IRDA_STATE_BUSY_TX)
1313 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT))
1315 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
1318 if (hirda->hdmatx != NULL)
1325 hirda->ErrorCode = HAL_IRDA_ERROR_DMA;
1337 if (hirda->RxState == HAL_IRDA_STATE_BUSY_RX)
1339 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
1341 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
1344 if (hirda->hdmarx != NULL)
1351 hirda->ErrorCode = HAL_IRDA_ERROR_DMA;
1381 #if defined(USART_CR1_FIFOEN) 1382 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE));
1384 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE));
1386 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
1389 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT))
1391 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
1394 if (hirda->hdmatx != NULL)
1398 hirda->hdmatx->XferAbortCallback = NULL;
1405 hirda->ErrorCode = HAL_IRDA_ERROR_DMA;
1414 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
1416 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
1419 if (hirda->hdmarx != NULL)
1423 hirda->hdmarx->XferAbortCallback = NULL;
1430 hirda->ErrorCode = HAL_IRDA_ERROR_DMA;
1439 hirda->TxXferCount = 0U;
1440 hirda->RxXferCount = 0U;
1443 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
1446 hirda->gState = HAL_IRDA_STATE_READY;
1447 hirda->RxState = HAL_IRDA_STATE_READY;
1450 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
1471 #if defined(USART_CR1_FIFOEN) 1472 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE));
1474 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
1478 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT))
1480 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
1483 if (hirda->hdmatx != NULL)
1487 hirda->hdmatx->XferAbortCallback = NULL;
1494 hirda->ErrorCode = HAL_IRDA_ERROR_DMA;
1503 hirda->TxXferCount = 0U;
1506 hirda->gState = HAL_IRDA_STATE_READY;
1527 #if defined(USART_CR1_FIFOEN) 1528 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
1530 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
1532 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
1535 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
1537 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
1540 if (hirda->hdmarx != NULL)
1544 hirda->hdmarx->XferAbortCallback = NULL;
1551 hirda->ErrorCode = HAL_IRDA_ERROR_DMA;
1560 hirda->RxXferCount = 0U;
1563 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
1566 hirda->RxState = HAL_IRDA_STATE_READY;
1588 uint32_t abortcplt = 1U;
1591 #if defined(USART_CR1_FIFOEN) 1592 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE));
1594 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE));
1596 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
1601 if (hirda->hdmatx != NULL)
1605 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT))
1611 hirda->hdmatx->XferAbortCallback = NULL;
1615 if (hirda->hdmarx != NULL)
1619 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
1625 hirda->hdmarx->XferAbortCallback = NULL;
1630 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT))
1633 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
1636 if (hirda->hdmatx != NULL)
1644 hirda->hdmatx->XferAbortCallback = NULL;
1654 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
1656 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
1659 if (hirda->hdmarx != NULL)
1667 hirda->hdmarx->XferAbortCallback = NULL;
1678 if (abortcplt == 1U)
1681 hirda->TxXferCount = 0U;
1682 hirda->RxXferCount = 0U;
1685 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
1688 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
1691 hirda->gState = HAL_IRDA_STATE_READY;
1692 hirda->RxState = HAL_IRDA_STATE_READY;
1695 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 1697 hirda->AbortCpltCallback(hirda);
1725 #if defined(USART_CR1_FIFOEN) 1726 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE));
1728 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
1732 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT))
1734 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
1737 if (hirda->hdmatx != NULL)
1747 hirda->hdmatx->XferAbortCallback(hirda->hdmatx);
1753 hirda->TxXferCount = 0U;
1756 hirda->gState = HAL_IRDA_STATE_READY;
1759 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 1761 hirda->AbortTransmitCpltCallback(hirda);
1771 hirda->TxXferCount = 0U;
1774 hirda->gState = HAL_IRDA_STATE_READY;
1777 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 1779 hirda->AbortTransmitCpltCallback(hirda);
1807 #if defined(USART_CR1_FIFOEN) 1808 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
1810 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
1812 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
1815 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
1817 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
1820 if (hirda->hdmarx != NULL)
1830 hirda->hdmarx->XferAbortCallback(hirda->hdmarx);
1836 hirda->RxXferCount = 0U;
1839 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
1842 hirda->RxState = HAL_IRDA_STATE_READY;
1845 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 1847 hirda->AbortReceiveCpltCallback(hirda);
1857 hirda->RxXferCount = 0U;
1860 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
1863 hirda->RxState = HAL_IRDA_STATE_READY;
1866 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 1868 hirda->AbortReceiveCpltCallback(hirda);
1886 uint32_t isrflags = READ_REG(hirda->Instance->ISR);
1887 uint32_t cr1its = READ_REG(hirda->Instance->CR1);
1889 uint32_t errorflags;
1893 errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE));
1894 if (errorflags == 0U)
1897 #if defined(USART_CR1_FIFOEN) 1898 if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U) && ((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U))
1900 if (((isrflags & USART_ISR_RXNE) != 0U) && ((cr1its & USART_CR1_RXNEIE) != 0U))
1909 cr3its = READ_REG(hirda->Instance->CR3);
1910 if ((errorflags != 0U)
1911 && (((cr3its & USART_CR3_EIE) != 0U)
1912 #
if defined(USART_CR1_FIFOEN)
1913 || ((cr1its & (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)) != 0U)))
1915 || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != 0U)))
1919 if (((isrflags & USART_ISR_PE) != 0U) && ((cr1its & USART_CR1_PEIE) != 0U))
1921 __HAL_IRDA_CLEAR_IT(hirda, IRDA_CLEAR_PEF);
1923 hirda->ErrorCode |= HAL_IRDA_ERROR_PE;
1927 if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
1929 __HAL_IRDA_CLEAR_IT(hirda, IRDA_CLEAR_FEF);
1931 hirda->ErrorCode |= HAL_IRDA_ERROR_FE;
1935 if (((isrflags & USART_ISR_NE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
1937 __HAL_IRDA_CLEAR_IT(hirda, IRDA_CLEAR_NEF);
1939 hirda->ErrorCode |= HAL_IRDA_ERROR_NE;
1943 if (((isrflags & USART_ISR_ORE) != 0U) &&
1944 #
if defined(USART_CR1_FIFOEN)
1945 (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) || ((cr3its & USART_CR3_EIE) != 0U)))
1947 (((cr1its & USART_CR1_RXNEIE) != 0U) || ((cr3its & USART_CR3_EIE) != 0U)))
1950 __HAL_IRDA_CLEAR_IT(hirda, IRDA_CLEAR_OREF);
1952 hirda->ErrorCode |= HAL_IRDA_ERROR_ORE;
1956 if (hirda->ErrorCode != HAL_IRDA_ERROR_NONE)
1959 #if defined(USART_CR1_FIFOEN) 1960 if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U) && ((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U))
1962 if (((isrflags & USART_ISR_RXNE) != 0U) && ((cr1its & USART_CR1_RXNEIE) != 0U))
1970 errorcode = hirda->ErrorCode;
1971 if ((HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR)) ||
1972 ((errorcode & HAL_IRDA_ERROR_ORE) != 0U))
1980 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
1982 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
1985 if (hirda->hdmarx != NULL)
1995 hirda->hdmarx->XferAbortCallback(hirda->hdmarx);
2000 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 2002 hirda->ErrorCallback(hirda);
2011 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 2013 hirda->ErrorCallback(hirda);
2024 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 2026 hirda->ErrorCallback(hirda);
2031 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
2039 #if defined(USART_CR1_FIFOEN) 2040 if (((isrflags & USART_ISR_TXE_TXFNF) != 0U) && ((cr1its & USART_CR1_TXEIE_TXFNFIE) != 0U))
2042 if (((isrflags & USART_ISR_TXE) != 0U) && ((cr1its & USART_CR1_TXEIE) != 0U))
2050 if (((isrflags & USART_ISR_TC) != 0U) && ((cr1its & USART_CR1_TCIE) != 0U))
2220 temp1 = (uint32_t)hirda->gState;
2221 temp2 = (uint32_t)hirda->RxState;
2234 return hirda->ErrorCode;
2249 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 2280 HAL_StatusTypeDef ret =
HAL_OK;
2281 #if defined(USART_PRESC_PRESCALER) 2282 const uint16_t IRDAPrescTable[12] = {1U, 2U, 4U, 6U, 8U, 10U, 12U, 16U, 32U, 64U, 128U, 256U};
2287 assert_param(IS_IRDA_WORD_LENGTH(hirda->Init.WordLength));
2290 assert_param(IS_IRDA_PRESCALER(hirda->Init.Prescaler));
2291 assert_param(IS_IRDA_POWERMODE(hirda->Init.PowerMode));
2292 #if defined(USART_PRESC_PRESCALER) 2293 assert_param(IS_IRDA_CLOCKPRESCALER(hirda->Init.ClockPrescaler));
2301 tmpreg = (uint32_t)hirda->Init.WordLength | hirda->Init.Parity | hirda->Init.Mode ;
2303 MODIFY_REG(hirda->Instance->CR1, IRDA_CR1_FIELDS, tmpreg);
2306 MODIFY_REG(hirda->Instance->CR3, USART_CR3_IRLP, hirda->Init.PowerMode);
2308 #if defined(USART_PRESC_PRESCALER) 2312 MODIFY_REG(hirda->Instance->PRESC, USART_PRESC_PRESCALER, hirda->Init.ClockPrescaler);
2316 MODIFY_REG(hirda->Instance->GTPR, (uint16_t)USART_GTPR_PSC, (uint16_t)hirda->Init.Prescaler);
2319 IRDA_GETCLOCKSOURCE(hirda, clocksource);
2321 switch (clocksource)
2324 #if defined(USART_PRESC_PRESCALER) 2325 tmpreg = (uint16_t)(IRDA_DIV_SAMPLING16(
HAL_RCC_GetPCLK1Freq(), hirda->Init.BaudRate, hirda->Init.ClockPrescaler));
2331 #if defined(USART_PRESC_PRESCALER) 2332 tmpreg = (uint16_t)(IRDA_DIV_SAMPLING16(
HAL_RCC_GetPCLK2Freq(), hirda->Init.BaudRate, hirda->Init.ClockPrescaler));
2338 #if defined(USART_PRESC_PRESCALER) 2339 tmpreg = (uint16_t)(IRDA_DIV_SAMPLING16(HSI_VALUE, hirda->Init.BaudRate, hirda->Init.ClockPrescaler));
2341 tmpreg = (uint16_t)(IRDA_DIV_SAMPLING16(HSI_VALUE, hirda->Init.BaudRate));
2345 #if defined(USART_PRESC_PRESCALER) 2346 tmpreg = (uint16_t)(IRDA_DIV_SAMPLING16(
HAL_RCC_GetSysClockFreq(), hirda->Init.BaudRate, hirda->Init.ClockPrescaler));
2352 #if defined(USART_PRESC_PRESCALER) 2353 tmpreg = (uint16_t)(IRDA_DIV_SAMPLING16((uint32_t)LSE_VALUE, hirda->Init.BaudRate, hirda->Init.ClockPrescaler));
2355 tmpreg = (uint16_t)(IRDA_DIV_SAMPLING16((uint32_t)LSE_VALUE, hirda->Init.BaudRate));
2364 if ((tmpreg >= USART_BRR_MIN) && (tmpreg <= USART_BRR_MAX))
2366 hirda->Instance->BRR = tmpreg;
2387 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
2393 if ((hirda->Instance->CR1 & USART_CR1_TE) == USART_CR1_TE)
2403 if ((hirda->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE)
2414 hirda->gState = HAL_IRDA_STATE_READY;
2415 hirda->RxState = HAL_IRDA_STATE_READY;
2434 uint32_t Tickstart, uint32_t Timeout)
2437 while ((__HAL_IRDA_GET_FLAG(hirda, Flag) ? SET : RESET) == Status)
2440 if (Timeout != HAL_MAX_DELAY)
2442 if (((
HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
2445 #if defined(USART_CR1_FIFOEN) 2446 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE));
2448 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE));
2450 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
2452 hirda->gState = HAL_IRDA_STATE_READY;
2453 hirda->RxState = HAL_IRDA_STATE_READY;
2474 #if defined(USART_CR1_FIFOEN) 2475 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE));
2477 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
2481 hirda->gState = HAL_IRDA_STATE_READY;
2494 #if defined(USART_CR1_FIFOEN) 2495 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
2497 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
2499 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
2502 hirda->RxState = HAL_IRDA_STATE_READY;
2517 if (HAL_IS_BIT_CLR(hdma->
Instance->CCR, DMA_CCR_CIRC))
2519 hirda->TxXferCount = 0U;
2523 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT);
2526 SET_BIT(hirda->Instance->CR1, USART_CR1_TCIE);
2531 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 2533 hirda->TxCpltCallback(hirda);
2552 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 2554 hirda->TxHalfCpltCallback(hirda);
2572 if (HAL_IS_BIT_CLR(hdma->
Instance->CCR, DMA_CCR_CIRC))
2574 hirda->RxXferCount = 0U;
2577 CLEAR_BIT(hirda->Instance->CR1, USART_CR1_PEIE);
2578 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
2582 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAR);
2585 hirda->RxState = HAL_IRDA_STATE_READY;
2588 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 2590 hirda->RxCpltCallback(hirda);
2607 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 2609 hirda->RxHalfCpltCallback(hirda);
2627 if (hirda->gState == HAL_IRDA_STATE_BUSY_TX)
2629 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAT))
2631 hirda->TxXferCount = 0U;
2637 if (hirda->RxState == HAL_IRDA_STATE_BUSY_RX)
2639 if (HAL_IS_BIT_SET(hirda->Instance->CR3, USART_CR3_DMAR))
2641 hirda->RxXferCount = 0U;
2646 hirda->ErrorCode |= HAL_IRDA_ERROR_DMA;
2647 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 2649 hirda->ErrorCallback(hirda);
2665 hirda->RxXferCount = 0U;
2666 hirda->TxXferCount = 0U;
2668 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 2670 hirda->ErrorCallback(hirda);
2689 hirda->hdmatx->XferAbortCallback = NULL;
2692 if (hirda->hdmarx != NULL)
2694 if (hirda->hdmarx->XferAbortCallback != NULL)
2701 hirda->TxXferCount = 0U;
2702 hirda->RxXferCount = 0U;
2705 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
2708 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
2711 hirda->gState = HAL_IRDA_STATE_READY;
2712 hirda->RxState = HAL_IRDA_STATE_READY;
2715 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 2717 hirda->AbortCpltCallback(hirda);
2737 hirda->hdmarx->XferAbortCallback = NULL;
2740 if (hirda->hdmatx != NULL)
2742 if (hirda->hdmatx->XferAbortCallback != NULL)
2749 hirda->TxXferCount = 0U;
2750 hirda->RxXferCount = 0U;
2753 hirda->ErrorCode = HAL_IRDA_ERROR_NONE;
2756 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
2759 hirda->gState = HAL_IRDA_STATE_READY;
2760 hirda->RxState = HAL_IRDA_STATE_READY;
2763 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 2765 hirda->AbortCpltCallback(hirda);
2785 hirda->TxXferCount = 0U;
2788 hirda->gState = HAL_IRDA_STATE_READY;
2791 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 2793 hirda->AbortTransmitCpltCallback(hirda);
2812 hirda->RxXferCount = 0U;
2815 __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_CLEAR_OREF | IRDA_CLEAR_NEF | IRDA_CLEAR_PEF | IRDA_CLEAR_FEF);
2818 hirda->RxState = HAL_IRDA_STATE_READY;
2821 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 2823 hirda->AbortReceiveCpltCallback(hirda);
2843 if (hirda->gState == HAL_IRDA_STATE_BUSY_TX)
2845 if (hirda->TxXferCount == 0U)
2848 #if defined(USART_CR1_FIFOEN) 2849 CLEAR_BIT(hirda->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);
2851 CLEAR_BIT(hirda->Instance->CR1, USART_CR1_TXEIE);
2855 SET_BIT(hirda->Instance->CR1, USART_CR1_TCIE);
2859 if ((hirda->Init.WordLength == IRDA_WORDLENGTH_9B) && (hirda->Init.Parity == IRDA_PARITY_NONE))
2861 tmp = (uint16_t *) hirda->pTxBuffPtr;
2862 hirda->Instance->TDR = (uint16_t)(*tmp & 0x01FFU);
2863 hirda->pTxBuffPtr += 2U;
2867 hirda->Instance->TDR = (uint8_t)(*hirda->pTxBuffPtr & 0xFFU);
2868 hirda->pTxBuffPtr++;
2870 hirda->TxXferCount--;
2884 CLEAR_BIT(hirda->Instance->CR1, USART_CR1_TCIE);
2887 hirda->gState = HAL_IRDA_STATE_READY;
2889 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 2891 hirda->TxCpltCallback(hirda);
2909 uint16_t uhMask = hirda->Mask;
2913 if (hirda->RxState == HAL_IRDA_STATE_BUSY_RX)
2915 uhdata = (uint16_t) READ_REG(hirda->Instance->RDR);
2916 if ((hirda->Init.WordLength == IRDA_WORDLENGTH_9B) && (hirda->Init.Parity == IRDA_PARITY_NONE))
2918 tmp = (uint16_t *) hirda->pRxBuffPtr;
2919 *tmp = (uint16_t)(uhdata & uhMask);
2920 hirda->pRxBuffPtr += 2U;
2924 *hirda->pRxBuffPtr = (uint8_t)(uhdata & (uint8_t)uhMask);
2925 hirda->pRxBuffPtr++;
2928 hirda->RxXferCount--;
2929 if (hirda->RxXferCount == 0U)
2932 #if defined(USART_CR1_FIFOEN) 2933 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
2935 CLEAR_BIT(hirda->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
2939 CLEAR_BIT(hirda->Instance->CR3, USART_CR3_EIE);
2942 hirda->RxState = HAL_IRDA_STATE_READY;
2944 #if (USE_HAL_IRDA_REGISTER_CALLBACKS == 1) 2946 hirda->RxCpltCallback(hirda);
2956 __HAL_IRDA_SEND_REQ(hirda, IRDA_RXDATA_FLUSH_REQUEST);
HAL_StatusTypeDef HAL_IRDA_Receive_DMA(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size)
Receive an amount of data in DMA mode.
HAL_StatusTypeDef HAL_IRDA_DMAStop(IRDA_HandleTypeDef *hirda)
Stop the DMA Transfer.
void HAL_IRDA_AbortReceiveCpltCallback(IRDA_HandleTypeDef *hirda)
IRDA Abort Receive Complete callback.
static void IRDA_EndTransmit_IT(IRDA_HandleTypeDef *hirda)
Wrap up transmission in non-blocking mode.
static void IRDA_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma)
DMA IRDA Tx communication abort callback, when initiated by user by a call to HAL_IRDA_AbortTransmit_...
static void IRDA_DMAAbortOnError(DMA_HandleTypeDef *hdma)
DMA IRDA communication abort callback, when initiated by HAL services on Error (To be called at end o...
static HAL_StatusTypeDef IRDA_SetConfig(IRDA_HandleTypeDef *hirda)
Configure the IRDA peripheral.
DMA handle Structure definition.
HAL_StatusTypeDef HAL_IRDA_AbortTransmit_IT(IRDA_HandleTypeDef *hirda)
Abort ongoing Transmit transfer (Interrupt mode).
static HAL_StatusTypeDef IRDA_WaitOnFlagUntilTimeout(IRDA_HandleTypeDef *hirda, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
Handle IRDA Communication Timeout.
static void IRDA_EndRxTransfer(IRDA_HandleTypeDef *hirda)
End ongoing Rx transfer on UART peripheral (following error detection or Reception completion)...
This file contains all the functions prototypes for the HAL module driver.
static void IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda)
Send an amount of data in interrupt mode.
HAL_StatusTypeDef HAL_IRDA_Transmit(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size, uint32_t Timeout)
Send an amount of data in blocking mode.
void HAL_IRDA_MspInit(IRDA_HandleTypeDef *hirda)
Initialize the IRDA MSP.
HAL_StatusTypeDef HAL_IRDA_DeInit(IRDA_HandleTypeDef *hirda)
DeInitialize the IRDA peripheral.
HAL_StatusTypeDef HAL_IRDA_AbortReceive(IRDA_HandleTypeDef *hirda)
Abort ongoing Receive transfer (blocking mode).
void HAL_IRDA_RxHalfCpltCallback(IRDA_HandleTypeDef *hirda)
Rx Half Transfer complete callback.
static void IRDA_DMATxAbortCallback(DMA_HandleTypeDef *hdma)
DMA IRDA Tx communication abort callback, when initiated by user (To be called at end of DMA Tx Abort...
static void IRDA_DMAReceiveHalfCplt(DMA_HandleTypeDef *hdma)
DMA IRDA receive process half complete callback.
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
DMA_Channel_TypeDef * Instance
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer in Interrupt mode.
HAL_StatusTypeDef HAL_IRDA_RegisterCallback(IRDA_HandleTypeDef *hirda, HAL_IRDA_CallbackIDTypeDef CallbackID, pIRDA_CallbackTypeDef pCallback)
Register a User IRDA Callback To be used instead of the weak predefined callback. ...
uint32_t HAL_RCC_GetPCLK2Freq(void)
Return the PCLK2 frequency.
void HAL_IRDA_ErrorCallback(IRDA_HandleTypeDef *hirda)
IRDA error callback.
uint32_t HAL_IRDA_GetError(IRDA_HandleTypeDef *hirda)
Return the IRDA handle error code.
static void IRDA_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma)
DMA IRDA Rx communication abort callback, when initiated by user by a call to HAL_IRDA_AbortReceive_I...
static void IRDA_DMARxAbortCallback(DMA_HandleTypeDef *hdma)
DMA IRDA Rx communication abort callback, when initiated by user (To be called at end of DMA Rx Abort...
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
Start the DMA Transfer with interrupt enabled.
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
static void IRDA_EndTxTransfer(IRDA_HandleTypeDef *hirda)
End ongoing Tx transfer on IRDA peripheral (following error detection or Transmit completion)...
void HAL_IRDA_MspDeInit(IRDA_HandleTypeDef *hirda)
DeInitialize the IRDA MSP.
void HAL_IRDA_TxCpltCallback(IRDA_HandleTypeDef *hirda)
Tx Transfer completed callback.
void IRDA_InitCallbacksToDefault(IRDA_HandleTypeDef *hirda)
Initialize the callbacks to their default values.
void HAL_IRDA_TxHalfCpltCallback(IRDA_HandleTypeDef *hirda)
Tx Half Transfer completed callback.
HAL_StatusTypeDef HAL_IRDA_DMAPause(IRDA_HandleTypeDef *hirda)
Pause the DMA Transfer.
HAL_StatusTypeDef HAL_IRDA_Abort_IT(IRDA_HandleTypeDef *hirda)
Abort ongoing transfers (Interrupt mode).
IRDA_ClockSourceTypeDef
IRDA clock sources definition.
uint32_t HAL_IRDA_StateTypeDef
HAL IRDA State definition.
HAL_StatusTypeDef HAL_IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size)
Send an amount of data in interrupt mode.
void HAL_IRDA_AbortCpltCallback(IRDA_HandleTypeDef *hirda)
IRDA Abort Complete callback.
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
Abort the DMA Transfer.
struct __IRDA_HandleTypeDef else typedef struct endif IRDA_HandleTypeDef
IRDA handle Structure definition.
void(* pIRDA_CallbackTypeDef)(IRDA_HandleTypeDef *hirda)
HAL IRDA Callback pointer definition.
HAL_StatusTypeDef HAL_IRDA_Abort(IRDA_HandleTypeDef *hirda)
Abort ongoing transfers (blocking mode).
static void IRDA_DMATransmitCplt(DMA_HandleTypeDef *hdma)
DMA IRDA transmit process complete callback.
void HAL_IRDA_RxCpltCallback(IRDA_HandleTypeDef *hirda)
Rx Transfer completed callback.
HAL_IRDA_StateTypeDef HAL_IRDA_GetState(IRDA_HandleTypeDef *hirda)
Return the IRDA handle state.
HAL_StatusTypeDef HAL_IRDA_DMAResume(IRDA_HandleTypeDef *hirda)
Resume the DMA Transfer.
static HAL_StatusTypeDef IRDA_CheckIdleState(IRDA_HandleTypeDef *hirda)
Check the IRDA Idle State.
void HAL_IRDA_IRQHandler(IRDA_HandleTypeDef *hirda)
Handle IRDA interrupt request.
static void IRDA_DMATransmitHalfCplt(DMA_HandleTypeDef *hdma)
DMA IRDA transmit process half complete callback.
static void IRDA_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
DMA IRDA receive process complete callback.
static void IRDA_DMAError(DMA_HandleTypeDef *hdma)
DMA IRDA communication error callback.
HAL_StatusTypeDef HAL_IRDA_Receive_IT(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size)
Receive an amount of data in interrupt mode.
ADC handle Structure definition.
uint32_t HAL_RCC_GetSysClockFreq(void)
Return the SYSCLK frequency.
static void IRDA_Receive_IT(IRDA_HandleTypeDef *hirda)
Receive an amount of data in interrupt mode.
HAL_StatusTypeDef HAL_IRDA_AbortTransmit(IRDA_HandleTypeDef *hirda)
Abort ongoing Transmit transfer (blocking mode).
MODIFY_REG(hrtc->Instance->CR, RTC_CR_WUCKSEL,(uint32_t) WakeUpClock)
HAL_StatusTypeDef HAL_IRDA_Transmit_DMA(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size)
Send an amount of data in DMA mode.
HAL_StatusTypeDef HAL_IRDA_AbortReceive_IT(IRDA_HandleTypeDef *hirda)
Abort ongoing Receive transfer (Interrupt mode).
HAL_StatusTypeDef HAL_IRDA_Receive(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size, uint32_t Timeout)
Receive an amount of data in blocking mode.
uint32_t HAL_RCC_GetPCLK1Freq(void)
Return the PCLK1 frequency.
HAL_StatusTypeDef HAL_IRDA_UnRegisterCallback(IRDA_HandleTypeDef *hirda, HAL_IRDA_CallbackIDTypeDef CallbackID)
Unregister an IRDA callback IRDA callback is redirected to the weak predefined callback.
HAL_IRDA_CallbackIDTypeDef
HAL IRDA Callback ID enumeration definition.
HAL_StatusTypeDef HAL_IRDA_Init(IRDA_HandleTypeDef *hirda)
Initialize the IRDA mode according to the specified parameters in the IRDA_InitTypeDef and initialize...
void HAL_IRDA_AbortTransmitCpltCallback(IRDA_HandleTypeDef *hirda)
IRDA Abort Complete callback.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))
uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma)
Return the DMA error code.