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
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));
299#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
300 if (hcan->State == HAL_CAN_STATE_RESET)
303 hcan->RxFifo0MsgPendingCallback = HAL_CAN_RxFifo0MsgPendingCallback;
304 hcan->RxFifo0FullCallback = HAL_CAN_RxFifo0FullCallback;
305 hcan->RxFifo1MsgPendingCallback = HAL_CAN_RxFifo1MsgPendingCallback;
306 hcan->RxFifo1FullCallback = HAL_CAN_RxFifo1FullCallback;
307 hcan->TxMailbox0CompleteCallback = HAL_CAN_TxMailbox0CompleteCallback;
308 hcan->TxMailbox1CompleteCallback = HAL_CAN_TxMailbox1CompleteCallback;
309 hcan->TxMailbox2CompleteCallback = HAL_CAN_TxMailbox2CompleteCallback;
310 hcan->TxMailbox0AbortCallback = HAL_CAN_TxMailbox0AbortCallback;
311 hcan->TxMailbox1AbortCallback = HAL_CAN_TxMailbox1AbortCallback;
312 hcan->TxMailbox2AbortCallback = HAL_CAN_TxMailbox2AbortCallback;
313 hcan->SleepCallback = HAL_CAN_SleepCallback;
314 hcan->WakeUpFromRxMsgCallback = HAL_CAN_WakeUpFromRxMsgCallback;
315 hcan->ErrorCallback = HAL_CAN_ErrorCallback;
317 if (hcan->MspInitCallback == NULL)
319 hcan->MspInitCallback = HAL_CAN_MspInit;
323 hcan->MspInitCallback(hcan);
327 if (hcan->State == HAL_CAN_STATE_RESET)
330 HAL_CAN_MspInit(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;
349 hcan->State = HAL_CAN_STATE_ERROR;
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;
370 hcan->State = HAL_CAN_STATE_ERROR;
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;
447 hcan->State = HAL_CAN_STATE_READY;
472 (void)HAL_CAN_Stop(hcan);
474#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
475 if (hcan->MspDeInitCallback == NULL)
477 hcan->MspDeInitCallback = HAL_CAN_MspDeInit;
481 hcan->MspDeInitCallback(hcan);
485 HAL_CAN_MspDeInit(hcan);
489 SET_BIT(hcan->Instance->MCR, CAN_MCR_RESET);
492 hcan->ErrorCode = HAL_CAN_ERROR_NONE;
495 hcan->State = HAL_CAN_STATE_RESET;
507__weak
void HAL_CAN_MspInit(CAN_HandleTypeDef *hcan)
523__weak
void HAL_CAN_MspDeInit(CAN_HandleTypeDef *hcan)
533#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
559HAL_StatusTypeDef HAL_CAN_RegisterCallback(CAN_HandleTypeDef *hcan, HAL_CAN_CallbackIDTypeDef CallbackID,
560 void (* pCallback)(CAN_HandleTypeDef *_hcan))
564 if (pCallback == NULL)
567 hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK;
572 if (hcan->State == HAL_CAN_STATE_READY)
576 case HAL_CAN_TX_MAILBOX0_COMPLETE_CB_ID :
577 hcan->TxMailbox0CompleteCallback = pCallback;
580 case HAL_CAN_TX_MAILBOX1_COMPLETE_CB_ID :
581 hcan->TxMailbox1CompleteCallback = pCallback;
584 case HAL_CAN_TX_MAILBOX2_COMPLETE_CB_ID :
585 hcan->TxMailbox2CompleteCallback = pCallback;
588 case HAL_CAN_TX_MAILBOX0_ABORT_CB_ID :
589 hcan->TxMailbox0AbortCallback = pCallback;
592 case HAL_CAN_TX_MAILBOX1_ABORT_CB_ID :
593 hcan->TxMailbox1AbortCallback = pCallback;
596 case HAL_CAN_TX_MAILBOX2_ABORT_CB_ID :
597 hcan->TxMailbox2AbortCallback = pCallback;
600 case HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID :
601 hcan->RxFifo0MsgPendingCallback = pCallback;
604 case HAL_CAN_RX_FIFO0_FULL_CB_ID :
605 hcan->RxFifo0FullCallback = pCallback;
608 case HAL_CAN_RX_FIFO1_MSG_PENDING_CB_ID :
609 hcan->RxFifo1MsgPendingCallback = pCallback;
612 case HAL_CAN_RX_FIFO1_FULL_CB_ID :
613 hcan->RxFifo1FullCallback = pCallback;
616 case HAL_CAN_SLEEP_CB_ID :
617 hcan->SleepCallback = pCallback;
620 case HAL_CAN_WAKEUP_FROM_RX_MSG_CB_ID :
621 hcan->WakeUpFromRxMsgCallback = pCallback;
624 case HAL_CAN_ERROR_CB_ID :
625 hcan->ErrorCallback = pCallback;
628 case HAL_CAN_MSPINIT_CB_ID :
629 hcan->MspInitCallback = pCallback;
632 case HAL_CAN_MSPDEINIT_CB_ID :
633 hcan->MspDeInitCallback = pCallback;
638 hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK;
645 else if (hcan->State == HAL_CAN_STATE_RESET)
649 case HAL_CAN_MSPINIT_CB_ID :
650 hcan->MspInitCallback = pCallback;
653 case HAL_CAN_MSPDEINIT_CB_ID :
654 hcan->MspDeInitCallback = pCallback;
659 hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK;
669 hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK;
702HAL_StatusTypeDef HAL_CAN_UnRegisterCallback(CAN_HandleTypeDef *hcan, HAL_CAN_CallbackIDTypeDef CallbackID)
706 if (hcan->State == HAL_CAN_STATE_READY)
710 case HAL_CAN_TX_MAILBOX0_COMPLETE_CB_ID :
711 hcan->TxMailbox0CompleteCallback = HAL_CAN_TxMailbox0CompleteCallback;
714 case HAL_CAN_TX_MAILBOX1_COMPLETE_CB_ID :
715 hcan->TxMailbox1CompleteCallback = HAL_CAN_TxMailbox1CompleteCallback;
718 case HAL_CAN_TX_MAILBOX2_COMPLETE_CB_ID :
719 hcan->TxMailbox2CompleteCallback = HAL_CAN_TxMailbox2CompleteCallback;
722 case HAL_CAN_TX_MAILBOX0_ABORT_CB_ID :
723 hcan->TxMailbox0AbortCallback = HAL_CAN_TxMailbox0AbortCallback;
726 case HAL_CAN_TX_MAILBOX1_ABORT_CB_ID :
727 hcan->TxMailbox1AbortCallback = HAL_CAN_TxMailbox1AbortCallback;
730 case HAL_CAN_TX_MAILBOX2_ABORT_CB_ID :
731 hcan->TxMailbox2AbortCallback = HAL_CAN_TxMailbox2AbortCallback;
734 case HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID :
735 hcan->RxFifo0MsgPendingCallback = HAL_CAN_RxFifo0MsgPendingCallback;
738 case HAL_CAN_RX_FIFO0_FULL_CB_ID :
739 hcan->RxFifo0FullCallback = HAL_CAN_RxFifo0FullCallback;
742 case HAL_CAN_RX_FIFO1_MSG_PENDING_CB_ID :
743 hcan->RxFifo1MsgPendingCallback = HAL_CAN_RxFifo1MsgPendingCallback;
746 case HAL_CAN_RX_FIFO1_FULL_CB_ID :
747 hcan->RxFifo1FullCallback = HAL_CAN_RxFifo1FullCallback;
750 case HAL_CAN_SLEEP_CB_ID :
751 hcan->SleepCallback = HAL_CAN_SleepCallback;
754 case HAL_CAN_WAKEUP_FROM_RX_MSG_CB_ID :
755 hcan->WakeUpFromRxMsgCallback = HAL_CAN_WakeUpFromRxMsgCallback;
758 case HAL_CAN_ERROR_CB_ID :
759 hcan->ErrorCallback = HAL_CAN_ErrorCallback;
762 case HAL_CAN_MSPINIT_CB_ID :
763 hcan->MspInitCallback = HAL_CAN_MspInit;
766 case HAL_CAN_MSPDEINIT_CB_ID :
767 hcan->MspDeInitCallback = HAL_CAN_MspDeInit;
772 hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK;
779 else if (hcan->State == HAL_CAN_STATE_RESET)
783 case HAL_CAN_MSPINIT_CB_ID :
784 hcan->MspInitCallback = HAL_CAN_MspInit;
787 case HAL_CAN_MSPDEINIT_CB_ID :
788 hcan->MspDeInitCallback = HAL_CAN_MspDeInit;
793 hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK;
803 hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK;
840HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan,
const CAN_FilterTypeDef *sFilterConfig)
842 uint32_t filternbrbitpos;
844 HAL_CAN_StateTypeDef state = hcan->State;
846 if ((state == HAL_CAN_STATE_READY) ||
847 (state == HAL_CAN_STATE_LISTENING))
850 assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->FilterIdHigh));
851 assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->FilterIdLow));
852 assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->FilterMaskIdHigh));
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));
856 assert_param(IS_CAN_FILTER_FIFO(sFilterConfig->FilterFIFOAssignment));
857 assert_param(IS_CAN_FILTER_ACTIVATION(sFilterConfig->FilterActivation));
861 if (hcan->Instance == CAN3)
864 can_ip = hcan->Instance;
867 assert_param(IS_CAN_FILTER_BANK_SINGLE(sFilterConfig->FilterBank));
876 assert_param(IS_CAN_FILTER_BANK_DUAL(sFilterConfig->FilterBank));
877 assert_param(IS_CAN_FILTER_BANK_DUAL(sFilterConfig->SlaveStartFilterBank));
885 assert_param(IS_CAN_FILTER_BANK_DUAL(sFilterConfig->FilterBank));
886 assert_param(IS_CAN_FILTER_BANK_DUAL(sFilterConfig->SlaveStartFilterBank));
889 can_ip = hcan->Instance;
892 assert_param(IS_CAN_FILTER_BANK_SINGLE(sFilterConfig->FilterBank));
896 SET_BIT(can_ip->FMR, CAN_FMR_FINIT);
903 CLEAR_BIT(can_ip->FMR, CAN_FMR_CAN2SB);
904 SET_BIT(can_ip->FMR, sFilterConfig->SlaveStartFilterBank << CAN_FMR_CAN2SB_Pos);
909 CLEAR_BIT(can_ip->FMR, CAN_FMR_CAN2SB);
910 SET_BIT(can_ip->FMR, sFilterConfig->SlaveStartFilterBank << CAN_FMR_CAN2SB_Pos);
914 filternbrbitpos = (uint32_t)1 << (sFilterConfig->FilterBank & 0x1FU);
917 CLEAR_BIT(can_ip->FA1R, filternbrbitpos);
920 if (sFilterConfig->FilterScale == CAN_FILTERSCALE_16BIT)
923 CLEAR_BIT(can_ip->FS1R, filternbrbitpos);
927 can_ip->sFilterRegister[sFilterConfig->FilterBank].FR1 =
928 ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow) << 16U) |
929 (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdLow);
933 can_ip->sFilterRegister[sFilterConfig->FilterBank].FR2 =
934 ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) |
935 (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh);
938 if (sFilterConfig->FilterScale == CAN_FILTERSCALE_32BIT)
941 SET_BIT(can_ip->FS1R, filternbrbitpos);
944 can_ip->sFilterRegister[sFilterConfig->FilterBank].FR1 =
945 ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh) << 16U) |
946 (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdLow);
949 can_ip->sFilterRegister[sFilterConfig->FilterBank].FR2 =
950 ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) |
951 (0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow);
955 if (sFilterConfig->FilterMode == CAN_FILTERMODE_IDMASK)
958 CLEAR_BIT(can_ip->FM1R, filternbrbitpos);
963 SET_BIT(can_ip->FM1R, filternbrbitpos);
967 if (sFilterConfig->FilterFIFOAssignment == CAN_FILTER_FIFO0)
970 CLEAR_BIT(can_ip->FFA1R, filternbrbitpos);
975 SET_BIT(can_ip->FFA1R, filternbrbitpos);
979 if (sFilterConfig->FilterActivation == CAN_FILTER_ENABLE)
981 SET_BIT(can_ip->FA1R, filternbrbitpos);
985 CLEAR_BIT(can_ip->FMR, CAN_FMR_FINIT);
993 hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
1040 if (hcan->State == HAL_CAN_STATE_READY)
1043 hcan->State = HAL_CAN_STATE_LISTENING;
1046 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);
1052 while ((hcan->Instance->MSR & CAN_MSR_INAK) != 0U)
1055 if ((
HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
1058 hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;
1061 hcan->State = HAL_CAN_STATE_ERROR;
1068 hcan->ErrorCode = HAL_CAN_ERROR_NONE;
1076 hcan->ErrorCode |= HAL_CAN_ERROR_NOT_READY;
1092 if (hcan->State == HAL_CAN_STATE_LISTENING)
1095 SET_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);
1101 while ((hcan->Instance->MSR & CAN_MSR_INAK) == 0U)
1104 if ((
HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
1107 hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;
1110 hcan->State = HAL_CAN_STATE_ERROR;
1117 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);
1120 hcan->State = HAL_CAN_STATE_READY;
1128 hcan->ErrorCode |= HAL_CAN_ERROR_NOT_STARTED;
1145 HAL_CAN_StateTypeDef state = hcan->State;
1147 if ((state == HAL_CAN_STATE_READY) ||
1148 (state == HAL_CAN_STATE_LISTENING))
1151 SET_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);
1159 hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
1176 __IO uint32_t count = 0;
1177 HAL_CAN_StateTypeDef state = hcan->State;
1179 if ((state == HAL_CAN_STATE_READY) ||
1180 (state == HAL_CAN_STATE_LISTENING))
1183 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);
1192 if (count > CAN_WAKEUP_TIMEOUT_COUNTER)
1195 hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;
1199 }
while ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U);
1207 hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
1221uint32_t HAL_CAN_IsSleepActive(
const CAN_HandleTypeDef *hcan)
1223 uint32_t status = 0U;
1224 HAL_CAN_StateTypeDef state = hcan->State;
1226 if ((state == HAL_CAN_STATE_READY) ||
1227 (state == HAL_CAN_STATE_LISTENING))
1230 if ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U)
1252HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan,
const CAN_TxHeaderTypeDef *pHeader,
1253 const uint8_t aData[], uint32_t *pTxMailbox)
1255 uint32_t transmitmailbox;
1256 HAL_CAN_StateTypeDef state = hcan->State;
1257 uint32_t tsr = READ_REG(hcan->Instance->TSR);
1263 if (pHeader->IDE == CAN_ID_STD)
1271 assert_param(IS_FUNCTIONAL_STATE(pHeader->TransmitGlobalTime));
1273 if ((state == HAL_CAN_STATE_READY) ||
1274 (state == HAL_CAN_STATE_LISTENING))
1277 if (((tsr & CAN_TSR_TME0) != 0U) ||
1278 ((tsr & CAN_TSR_TME1) != 0U) ||
1279 ((tsr & CAN_TSR_TME2) != 0U))
1282 transmitmailbox = (tsr & CAN_TSR_CODE) >> CAN_TSR_CODE_Pos;
1285 *pTxMailbox = (uint32_t)1 << transmitmailbox;
1288 if (pHeader->IDE == CAN_ID_STD)
1290 hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->StdId << CAN_TI0R_STID_Pos) |
1295 hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->ExtId << CAN_TI0R_EXID_Pos) |
1301 hcan->Instance->sTxMailBox[transmitmailbox].TDTR = (pHeader->DLC);
1304 if (pHeader->TransmitGlobalTime == ENABLE)
1306 SET_BIT(hcan->Instance->sTxMailBox[transmitmailbox].TDTR, CAN_TDT0R_TGT);
1310 WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDHR,
1311 ((uint32_t)aData[7] << CAN_TDH0R_DATA7_Pos) |
1312 ((uint32_t)aData[6] << CAN_TDH0R_DATA6_Pos) |
1313 ((uint32_t)aData[5] << CAN_TDH0R_DATA5_Pos) |
1314 ((uint32_t)aData[4] << CAN_TDH0R_DATA4_Pos));
1315 WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDLR,
1316 ((uint32_t)aData[3] << CAN_TDL0R_DATA3_Pos) |
1317 ((uint32_t)aData[2] << CAN_TDL0R_DATA2_Pos) |
1318 ((uint32_t)aData[1] << CAN_TDL0R_DATA1_Pos) |
1319 ((uint32_t)aData[0] << CAN_TDL0R_DATA0_Pos));
1322 SET_BIT(hcan->Instance->sTxMailBox[transmitmailbox].TIR, CAN_TI0R_TXRQ);
1330 hcan->ErrorCode |= HAL_CAN_ERROR_PARAM;
1338 hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
1352HAL_StatusTypeDef HAL_CAN_AbortTxRequest(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes)
1354 HAL_CAN_StateTypeDef state = hcan->State;
1359 if ((state == HAL_CAN_STATE_READY) ||
1360 (state == HAL_CAN_STATE_LISTENING))
1363 if ((TxMailboxes & CAN_TX_MAILBOX0) != 0U)
1366 SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ0);
1370 if ((TxMailboxes & CAN_TX_MAILBOX1) != 0U)
1373 SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ1);
1377 if ((TxMailboxes & CAN_TX_MAILBOX2) != 0U)
1380 SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ2);
1389 hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
1401uint32_t HAL_CAN_GetTxMailboxesFreeLevel(
const CAN_HandleTypeDef *hcan)
1403 uint32_t freelevel = 0U;
1404 HAL_CAN_StateTypeDef state = hcan->State;
1406 if ((state == HAL_CAN_STATE_READY) ||
1407 (state == HAL_CAN_STATE_LISTENING))
1410 if ((hcan->Instance->TSR & CAN_TSR_TME0) != 0U)
1416 if ((hcan->Instance->TSR & CAN_TSR_TME1) != 0U)
1422 if ((hcan->Instance->TSR & CAN_TSR_TME2) != 0U)
1444uint32_t HAL_CAN_IsTxMessagePending(
const CAN_HandleTypeDef *hcan, uint32_t TxMailboxes)
1446 uint32_t status = 0U;
1447 HAL_CAN_StateTypeDef state = hcan->State;
1452 if ((state == HAL_CAN_STATE_READY) ||
1453 (state == HAL_CAN_STATE_LISTENING))
1456 if ((hcan->Instance->TSR & (TxMailboxes << CAN_TSR_TME0_Pos)) != (TxMailboxes << CAN_TSR_TME0_Pos))
1476uint32_t HAL_CAN_GetTxTimestamp(
const CAN_HandleTypeDef *hcan, uint32_t TxMailbox)
1478 uint32_t timestamp = 0U;
1479 uint32_t transmitmailbox;
1480 HAL_CAN_StateTypeDef state = hcan->State;
1485 if ((state == HAL_CAN_STATE_READY) ||
1486 (state == HAL_CAN_STATE_LISTENING))
1489 transmitmailbox = POSITION_VAL(TxMailbox);
1492 timestamp = (hcan->Instance->sTxMailBox[transmitmailbox].TDTR & CAN_TDT0R_TIME) >> CAN_TDT0R_TIME_Pos;
1511 CAN_RxHeaderTypeDef *pHeader, uint8_t aData[])
1513 HAL_CAN_StateTypeDef state = hcan->State;
1517 if ((state == HAL_CAN_STATE_READY) ||
1518 (state == HAL_CAN_STATE_LISTENING))
1521 if (RxFifo == CAN_RX_FIFO0)
1524 if ((hcan->Instance->RF0R & CAN_RF0R_FMP0) == 0U)
1527 hcan->ErrorCode |= HAL_CAN_ERROR_PARAM;
1535 if ((hcan->Instance->RF1R & CAN_RF1R_FMP1) == 0U)
1538 hcan->ErrorCode |= HAL_CAN_ERROR_PARAM;
1545 pHeader->IDE = CAN_RI0R_IDE & hcan->Instance->sFIFOMailBox[RxFifo].RIR;
1546 if (pHeader->IDE == CAN_ID_STD)
1548 pHeader->StdId = (CAN_RI0R_STID & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_TI0R_STID_Pos;
1552 pHeader->ExtId = ((CAN_RI0R_EXID | CAN_RI0R_STID) &
1553 hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_RI0R_EXID_Pos;
1555 pHeader->RTR = (CAN_RI0R_RTR & hcan->Instance->sFIFOMailBox[RxFifo].RIR);
1556 if (((CAN_RDT0R_DLC & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_DLC_Pos) >= 8U)
1563 pHeader->DLC = (CAN_RDT0R_DLC & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_DLC_Pos;
1565 pHeader->FilterMatchIndex = (CAN_RDT0R_FMI & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_FMI_Pos;
1566 pHeader->Timestamp = (CAN_RDT0R_TIME & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_TIME_Pos;
1569 aData[0] = (uint8_t)((CAN_RDL0R_DATA0 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R_DATA0_Pos);
1570 aData[1] = (uint8_t)((CAN_RDL0R_DATA1 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R_DATA1_Pos);
1571 aData[2] = (uint8_t)((CAN_RDL0R_DATA2 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R_DATA2_Pos);
1572 aData[3] = (uint8_t)((CAN_RDL0R_DATA3 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R_DATA3_Pos);
1573 aData[4] = (uint8_t)((CAN_RDH0R_DATA4 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R_DATA4_Pos);
1574 aData[5] = (uint8_t)((CAN_RDH0R_DATA5 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R_DATA5_Pos);
1575 aData[6] = (uint8_t)((CAN_RDH0R_DATA6 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R_DATA6_Pos);
1576 aData[7] = (uint8_t)((CAN_RDH0R_DATA7 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R_DATA7_Pos);
1579 if (RxFifo == CAN_RX_FIFO0)
1582 hcan->Instance->RF0R = CAN_RF0R_RFOM0;
1587 hcan->Instance->RF1R = CAN_RF1R_RFOM1;
1596 hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
1610uint32_t HAL_CAN_GetRxFifoFillLevel(
const CAN_HandleTypeDef *hcan, uint32_t RxFifo)
1612 uint32_t filllevel = 0U;
1613 HAL_CAN_StateTypeDef state = hcan->State;
1618 if ((state == HAL_CAN_STATE_READY) ||
1619 (state == HAL_CAN_STATE_LISTENING))
1621 if (RxFifo == CAN_RX_FIFO0)
1623 filllevel = hcan->Instance->RF0R & CAN_RF0R_FMP0;
1627 filllevel = hcan->Instance->RF1R & CAN_RF1R_FMP1;
1663HAL_StatusTypeDef HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan, uint32_t ActiveITs)
1665 HAL_CAN_StateTypeDef state = hcan->State;
1670 if ((state == HAL_CAN_STATE_READY) ||
1671 (state == HAL_CAN_STATE_LISTENING))
1674 __HAL_CAN_ENABLE_IT(hcan, ActiveITs);
1682 hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
1696HAL_StatusTypeDef HAL_CAN_DeactivateNotification(CAN_HandleTypeDef *hcan, uint32_t InactiveITs)
1698 HAL_CAN_StateTypeDef state = hcan->State;
1703 if ((state == HAL_CAN_STATE_READY) ||
1704 (state == HAL_CAN_STATE_LISTENING))
1707 __HAL_CAN_DISABLE_IT(hcan, InactiveITs);
1715 hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
1727void HAL_CAN_IRQHandler(CAN_HandleTypeDef *hcan)
1729 uint32_t errorcode = HAL_CAN_ERROR_NONE;
1730 uint32_t interrupts = READ_REG(hcan->Instance->IER);
1731 uint32_t msrflags = READ_REG(hcan->Instance->MSR);
1732 uint32_t tsrflags = READ_REG(hcan->Instance->TSR);
1733 uint32_t rf0rflags = READ_REG(hcan->Instance->RF0R);
1734 uint32_t rf1rflags = READ_REG(hcan->Instance->RF1R);
1735 uint32_t esrflags = READ_REG(hcan->Instance->ESR);
1738 if ((interrupts & CAN_IT_TX_MAILBOX_EMPTY) != 0U)
1741 if ((tsrflags & CAN_TSR_RQCP0) != 0U)
1744 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_RQCP0);
1746 if ((tsrflags & CAN_TSR_TXOK0) != 0U)
1749#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1751 hcan->TxMailbox0CompleteCallback(hcan);
1754 HAL_CAN_TxMailbox0CompleteCallback(hcan);
1759 if ((tsrflags & CAN_TSR_ALST0) != 0U)
1762 errorcode |= HAL_CAN_ERROR_TX_ALST0;
1764 else if ((tsrflags & CAN_TSR_TERR0) != 0U)
1767 errorcode |= HAL_CAN_ERROR_TX_TERR0;
1772#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1774 hcan->TxMailbox0AbortCallback(hcan);
1777 HAL_CAN_TxMailbox0AbortCallback(hcan);
1784 if ((tsrflags & CAN_TSR_RQCP1) != 0U)
1787 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_RQCP1);
1789 if ((tsrflags & CAN_TSR_TXOK1) != 0U)
1792#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1794 hcan->TxMailbox1CompleteCallback(hcan);
1797 HAL_CAN_TxMailbox1CompleteCallback(hcan);
1802 if ((tsrflags & CAN_TSR_ALST1) != 0U)
1805 errorcode |= HAL_CAN_ERROR_TX_ALST1;
1807 else if ((tsrflags & CAN_TSR_TERR1) != 0U)
1810 errorcode |= HAL_CAN_ERROR_TX_TERR1;
1815#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1817 hcan->TxMailbox1AbortCallback(hcan);
1820 HAL_CAN_TxMailbox1AbortCallback(hcan);
1827 if ((tsrflags & CAN_TSR_RQCP2) != 0U)
1830 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_RQCP2);
1832 if ((tsrflags & CAN_TSR_TXOK2) != 0U)
1835#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1837 hcan->TxMailbox2CompleteCallback(hcan);
1840 HAL_CAN_TxMailbox2CompleteCallback(hcan);
1845 if ((tsrflags & CAN_TSR_ALST2) != 0U)
1848 errorcode |= HAL_CAN_ERROR_TX_ALST2;
1850 else if ((tsrflags & CAN_TSR_TERR2) != 0U)
1853 errorcode |= HAL_CAN_ERROR_TX_TERR2;
1858#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1860 hcan->TxMailbox2AbortCallback(hcan);
1863 HAL_CAN_TxMailbox2AbortCallback(hcan);
1871 if ((interrupts & CAN_IT_RX_FIFO0_OVERRUN) != 0U)
1873 if ((rf0rflags & CAN_RF0R_FOVR0) != 0U)
1876 errorcode |= HAL_CAN_ERROR_RX_FOV0;
1879 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV0);
1884 if ((interrupts & CAN_IT_RX_FIFO0_FULL) != 0U)
1886 if ((rf0rflags & CAN_RF0R_FULL0) != 0U)
1889 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FF0);
1892#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1894 hcan->RxFifo0FullCallback(hcan);
1897 HAL_CAN_RxFifo0FullCallback(hcan);
1903 if ((interrupts & CAN_IT_RX_FIFO0_MSG_PENDING) != 0U)
1906 if ((hcan->Instance->RF0R & CAN_RF0R_FMP0) != 0U)
1909#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1911 hcan->RxFifo0MsgPendingCallback(hcan);
1914 HAL_CAN_RxFifo0MsgPendingCallback(hcan);
1920 if ((interrupts & CAN_IT_RX_FIFO1_OVERRUN) != 0U)
1922 if ((rf1rflags & CAN_RF1R_FOVR1) != 0U)
1925 errorcode |= HAL_CAN_ERROR_RX_FOV1;
1928 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV1);
1933 if ((interrupts & CAN_IT_RX_FIFO1_FULL) != 0U)
1935 if ((rf1rflags & CAN_RF1R_FULL1) != 0U)
1938 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FF1);
1941#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1943 hcan->RxFifo1FullCallback(hcan);
1946 HAL_CAN_RxFifo1FullCallback(hcan);
1952 if ((interrupts & CAN_IT_RX_FIFO1_MSG_PENDING) != 0U)
1955 if ((hcan->Instance->RF1R & CAN_RF1R_FMP1) != 0U)
1958#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1960 hcan->RxFifo1MsgPendingCallback(hcan);
1963 HAL_CAN_RxFifo1MsgPendingCallback(hcan);
1969 if ((interrupts & CAN_IT_SLEEP_ACK) != 0U)
1971 if ((msrflags & CAN_MSR_SLAKI) != 0U)
1974 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_SLAKI);
1977#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1979 hcan->SleepCallback(hcan);
1982 HAL_CAN_SleepCallback(hcan);
1988 if ((interrupts & CAN_IT_WAKEUP) != 0U)
1990 if ((msrflags & CAN_MSR_WKUI) != 0U)
1993 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_WKU);
1996#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1998 hcan->WakeUpFromRxMsgCallback(hcan);
2001 HAL_CAN_WakeUpFromRxMsgCallback(hcan);
2007 if ((interrupts & CAN_IT_ERROR) != 0U)
2009 if ((msrflags & CAN_MSR_ERRI) != 0U)
2012 if (((interrupts & CAN_IT_ERROR_WARNING) != 0U) &&
2013 ((esrflags & CAN_ESR_EWGF) != 0U))
2016 errorcode |= HAL_CAN_ERROR_EWG;
2022 if (((interrupts & CAN_IT_ERROR_PASSIVE) != 0U) &&
2023 ((esrflags & CAN_ESR_EPVF) != 0U))
2026 errorcode |= HAL_CAN_ERROR_EPV;
2032 if (((interrupts & CAN_IT_BUSOFF) != 0U) &&
2033 ((esrflags & CAN_ESR_BOFF) != 0U))
2036 errorcode |= HAL_CAN_ERROR_BOF;
2042 if (((interrupts & CAN_IT_LAST_ERROR_CODE) != 0U) &&
2043 ((esrflags & CAN_ESR_LEC) != 0U))
2045 switch (esrflags & CAN_ESR_LEC)
2047 case (CAN_ESR_LEC_0):
2049 errorcode |= HAL_CAN_ERROR_STF;
2051 case (CAN_ESR_LEC_1):
2053 errorcode |= HAL_CAN_ERROR_FOR;
2055 case (CAN_ESR_LEC_1 | CAN_ESR_LEC_0):
2057 errorcode |= HAL_CAN_ERROR_ACK;
2059 case (CAN_ESR_LEC_2):
2061 errorcode |= HAL_CAN_ERROR_BR;
2063 case (CAN_ESR_LEC_2 | CAN_ESR_LEC_0):
2065 errorcode |= HAL_CAN_ERROR_BD;
2067 case (CAN_ESR_LEC_2 | CAN_ESR_LEC_1):
2069 errorcode |= HAL_CAN_ERROR_CRC;
2076 CLEAR_BIT(hcan->Instance->ESR, CAN_ESR_LEC);
2081 __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_ERRI);
2085 if (errorcode != HAL_CAN_ERROR_NONE)
2088 hcan->ErrorCode |= errorcode;
2091#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
2093 hcan->ErrorCallback(hcan);
2096 HAL_CAN_ErrorCallback(hcan);
2138__weak
void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan)
2155__weak
void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan)
2172__weak
void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan)
2189__weak
void HAL_CAN_TxMailbox0AbortCallback(CAN_HandleTypeDef *hcan)
2206__weak
void HAL_CAN_TxMailbox1AbortCallback(CAN_HandleTypeDef *hcan)
2223__weak
void HAL_CAN_TxMailbox2AbortCallback(CAN_HandleTypeDef *hcan)
2240__weak
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
2257__weak
void HAL_CAN_RxFifo0FullCallback(CAN_HandleTypeDef *hcan)
2274__weak
void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan)
2291__weak
void HAL_CAN_RxFifo1FullCallback(CAN_HandleTypeDef *hcan)
2308__weak
void HAL_CAN_SleepCallback(CAN_HandleTypeDef *hcan)
2324__weak
void HAL_CAN_WakeUpFromRxMsgCallback(CAN_HandleTypeDef *hcan)
2341__weak
void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan)
2378HAL_CAN_StateTypeDef HAL_CAN_GetState(
const CAN_HandleTypeDef *hcan)
2380 HAL_CAN_StateTypeDef state = hcan->State;
2382 if ((state == HAL_CAN_STATE_READY) ||
2383 (state == HAL_CAN_STATE_LISTENING))
2386 if ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U)
2389 state = HAL_CAN_STATE_SLEEP_ACTIVE;
2392 else if ((hcan->Instance->MCR & CAN_MCR_SLEEP) != 0U)
2395 state = HAL_CAN_STATE_SLEEP_PENDING;
2413uint32_t HAL_CAN_GetError(
const CAN_HandleTypeDef *hcan)
2416 return hcan->ErrorCode;
2428 HAL_CAN_StateTypeDef state = hcan->State;
2430 if ((state == HAL_CAN_STATE_READY) ||
2431 (state == HAL_CAN_STATE_LISTENING))
2434 hcan->ErrorCode = 0U;
2439 hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
#define assert_param(expr)
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef
HAL Status structures definition.