226 #ifdef HAL_CAN_MODULE_ENABLED
228 #ifdef HAL_CAN_LEGACY_MODULE_ENABLED
229 #error "The CAN driver cannot be used with its legacy, Please enable only one CAN module at once"
237 #define CAN_TIMEOUT_VALUE 10U
238 #define CAN_WAKEUP_TIMEOUT_COUNTER 1000000U
286 assert_param(IS_CAN_ALL_INSTANCE(hcan->Instance));
287 assert_param(IS_FUNCTIONAL_STATE(hcan->Init.TimeTriggeredMode));
288 assert_param(IS_FUNCTIONAL_STATE(hcan->Init.AutoBusOff));
289 assert_param(IS_FUNCTIONAL_STATE(hcan->Init.AutoWakeUp));
290 assert_param(IS_FUNCTIONAL_STATE(hcan->Init.AutoRetransmission));
291 assert_param(IS_FUNCTIONAL_STATE(hcan->Init.ReceiveFifoLocked));
292 assert_param(IS_FUNCTIONAL_STATE(hcan->Init.TransmitFifoPriority));
293 assert_param(IS_CAN_MODE(hcan->Init.Mode));
294 assert_param(IS_CAN_SJW(hcan->Init.SyncJumpWidth));
295 assert_param(IS_CAN_BS1(hcan->Init.TimeSeg1));
296 assert_param(IS_CAN_BS2(hcan->Init.TimeSeg2));
297 assert_param(IS_CAN_PRESCALER(hcan->Init.Prescaler));
299 #if USE_HAL_CAN_REGISTER_CALLBACKS == 1
317 if (hcan->MspInitCallback == NULL)
323 hcan->MspInitCallback(hcan);
335 SET_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);
341 while ((hcan->Instance->MSR & CAN_MSR_INAK) == 0U)
343 if ((
HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
346 hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;
356 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);
362 while ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U)
364 if ((
HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
367 hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;
377 if (hcan->Init.TimeTriggeredMode == ENABLE)
379 SET_BIT(hcan->Instance->MCR, CAN_MCR_TTCM);
383 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_TTCM);
387 if (hcan->Init.AutoBusOff == ENABLE)
389 SET_BIT(hcan->Instance->MCR, CAN_MCR_ABOM);
393 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_ABOM);
397 if (hcan->Init.AutoWakeUp == ENABLE)
399 SET_BIT(hcan->Instance->MCR, CAN_MCR_AWUM);
403 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_AWUM);
407 if (hcan->Init.AutoRetransmission == ENABLE)
409 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_NART);
413 SET_BIT(hcan->Instance->MCR, CAN_MCR_NART);
417 if (hcan->Init.ReceiveFifoLocked == ENABLE)
419 SET_BIT(hcan->Instance->MCR, CAN_MCR_RFLM);
423 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_RFLM);
427 if (hcan->Init.TransmitFifoPriority == ENABLE)
429 SET_BIT(hcan->Instance->MCR, CAN_MCR_TXFP);
433 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_TXFP);
437 WRITE_REG(hcan->Instance->BTR, (uint32_t)(hcan->Init.Mode |
438 hcan->Init.SyncJumpWidth |
439 hcan->Init.TimeSeg1 |
440 hcan->Init.TimeSeg2 |
441 (hcan->Init.Prescaler - 1U)));
444 hcan->ErrorCode = HAL_CAN_ERROR_NONE;
469 assert_param(IS_CAN_ALL_INSTANCE(hcan->Instance));
474 #if USE_HAL_CAN_REGISTER_CALLBACKS == 1
475 if (hcan->MspDeInitCallback == NULL)
481 hcan->MspDeInitCallback(hcan);
489 SET_BIT(hcan->Instance->MCR, CAN_MCR_RESET);
492 hcan->ErrorCode = HAL_CAN_ERROR_NONE;
533 #if USE_HAL_CAN_REGISTER_CALLBACKS == 1
562 HAL_StatusTypeDef status = HAL_OK;
564 if (pCallback == NULL)
567 hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK;
577 hcan->TxMailbox0CompleteCallback = pCallback;
581 hcan->TxMailbox1CompleteCallback = pCallback;
585 hcan->TxMailbox2CompleteCallback = pCallback;
589 hcan->TxMailbox0AbortCallback = pCallback;
593 hcan->TxMailbox1AbortCallback = pCallback;
597 hcan->TxMailbox2AbortCallback = pCallback;
601 hcan->RxFifo0MsgPendingCallback = pCallback;
605 hcan->RxFifo0FullCallback = pCallback;
609 hcan->RxFifo1MsgPendingCallback = pCallback;
613 hcan->RxFifo1FullCallback = pCallback;
617 hcan->SleepCallback = pCallback;
621 hcan->WakeUpFromRxMsgCallback = pCallback;
625 hcan->ErrorCallback = pCallback;
629 hcan->MspInitCallback = pCallback;
633 hcan->MspDeInitCallback = pCallback;
638 hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK;
650 hcan->MspInitCallback = pCallback;
654 hcan->MspDeInitCallback = pCallback;
659 hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK;
669 hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK;
704 HAL_StatusTypeDef status = HAL_OK;
772 hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK;
793 hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK;
803 hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK;
842 uint32_t filternbrbitpos;
843 CAN_TypeDef *can_ip = hcan->Instance;
850 assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->
FilterIdHigh));
851 assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->
FilterIdLow));
853 assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->
FilterMaskIdLow));
854 assert_param(IS_CAN_FILTER_MODE(sFilterConfig->
FilterMode));
855 assert_param(IS_CAN_FILTER_SCALE(sFilterConfig->
FilterScale));
861 if (hcan->Instance == CAN3)
866 assert_param(IS_CAN_FILTER_BANK_SINGLE(sFilterConfig->
FilterBank));
875 assert_param(IS_CAN_FILTER_BANK_DUAL(sFilterConfig->
FilterBank));
884 assert_param(IS_CAN_FILTER_BANK_DUAL(sFilterConfig->
FilterBank));
890 assert_param(IS_CAN_FILTER_BANK_SINGLE(sFilterConfig->
FilterBank));
894 SET_BIT(can_ip->FMR, CAN_FMR_FINIT);
901 CLEAR_BIT(can_ip->FMR, CAN_FMR_CAN2SB);
907 CLEAR_BIT(can_ip->FMR, CAN_FMR_CAN2SB);
912 filternbrbitpos = (uint32_t)1 << (sFilterConfig->
FilterBank & 0x1FU);
915 CLEAR_BIT(can_ip->FA1R, filternbrbitpos);
918 if (sFilterConfig->
FilterScale == CAN_FILTERSCALE_16BIT)
921 CLEAR_BIT(can_ip->FS1R, filternbrbitpos);
925 can_ip->sFilterRegister[sFilterConfig->
FilterBank].FR1 =
927 (0x0000FFFFU & (uint32_t)sFilterConfig->
FilterIdLow);
931 can_ip->sFilterRegister[sFilterConfig->
FilterBank].FR2 =
936 if (sFilterConfig->
FilterScale == CAN_FILTERSCALE_32BIT)
939 SET_BIT(can_ip->FS1R, filternbrbitpos);
942 can_ip->sFilterRegister[sFilterConfig->
FilterBank].FR1 =
943 ((0x0000FFFFU & (uint32_t)sFilterConfig->
FilterIdHigh) << 16U) |
944 (0x0000FFFFU & (uint32_t)sFilterConfig->
FilterIdLow);
947 can_ip->sFilterRegister[sFilterConfig->
FilterBank].FR2 =
953 if (sFilterConfig->
FilterMode == CAN_FILTERMODE_IDMASK)
956 CLEAR_BIT(can_ip->FM1R, filternbrbitpos);
961 SET_BIT(can_ip->FM1R, filternbrbitpos);
968 CLEAR_BIT(can_ip->FFA1R, filternbrbitpos);
973 SET_BIT(can_ip->FFA1R, filternbrbitpos);
979 SET_BIT(can_ip->FA1R, filternbrbitpos);
983 CLEAR_BIT(can_ip->FMR, CAN_FMR_FINIT);
991 hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
1044 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);
1050 while ((hcan->Instance->MSR & CAN_MSR_INAK) != 0U)
1053 if ((
HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
1056 hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;
1066 hcan->ErrorCode = HAL_CAN_ERROR_NONE;
1074 hcan->ErrorCode |= HAL_CAN_ERROR_NOT_READY;
1093 SET_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);
1099 while ((hcan->Instance->MSR & CAN_MSR_INAK) == 0U)
1102 if ((
HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
1105 hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;
1115 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);
1126 hcan->ErrorCode |= HAL_CAN_ERROR_NOT_STARTED;
1149 SET_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);
1157 hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
1174 __IO uint32_t count = 0;
1181 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);
1190 if (count > CAN_WAKEUP_TIMEOUT_COUNTER)
1193 hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;
1197 }
while ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U);
1205 hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
1221 uint32_t status = 0U;
1228 if ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U)
1251 const uint8_t aData[], uint32_t *pTxMailbox)
1253 uint32_t transmitmailbox;
1255 uint32_t tsr = READ_REG(hcan->Instance->TSR);
1258 assert_param(IS_CAN_IDTYPE(pHeader->
IDE));
1259 assert_param(IS_CAN_RTR(pHeader->
RTR));
1260 assert_param(IS_CAN_DLC(pHeader->
DLC));
1261 if (pHeader->
IDE == CAN_ID_STD)
1263 assert_param(IS_CAN_STDID(pHeader->
StdId));
1267 assert_param(IS_CAN_EXTID(pHeader->
ExtId));
1275 if (((tsr & CAN_TSR_TME0) != 0U) ||
1276 ((tsr & CAN_TSR_TME1) != 0U) ||
1277 ((tsr & CAN_TSR_TME2) != 0U))
1280 transmitmailbox = (tsr & CAN_TSR_CODE) >> CAN_TSR_CODE_Pos;
1283 *pTxMailbox = (uint32_t)1 << transmitmailbox;
1286 if (pHeader->
IDE == CAN_ID_STD)
1288 hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->
StdId << CAN_TI0R_STID_Pos) |
1293 hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->
ExtId << CAN_TI0R_EXID_Pos) |
1299 hcan->Instance->sTxMailBox[transmitmailbox].TDTR = (pHeader->
DLC);
1304 SET_BIT(hcan->Instance->sTxMailBox[transmitmailbox].TDTR, CAN_TDT0R_TGT);
1308 WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDHR,
1309 ((uint32_t)aData[7] << CAN_TDH0R_DATA7_Pos) |
1310 ((uint32_t)aData[6] << CAN_TDH0R_DATA6_Pos) |
1311 ((uint32_t)aData[5] << CAN_TDH0R_DATA5_Pos) |
1312 ((uint32_t)aData[4] << CAN_TDH0R_DATA4_Pos));
1313 WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDLR,
1314 ((uint32_t)aData[3] << CAN_TDL0R_DATA3_Pos) |
1315 ((uint32_t)aData[2] << CAN_TDL0R_DATA2_Pos) |
1316 ((uint32_t)aData[1] << CAN_TDL0R_DATA1_Pos) |
1317 ((uint32_t)aData[0] << CAN_TDL0R_DATA0_Pos));
1320 SET_BIT(hcan->Instance->sTxMailBox[transmitmailbox].TIR, CAN_TI0R_TXRQ);
1328 hcan->ErrorCode |= HAL_CAN_ERROR_PARAM;
1336 hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
1355 assert_param(IS_CAN_TX_MAILBOX_LIST(TxMailboxes));
1361 if ((TxMailboxes & CAN_TX_MAILBOX0) != 0U)
1364 SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ0);
1368 if ((TxMailboxes & CAN_TX_MAILBOX1) != 0U)
1371 SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ1);
1375 if ((TxMailboxes & CAN_TX_MAILBOX2) != 0U)
1378 SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ2);
1387 hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
1401 uint32_t freelevel = 0U;
1408 if ((hcan->Instance->TSR & CAN_TSR_TME0) != 0U)
1414 if ((hcan->Instance->TSR & CAN_TSR_TME1) != 0U)
1420 if ((hcan->Instance->TSR & CAN_TSR_TME2) != 0U)
1444 uint32_t status = 0U;
1448 assert_param(IS_CAN_TX_MAILBOX_LIST(TxMailboxes));
1454 if ((hcan->Instance->TSR & (TxMailboxes << CAN_TSR_TME0_Pos)) != (TxMailboxes << CAN_TSR_TME0_Pos))
1476 uint32_t timestamp = 0U;
1477 uint32_t transmitmailbox;
1481 assert_param(IS_CAN_TX_MAILBOX(TxMailbox));
1487 transmitmailbox = POSITION_VAL(TxMailbox);
1490 timestamp = (hcan->Instance->sTxMailBox[transmitmailbox].TDTR & CAN_TDT0R_TIME) >> CAN_TDT0R_TIME_Pos;
1513 assert_param(IS_CAN_RX_FIFO(RxFifo));
1519 if (RxFifo == CAN_RX_FIFO0)
1522 if ((hcan->Instance->RF0R & CAN_RF0R_FMP0) == 0U)
1525 hcan->ErrorCode |= HAL_CAN_ERROR_PARAM;
1533 if ((hcan->Instance->RF1R & CAN_RF1R_FMP1) == 0U)
1536 hcan->ErrorCode |= HAL_CAN_ERROR_PARAM;
1543 pHeader->
IDE = CAN_RI0R_IDE & hcan->Instance->sFIFOMailBox[RxFifo].RIR;
1544 if (pHeader->
IDE == CAN_ID_STD)
1546 pHeader->
StdId = (CAN_RI0R_STID & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_TI0R_STID_Pos;
1550 pHeader->
ExtId = ((CAN_RI0R_EXID | CAN_RI0R_STID) &
1551 hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_RI0R_EXID_Pos;
1553 pHeader->
RTR = (CAN_RI0R_RTR & hcan->Instance->sFIFOMailBox[RxFifo].RIR);
1554 if (((CAN_RDT0R_DLC & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_DLC_Pos) >= 8U)
1561 pHeader->
DLC = (CAN_RDT0R_DLC & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_DLC_Pos;
1563 pHeader->
FilterMatchIndex = (CAN_RDT0R_FMI & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_FMI_Pos;
1564 pHeader->
Timestamp = (CAN_RDT0R_TIME & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_TIME_Pos;
1567 aData[0] = (uint8_t)((CAN_RDL0R_DATA0 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R_DATA0_Pos);
1568 aData[1] = (uint8_t)((CAN_RDL0R_DATA1 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R_DATA1_Pos);
1569 aData[2] = (uint8_t)((CAN_RDL0R_DATA2 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R_DATA2_Pos);
1570 aData[3] = (uint8_t)((CAN_RDL0R_DATA3 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R_DATA3_Pos);
1571 aData[4] = (uint8_t)((CAN_RDH0R_DATA4 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R_DATA4_Pos);
1572 aData[5] = (uint8_t)((CAN_RDH0R_DATA5 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R_DATA5_Pos);
1573 aData[6] = (uint8_t)((CAN_RDH0R_DATA6 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R_DATA6_Pos);
1574 aData[7] = (uint8_t)((CAN_RDH0R_DATA7 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R_DATA7_Pos);
1577 if (RxFifo == CAN_RX_FIFO0)
1580 SET_BIT(hcan->Instance->RF0R, CAN_RF0R_RFOM0);
1585 SET_BIT(hcan->Instance->RF1R, CAN_RF1R_RFOM1);
1594 hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
1610 uint32_t filllevel = 0U;
1614 assert_param(IS_CAN_RX_FIFO(RxFifo));
1619 if (RxFifo == CAN_RX_FIFO0)
1621 filllevel = hcan->Instance->RF0R & CAN_RF0R_FMP0;
1625 filllevel = hcan->Instance->RF1R & CAN_RF1R_FMP1;
1666 assert_param(IS_CAN_IT(ActiveITs));
1672 __HAL_CAN_ENABLE_IT(hcan, ActiveITs);
1680 hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
1699 assert_param(IS_CAN_IT(InactiveITs));
1705 __HAL_CAN_DISABLE_IT(hcan, InactiveITs);
1713 hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
1727 uint32_t errorcode = HAL_CAN_ERROR_NONE;
1728 uint32_t interrupts = READ_REG(hcan->Instance->IER);
1729 uint32_t msrflags = READ_REG(hcan->Instance->MSR);
1730 uint32_t tsrflags = READ_REG(hcan->Instance->TSR);
1731 uint32_t rf0rflags = READ_REG(hcan->Instance->RF0R);
1732 uint32_t rf1rflags = READ_REG(hcan->Instance->RF1R);
1733 uint32_t esrflags = READ_REG(hcan->Instance->ESR);
1736 if ((interrupts & CAN_IT_TX_MAILBOX_EMPTY) != 0U)
1739 if ((tsrflags & CAN_TSR_RQCP0) != 0U)
1742 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_RQCP0);
1744 if ((tsrflags & CAN_TSR_TXOK0) != 0U)
1747 #if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1749 hcan->TxMailbox0CompleteCallback(hcan);
1757 if ((tsrflags & CAN_TSR_ALST0) != 0U)
1760 errorcode |= HAL_CAN_ERROR_TX_ALST0;
1762 else if ((tsrflags & CAN_TSR_TERR0) != 0U)
1765 errorcode |= HAL_CAN_ERROR_TX_TERR0;
1770 #if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1772 hcan->TxMailbox0AbortCallback(hcan);
1782 if ((tsrflags & CAN_TSR_RQCP1) != 0U)
1785 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_RQCP1);
1787 if ((tsrflags & CAN_TSR_TXOK1) != 0U)
1790 #if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1792 hcan->TxMailbox1CompleteCallback(hcan);
1800 if ((tsrflags & CAN_TSR_ALST1) != 0U)
1803 errorcode |= HAL_CAN_ERROR_TX_ALST1;
1805 else if ((tsrflags & CAN_TSR_TERR1) != 0U)
1808 errorcode |= HAL_CAN_ERROR_TX_TERR1;
1813 #if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1815 hcan->TxMailbox1AbortCallback(hcan);
1825 if ((tsrflags & CAN_TSR_RQCP2) != 0U)
1828 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_RQCP2);
1830 if ((tsrflags & CAN_TSR_TXOK2) != 0U)
1833 #if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1835 hcan->TxMailbox2CompleteCallback(hcan);
1843 if ((tsrflags & CAN_TSR_ALST2) != 0U)
1846 errorcode |= HAL_CAN_ERROR_TX_ALST2;
1848 else if ((tsrflags & CAN_TSR_TERR2) != 0U)
1851 errorcode |= HAL_CAN_ERROR_TX_TERR2;
1856 #if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1858 hcan->TxMailbox2AbortCallback(hcan);
1869 if ((interrupts & CAN_IT_RX_FIFO0_OVERRUN) != 0U)
1871 if ((rf0rflags & CAN_RF0R_FOVR0) != 0U)
1874 errorcode |= HAL_CAN_ERROR_RX_FOV0;
1877 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV0);
1882 if ((interrupts & CAN_IT_RX_FIFO0_FULL) != 0U)
1884 if ((rf0rflags & CAN_RF0R_FULL0) != 0U)
1887 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FF0);
1890 #if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1892 hcan->RxFifo0FullCallback(hcan);
1901 if ((interrupts & CAN_IT_RX_FIFO0_MSG_PENDING) != 0U)
1904 if ((hcan->Instance->RF0R & CAN_RF0R_FMP0) != 0U)
1907 #if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1909 hcan->RxFifo0MsgPendingCallback(hcan);
1918 if ((interrupts & CAN_IT_RX_FIFO1_OVERRUN) != 0U)
1920 if ((rf1rflags & CAN_RF1R_FOVR1) != 0U)
1923 errorcode |= HAL_CAN_ERROR_RX_FOV1;
1926 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV1);
1931 if ((interrupts & CAN_IT_RX_FIFO1_FULL) != 0U)
1933 if ((rf1rflags & CAN_RF1R_FULL1) != 0U)
1936 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FF1);
1939 #if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1941 hcan->RxFifo1FullCallback(hcan);
1950 if ((interrupts & CAN_IT_RX_FIFO1_MSG_PENDING) != 0U)
1953 if ((hcan->Instance->RF1R & CAN_RF1R_FMP1) != 0U)
1956 #if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1958 hcan->RxFifo1MsgPendingCallback(hcan);
1967 if ((interrupts & CAN_IT_SLEEP_ACK) != 0U)
1969 if ((msrflags & CAN_MSR_SLAKI) != 0U)
1972 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_SLAKI);
1975 #if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1977 hcan->SleepCallback(hcan);
1986 if ((interrupts & CAN_IT_WAKEUP) != 0U)
1988 if ((msrflags & CAN_MSR_WKUI) != 0U)
1991 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_WKU);
1994 #if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1996 hcan->WakeUpFromRxMsgCallback(hcan);
2005 if ((interrupts & CAN_IT_ERROR) != 0U)
2007 if ((msrflags & CAN_MSR_ERRI) != 0U)
2010 if (((interrupts & CAN_IT_ERROR_WARNING) != 0U) &&
2011 ((esrflags & CAN_ESR_EWGF) != 0U))
2014 errorcode |= HAL_CAN_ERROR_EWG;
2020 if (((interrupts & CAN_IT_ERROR_PASSIVE) != 0U) &&
2021 ((esrflags & CAN_ESR_EPVF) != 0U))
2024 errorcode |= HAL_CAN_ERROR_EPV;
2030 if (((interrupts & CAN_IT_BUSOFF) != 0U) &&
2031 ((esrflags & CAN_ESR_BOFF) != 0U))
2034 errorcode |= HAL_CAN_ERROR_BOF;
2040 if (((interrupts & CAN_IT_LAST_ERROR_CODE) != 0U) &&
2041 ((esrflags & CAN_ESR_LEC) != 0U))
2043 switch (esrflags & CAN_ESR_LEC)
2045 case (CAN_ESR_LEC_0):
2047 errorcode |= HAL_CAN_ERROR_STF;
2049 case (CAN_ESR_LEC_1):
2051 errorcode |= HAL_CAN_ERROR_FOR;
2053 case (CAN_ESR_LEC_1 | CAN_ESR_LEC_0):
2055 errorcode |= HAL_CAN_ERROR_ACK;
2057 case (CAN_ESR_LEC_2):
2059 errorcode |= HAL_CAN_ERROR_BR;
2061 case (CAN_ESR_LEC_2 | CAN_ESR_LEC_0):
2063 errorcode |= HAL_CAN_ERROR_BD;
2065 case (CAN_ESR_LEC_2 | CAN_ESR_LEC_1):
2067 errorcode |= HAL_CAN_ERROR_CRC;
2074 CLEAR_BIT(hcan->Instance->ESR, CAN_ESR_LEC);
2079 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_ERRI);
2083 if (errorcode != HAL_CAN_ERROR_NONE)
2086 hcan->ErrorCode |= errorcode;
2089 #if USE_HAL_CAN_REGISTER_CALLBACKS == 1
2091 hcan->ErrorCallback(hcan);
2384 if ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U)
2390 else if ((hcan->Instance->MCR & CAN_MCR_SLEEP) != 0U)
2414 return hcan->ErrorCode;
2425 HAL_StatusTypeDef status = HAL_OK;
2432 hcan->ErrorCode = 0U;
2437 hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
HAL_StatusTypeDef HAL_CAN_RegisterCallback(CAN_HandleTypeDef *hcan, HAL_CAN_CallbackIDTypeDef CallbackID, void(*pCallback)(CAN_HandleTypeDef *_hcan))
Register a CAN CallBack. To be used instead of the weak predefined callback.
HAL_StatusTypeDef HAL_CAN_UnRegisterCallback(CAN_HandleTypeDef *hcan, HAL_CAN_CallbackIDTypeDef CallbackID)
Unregister a CAN CallBack. CAN callback is redirected to the weak predefined callback.
HAL_StatusTypeDef HAL_CAN_DeInit(CAN_HandleTypeDef *hcan)
Deinitializes the CAN peripheral registers to their default reset values.
void HAL_CAN_MspDeInit(CAN_HandleTypeDef *hcan)
DeInitializes the CAN MSP.
HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef *hcan)
Initializes the CAN peripheral according to the specified parameters in the CAN_InitStruct.
void HAL_CAN_MspInit(CAN_HandleTypeDef *hcan)
Initializes the CAN MSP.
HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan, const CAN_FilterTypeDef *sFilterConfig)
Configures the CAN reception filter according to the specified parameters in the CAN_FilterInitStruct...
uint32_t HAL_CAN_GetTxTimestamp(const CAN_HandleTypeDef *hcan, uint32_t TxMailbox)
Return timestamp of Tx message sent, if time triggered communication mode is enabled.
uint32_t HAL_CAN_GetTxMailboxesFreeLevel(const CAN_HandleTypeDef *hcan)
Return Tx Mailboxes free level: number of free Tx Mailboxes.
HAL_StatusTypeDef HAL_CAN_Start(CAN_HandleTypeDef *hcan)
Start the CAN module.
uint32_t HAL_CAN_IsTxMessagePending(const CAN_HandleTypeDef *hcan, uint32_t TxMailboxes)
Check if a transmission request is pending on the selected Tx Mailboxes.
uint32_t HAL_CAN_IsSleepActive(const CAN_HandleTypeDef *hcan)
Check is sleep mode is active.
uint32_t HAL_CAN_GetRxFifoFillLevel(const CAN_HandleTypeDef *hcan, uint32_t RxFifo)
Return Rx FIFO fill level.
HAL_StatusTypeDef HAL_CAN_AbortTxRequest(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes)
Abort transmission requests.
HAL_StatusTypeDef HAL_CAN_Stop(CAN_HandleTypeDef *hcan)
Stop the CAN module and enable access to configuration registers.
HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan, const CAN_TxHeaderTypeDef *pHeader, const uint8_t aData[], uint32_t *pTxMailbox)
Add a message to the first free Tx mailbox and activate the corresponding transmission request.
HAL_StatusTypeDef HAL_CAN_RequestSleep(CAN_HandleTypeDef *hcan)
Request the sleep mode (low power) entry. When returning from this function, Sleep mode will be enter...
HAL_StatusTypeDef HAL_CAN_WakeUp(CAN_HandleTypeDef *hcan)
Wake up from sleep mode. When returning with HAL_OK status from this function, Sleep mode is exited.
HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, CAN_RxHeaderTypeDef *pHeader, uint8_t aData[])
Get an CAN frame from the Rx FIFO zone into the message RAM.
HAL_StatusTypeDef HAL_CAN_DeactivateNotification(CAN_HandleTypeDef *hcan, uint32_t InactiveITs)
Disable interrupts.
HAL_StatusTypeDef HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan, uint32_t ActiveITs)
Enable interrupts.
void HAL_CAN_IRQHandler(CAN_HandleTypeDef *hcan)
Handles CAN interrupt request.
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
Rx FIFO 0 message pending callback.
void HAL_CAN_RxFifo1FullCallback(CAN_HandleTypeDef *hcan)
Rx FIFO 1 full callback.
void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan)
Transmission Mailbox 0 complete callback.
void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan)
Error CAN callback.
void HAL_CAN_TxMailbox1AbortCallback(CAN_HandleTypeDef *hcan)
Transmission Mailbox 1 Cancellation callback.
void HAL_CAN_WakeUpFromRxMsgCallback(CAN_HandleTypeDef *hcan)
WakeUp from Rx message callback.
void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan)
Transmission Mailbox 1 complete callback.
void HAL_CAN_RxFifo0FullCallback(CAN_HandleTypeDef *hcan)
Rx FIFO 0 full callback.
void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan)
Transmission Mailbox 2 complete callback.
void HAL_CAN_SleepCallback(CAN_HandleTypeDef *hcan)
Sleep callback.
void HAL_CAN_TxMailbox2AbortCallback(CAN_HandleTypeDef *hcan)
Transmission Mailbox 2 Cancellation callback.
void HAL_CAN_TxMailbox0AbortCallback(CAN_HandleTypeDef *hcan)
Transmission Mailbox 0 Cancellation callback.
void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan)
Rx FIFO 1 message pending callback.
HAL_StatusTypeDef HAL_CAN_ResetError(CAN_HandleTypeDef *hcan)
Reset the CAN error code.
HAL_CAN_StateTypeDef HAL_CAN_GetState(const CAN_HandleTypeDef *hcan)
Return the CAN state.
uint32_t HAL_CAN_GetError(const CAN_HandleTypeDef *hcan)
Return the CAN error code.
uint32_t FilterActivation
uint32_t FilterMaskIdHigh
uint32_t FilterFIFOAssignment
uint32_t SlaveStartFilterBank
FunctionalState TransmitGlobalTime
uint32_t FilterMatchIndex
HAL_CAN_StateTypeDef
HAL State structures definition.
struct __CAN_HandleTypeDef else typedef struct endif CAN_HandleTypeDef
CAN handle Structure definition.
HAL_CAN_CallbackIDTypeDef
HAL CAN common Callback ID enumeration definition.
@ HAL_CAN_STATE_LISTENING
@ HAL_CAN_STATE_SLEEP_ACTIVE
@ HAL_CAN_STATE_SLEEP_PENDING
@ HAL_CAN_WAKEUP_FROM_RX_MSG_CB_ID
@ HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID
@ HAL_CAN_RX_FIFO0_FULL_CB_ID
@ HAL_CAN_TX_MAILBOX2_ABORT_CB_ID
@ HAL_CAN_TX_MAILBOX1_COMPLETE_CB_ID
@ HAL_CAN_TX_MAILBOX0_COMPLETE_CB_ID
@ HAL_CAN_MSPDEINIT_CB_ID
@ HAL_CAN_TX_MAILBOX1_ABORT_CB_ID
@ HAL_CAN_RX_FIFO1_MSG_PENDING_CB_ID
@ HAL_CAN_TX_MAILBOX2_COMPLETE_CB_ID
@ HAL_CAN_TX_MAILBOX0_ABORT_CB_ID
@ HAL_CAN_RX_FIFO1_FULL_CB_ID
CAN filter configuration structure definition.
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
This file contains all the functions prototypes for the HAL module driver.