STM32F4xx HAL Documentation
Hardware Abstraction Layer for STM32F4 familiy
Loading...
Searching...
No Matches
stm32f4xx_hal_can.c
Go to the documentation of this file.
1
212/* Includes ------------------------------------------------------------------*/
213#include "stm32f4xx_hal.h"
214
219#if defined(CAN1)
220
226#ifdef HAL_CAN_MODULE_ENABLED
227
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"
230#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */
231
232/* Private typedef -----------------------------------------------------------*/
233/* Private define ------------------------------------------------------------*/
237#define CAN_TIMEOUT_VALUE 10U
238#define CAN_WAKEUP_TIMEOUT_COUNTER 1000000U
242/* Private macro -------------------------------------------------------------*/
243/* Private variables ---------------------------------------------------------*/
244/* Private function prototypes -----------------------------------------------*/
245/* Exported functions --------------------------------------------------------*/
246
276{
277 uint32_t tickstart;
278
279 /* Check CAN handle */
280 if (hcan == NULL)
281 {
282 return HAL_ERROR;
283 }
284
285 /* Check the parameters */
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));
298
299#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
300 if (hcan->State == HAL_CAN_STATE_RESET)
301 {
302 /* Reset callbacks to legacy functions */
303 hcan->RxFifo0MsgPendingCallback = HAL_CAN_RxFifo0MsgPendingCallback; /* Legacy weak RxFifo0MsgPendingCallback */
304 hcan->RxFifo0FullCallback = HAL_CAN_RxFifo0FullCallback; /* Legacy weak RxFifo0FullCallback */
305 hcan->RxFifo1MsgPendingCallback = HAL_CAN_RxFifo1MsgPendingCallback; /* Legacy weak RxFifo1MsgPendingCallback */
306 hcan->RxFifo1FullCallback = HAL_CAN_RxFifo1FullCallback; /* Legacy weak RxFifo1FullCallback */
307 hcan->TxMailbox0CompleteCallback = HAL_CAN_TxMailbox0CompleteCallback; /* Legacy weak TxMailbox0CompleteCallback */
308 hcan->TxMailbox1CompleteCallback = HAL_CAN_TxMailbox1CompleteCallback; /* Legacy weak TxMailbox1CompleteCallback */
309 hcan->TxMailbox2CompleteCallback = HAL_CAN_TxMailbox2CompleteCallback; /* Legacy weak TxMailbox2CompleteCallback */
310 hcan->TxMailbox0AbortCallback = HAL_CAN_TxMailbox0AbortCallback; /* Legacy weak TxMailbox0AbortCallback */
311 hcan->TxMailbox1AbortCallback = HAL_CAN_TxMailbox1AbortCallback; /* Legacy weak TxMailbox1AbortCallback */
312 hcan->TxMailbox2AbortCallback = HAL_CAN_TxMailbox2AbortCallback; /* Legacy weak TxMailbox2AbortCallback */
313 hcan->SleepCallback = HAL_CAN_SleepCallback; /* Legacy weak SleepCallback */
314 hcan->WakeUpFromRxMsgCallback = HAL_CAN_WakeUpFromRxMsgCallback; /* Legacy weak WakeUpFromRxMsgCallback */
315 hcan->ErrorCallback = HAL_CAN_ErrorCallback; /* Legacy weak ErrorCallback */
316
317 if (hcan->MspInitCallback == NULL)
318 {
319 hcan->MspInitCallback = HAL_CAN_MspInit; /* Legacy weak MspInit */
320 }
321
322 /* Init the low level hardware: CLOCK, NVIC */
323 hcan->MspInitCallback(hcan);
324 }
325
326#else
327 if (hcan->State == HAL_CAN_STATE_RESET)
328 {
329 /* Init the low level hardware: CLOCK, NVIC */
330 HAL_CAN_MspInit(hcan);
331 }
332#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */
333
334 /* Request initialisation */
335 SET_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);
336
337 /* Get tick */
338 tickstart = HAL_GetTick();
339
340 /* Wait initialisation acknowledge */
341 while ((hcan->Instance->MSR & CAN_MSR_INAK) == 0U)
342 {
343 if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
344 {
345 /* Update error code */
347
348 /* Change CAN state */
350
351 return HAL_ERROR;
352 }
353 }
354
355 /* Exit from sleep mode */
356 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);
357
358 /* Get tick */
359 tickstart = HAL_GetTick();
360
361 /* Check Sleep mode leave acknowledge */
362 while ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U)
363 {
364 if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
365 {
366 /* Update error code */
368
369 /* Change CAN state */
371
372 return HAL_ERROR;
373 }
374 }
375
376 /* Set the time triggered communication mode */
377 if (hcan->Init.TimeTriggeredMode == ENABLE)
378 {
379 SET_BIT(hcan->Instance->MCR, CAN_MCR_TTCM);
380 }
381 else
382 {
383 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_TTCM);
384 }
385
386 /* Set the automatic bus-off management */
387 if (hcan->Init.AutoBusOff == ENABLE)
388 {
389 SET_BIT(hcan->Instance->MCR, CAN_MCR_ABOM);
390 }
391 else
392 {
393 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_ABOM);
394 }
395
396 /* Set the automatic wake-up mode */
397 if (hcan->Init.AutoWakeUp == ENABLE)
398 {
399 SET_BIT(hcan->Instance->MCR, CAN_MCR_AWUM);
400 }
401 else
402 {
403 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_AWUM);
404 }
405
406 /* Set the automatic retransmission */
407 if (hcan->Init.AutoRetransmission == ENABLE)
408 {
409 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_NART);
410 }
411 else
412 {
413 SET_BIT(hcan->Instance->MCR, CAN_MCR_NART);
414 }
415
416 /* Set the receive FIFO locked mode */
417 if (hcan->Init.ReceiveFifoLocked == ENABLE)
418 {
419 SET_BIT(hcan->Instance->MCR, CAN_MCR_RFLM);
420 }
421 else
422 {
423 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_RFLM);
424 }
425
426 /* Set the transmit FIFO priority */
427 if (hcan->Init.TransmitFifoPriority == ENABLE)
428 {
429 SET_BIT(hcan->Instance->MCR, CAN_MCR_TXFP);
430 }
431 else
432 {
433 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_TXFP);
434 }
435
436 /* Set the bit timing register */
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)));
442
443 /* Initialize the error code */
445
446 /* Initialize the CAN state */
448
449 /* Return function status */
450 return HAL_OK;
451}
452
461{
462 /* Check CAN handle */
463 if (hcan == NULL)
464 {
465 return HAL_ERROR;
466 }
467
468 /* Check the parameters */
469 assert_param(IS_CAN_ALL_INSTANCE(hcan->Instance));
470
471 /* Stop the CAN module */
472 (void)HAL_CAN_Stop(hcan);
473
474#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
475 if (hcan->MspDeInitCallback == NULL)
476 {
477 hcan->MspDeInitCallback = HAL_CAN_MspDeInit; /* Legacy weak MspDeInit */
478 }
479
480 /* DeInit the low level hardware: CLOCK, NVIC */
481 hcan->MspDeInitCallback(hcan);
482
483#else
484 /* DeInit the low level hardware: CLOCK, NVIC */
485 HAL_CAN_MspDeInit(hcan);
486#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */
487
488 /* Reset the CAN peripheral */
489 SET_BIT(hcan->Instance->MCR, CAN_MCR_RESET);
490
491 /* Reset the CAN ErrorCode */
493
494 /* Change CAN state */
496
497 /* Return function status */
498 return HAL_OK;
499}
500
508{
509 /* Prevent unused argument(s) compilation warning */
510 UNUSED(hcan);
511
512 /* NOTE : This function Should not be modified, when the callback is needed,
513 the HAL_CAN_MspInit could be implemented in the user file
514 */
515}
516
524{
525 /* Prevent unused argument(s) compilation warning */
526 UNUSED(hcan);
527
528 /* NOTE : This function Should not be modified, when the callback is needed,
529 the HAL_CAN_MspDeInit could be implemented in the user file
530 */
531}
532
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))
561{
562 HAL_StatusTypeDef status = HAL_OK;
563
564 if (pCallback == NULL)
565 {
566 /* Update the error code */
567 hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK;
568
569 return HAL_ERROR;
570 }
571
572 if (hcan->State == HAL_CAN_STATE_READY)
573 {
574 switch (CallbackID)
575 {
576 case HAL_CAN_TX_MAILBOX0_COMPLETE_CB_ID :
577 hcan->TxMailbox0CompleteCallback = pCallback;
578 break;
579
580 case HAL_CAN_TX_MAILBOX1_COMPLETE_CB_ID :
581 hcan->TxMailbox1CompleteCallback = pCallback;
582 break;
583
584 case HAL_CAN_TX_MAILBOX2_COMPLETE_CB_ID :
585 hcan->TxMailbox2CompleteCallback = pCallback;
586 break;
587
588 case HAL_CAN_TX_MAILBOX0_ABORT_CB_ID :
589 hcan->TxMailbox0AbortCallback = pCallback;
590 break;
591
592 case HAL_CAN_TX_MAILBOX1_ABORT_CB_ID :
593 hcan->TxMailbox1AbortCallback = pCallback;
594 break;
595
596 case HAL_CAN_TX_MAILBOX2_ABORT_CB_ID :
597 hcan->TxMailbox2AbortCallback = pCallback;
598 break;
599
600 case HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID :
601 hcan->RxFifo0MsgPendingCallback = pCallback;
602 break;
603
604 case HAL_CAN_RX_FIFO0_FULL_CB_ID :
605 hcan->RxFifo0FullCallback = pCallback;
606 break;
607
608 case HAL_CAN_RX_FIFO1_MSG_PENDING_CB_ID :
609 hcan->RxFifo1MsgPendingCallback = pCallback;
610 break;
611
612 case HAL_CAN_RX_FIFO1_FULL_CB_ID :
613 hcan->RxFifo1FullCallback = pCallback;
614 break;
615
616 case HAL_CAN_SLEEP_CB_ID :
617 hcan->SleepCallback = pCallback;
618 break;
619
620 case HAL_CAN_WAKEUP_FROM_RX_MSG_CB_ID :
621 hcan->WakeUpFromRxMsgCallback = pCallback;
622 break;
623
624 case HAL_CAN_ERROR_CB_ID :
625 hcan->ErrorCallback = pCallback;
626 break;
627
628 case HAL_CAN_MSPINIT_CB_ID :
629 hcan->MspInitCallback = pCallback;
630 break;
631
632 case HAL_CAN_MSPDEINIT_CB_ID :
633 hcan->MspDeInitCallback = pCallback;
634 break;
635
636 default :
637 /* Update the error code */
638 hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK;
639
640 /* Return error status */
641 status = HAL_ERROR;
642 break;
643 }
644 }
645 else if (hcan->State == HAL_CAN_STATE_RESET)
646 {
647 switch (CallbackID)
648 {
649 case HAL_CAN_MSPINIT_CB_ID :
650 hcan->MspInitCallback = pCallback;
651 break;
652
653 case HAL_CAN_MSPDEINIT_CB_ID :
654 hcan->MspDeInitCallback = pCallback;
655 break;
656
657 default :
658 /* Update the error code */
659 hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK;
660
661 /* Return error status */
662 status = HAL_ERROR;
663 break;
664 }
665 }
666 else
667 {
668 /* Update the error code */
669 hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK;
670
671 /* Return error status */
672 status = HAL_ERROR;
673 }
674
675 return status;
676}
677
702HAL_StatusTypeDef HAL_CAN_UnRegisterCallback(CAN_HandleTypeDef *hcan, HAL_CAN_CallbackIDTypeDef CallbackID)
703{
704 HAL_StatusTypeDef status = HAL_OK;
705
706 if (hcan->State == HAL_CAN_STATE_READY)
707 {
708 switch (CallbackID)
709 {
710 case HAL_CAN_TX_MAILBOX0_COMPLETE_CB_ID :
711 hcan->TxMailbox0CompleteCallback = HAL_CAN_TxMailbox0CompleteCallback;
712 break;
713
714 case HAL_CAN_TX_MAILBOX1_COMPLETE_CB_ID :
715 hcan->TxMailbox1CompleteCallback = HAL_CAN_TxMailbox1CompleteCallback;
716 break;
717
718 case HAL_CAN_TX_MAILBOX2_COMPLETE_CB_ID :
719 hcan->TxMailbox2CompleteCallback = HAL_CAN_TxMailbox2CompleteCallback;
720 break;
721
722 case HAL_CAN_TX_MAILBOX0_ABORT_CB_ID :
723 hcan->TxMailbox0AbortCallback = HAL_CAN_TxMailbox0AbortCallback;
724 break;
725
726 case HAL_CAN_TX_MAILBOX1_ABORT_CB_ID :
727 hcan->TxMailbox1AbortCallback = HAL_CAN_TxMailbox1AbortCallback;
728 break;
729
730 case HAL_CAN_TX_MAILBOX2_ABORT_CB_ID :
731 hcan->TxMailbox2AbortCallback = HAL_CAN_TxMailbox2AbortCallback;
732 break;
733
734 case HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID :
735 hcan->RxFifo0MsgPendingCallback = HAL_CAN_RxFifo0MsgPendingCallback;
736 break;
737
738 case HAL_CAN_RX_FIFO0_FULL_CB_ID :
739 hcan->RxFifo0FullCallback = HAL_CAN_RxFifo0FullCallback;
740 break;
741
742 case HAL_CAN_RX_FIFO1_MSG_PENDING_CB_ID :
743 hcan->RxFifo1MsgPendingCallback = HAL_CAN_RxFifo1MsgPendingCallback;
744 break;
745
746 case HAL_CAN_RX_FIFO1_FULL_CB_ID :
747 hcan->RxFifo1FullCallback = HAL_CAN_RxFifo1FullCallback;
748 break;
749
750 case HAL_CAN_SLEEP_CB_ID :
751 hcan->SleepCallback = HAL_CAN_SleepCallback;
752 break;
753
754 case HAL_CAN_WAKEUP_FROM_RX_MSG_CB_ID :
755 hcan->WakeUpFromRxMsgCallback = HAL_CAN_WakeUpFromRxMsgCallback;
756 break;
757
758 case HAL_CAN_ERROR_CB_ID :
759 hcan->ErrorCallback = HAL_CAN_ErrorCallback;
760 break;
761
762 case HAL_CAN_MSPINIT_CB_ID :
763 hcan->MspInitCallback = HAL_CAN_MspInit;
764 break;
765
766 case HAL_CAN_MSPDEINIT_CB_ID :
767 hcan->MspDeInitCallback = HAL_CAN_MspDeInit;
768 break;
769
770 default :
771 /* Update the error code */
772 hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK;
773
774 /* Return error status */
775 status = HAL_ERROR;
776 break;
777 }
778 }
779 else if (hcan->State == HAL_CAN_STATE_RESET)
780 {
781 switch (CallbackID)
782 {
783 case HAL_CAN_MSPINIT_CB_ID :
784 hcan->MspInitCallback = HAL_CAN_MspInit;
785 break;
786
787 case HAL_CAN_MSPDEINIT_CB_ID :
788 hcan->MspDeInitCallback = HAL_CAN_MspDeInit;
789 break;
790
791 default :
792 /* Update the error code */
793 hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK;
794
795 /* Return error status */
796 status = HAL_ERROR;
797 break;
798 }
799 }
800 else
801 {
802 /* Update the error code */
803 hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK;
804
805 /* Return error status */
806 status = HAL_ERROR;
807 }
808
809 return status;
810}
811#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */
812
841{
842 uint32_t filternbrbitpos;
843 CAN_TypeDef *can_ip = hcan->Instance;
844 HAL_CAN_StateTypeDef state = hcan->State;
845
846 if ((state == HAL_CAN_STATE_READY) ||
847 (state == HAL_CAN_STATE_LISTENING))
848 {
849 /* Check the parameters */
858
859#if defined(CAN3)
860 /* Check the CAN instance */
861 if (hcan->Instance == CAN3)
862 {
863 /* CAN3 is single instance with 14 dedicated filters banks */
864
865 /* Check the parameters */
867 }
868 else
869 {
870 /* CAN1 and CAN2 are dual instances with 28 common filters banks */
871 /* Select master instance to access the filter banks */
872 can_ip = CAN1;
873
874 /* Check the parameters */
877 }
878#elif defined(CAN2)
879 /* CAN1 and CAN2 are dual instances with 28 common filters banks */
880 /* Select master instance to access the filter banks */
881 can_ip = CAN1;
882
883 /* Check the parameters */
886#else
887 /* CAN1 is single instance with 14 dedicated filters banks */
888
889 /* Check the parameters */
891#endif /* CAN3 */
892
893 /* Initialisation mode for the filter */
894 SET_BIT(can_ip->FMR, CAN_FMR_FINIT);
895
896#if defined(CAN3)
897 /* Check the CAN instance */
898 if (can_ip == CAN1)
899 {
900 /* Select the start filter number of CAN2 slave instance */
901 CLEAR_BIT(can_ip->FMR, CAN_FMR_CAN2SB);
902 SET_BIT(can_ip->FMR, sFilterConfig->SlaveStartFilterBank << CAN_FMR_CAN2SB_Pos);
903 }
904
905#elif defined(CAN2)
906 /* Select the start filter number of CAN2 slave instance */
907 CLEAR_BIT(can_ip->FMR, CAN_FMR_CAN2SB);
908 SET_BIT(can_ip->FMR, sFilterConfig->SlaveStartFilterBank << CAN_FMR_CAN2SB_Pos);
909
910#endif /* CAN3 */
911 /* Convert filter number into bit position */
912 filternbrbitpos = (uint32_t)1 << (sFilterConfig->FilterBank & 0x1FU);
913
914 /* Filter Deactivation */
915 CLEAR_BIT(can_ip->FA1R, filternbrbitpos);
916
917 /* Filter Scale */
918 if (sFilterConfig->FilterScale == CAN_FILTERSCALE_16BIT)
919 {
920 /* 16-bit scale for the filter */
921 CLEAR_BIT(can_ip->FS1R, filternbrbitpos);
922
923 /* First 16-bit identifier and First 16-bit mask */
924 /* Or First 16-bit identifier and Second 16-bit identifier */
925 can_ip->sFilterRegister[sFilterConfig->FilterBank].FR1 =
926 ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow) << 16U) |
927 (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdLow);
928
929 /* Second 16-bit identifier and Second 16-bit mask */
930 /* Or Third 16-bit identifier and Fourth 16-bit identifier */
931 can_ip->sFilterRegister[sFilterConfig->FilterBank].FR2 =
932 ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) |
933 (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh);
934 }
935
936 if (sFilterConfig->FilterScale == CAN_FILTERSCALE_32BIT)
937 {
938 /* 32-bit scale for the filter */
939 SET_BIT(can_ip->FS1R, filternbrbitpos);
940
941 /* 32-bit identifier or First 32-bit identifier */
942 can_ip->sFilterRegister[sFilterConfig->FilterBank].FR1 =
943 ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh) << 16U) |
944 (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdLow);
945
946 /* 32-bit mask or Second 32-bit identifier */
947 can_ip->sFilterRegister[sFilterConfig->FilterBank].FR2 =
948 ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) |
949 (0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow);
950 }
951
952 /* Filter Mode */
953 if (sFilterConfig->FilterMode == CAN_FILTERMODE_IDMASK)
954 {
955 /* Id/Mask mode for the filter*/
956 CLEAR_BIT(can_ip->FM1R, filternbrbitpos);
957 }
958 else /* CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdList */
959 {
960 /* Identifier list mode for the filter*/
961 SET_BIT(can_ip->FM1R, filternbrbitpos);
962 }
963
964 /* Filter FIFO assignment */
965 if (sFilterConfig->FilterFIFOAssignment == CAN_FILTER_FIFO0)
966 {
967 /* FIFO 0 assignation for the filter */
968 CLEAR_BIT(can_ip->FFA1R, filternbrbitpos);
969 }
970 else
971 {
972 /* FIFO 1 assignation for the filter */
973 SET_BIT(can_ip->FFA1R, filternbrbitpos);
974 }
975
976 /* Filter activation */
977 if (sFilterConfig->FilterActivation == CAN_FILTER_ENABLE)
978 {
979 SET_BIT(can_ip->FA1R, filternbrbitpos);
980 }
981
982 /* Leave the initialisation mode for the filter */
983 CLEAR_BIT(can_ip->FMR, CAN_FMR_FINIT);
984
985 /* Return function status */
986 return HAL_OK;
987 }
988 else
989 {
990 /* Update error code */
992
993 return HAL_ERROR;
994 }
995}
996
1035{
1036 uint32_t tickstart;
1037
1038 if (hcan->State == HAL_CAN_STATE_READY)
1039 {
1040 /* Change CAN peripheral state */
1042
1043 /* Request leave initialisation */
1044 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);
1045
1046 /* Get tick */
1047 tickstart = HAL_GetTick();
1048
1049 /* Wait the acknowledge */
1050 while ((hcan->Instance->MSR & CAN_MSR_INAK) != 0U)
1051 {
1052 /* Check for the Timeout */
1053 if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
1054 {
1055 /* Update error code */
1057
1058 /* Change CAN state */
1059 hcan->State = HAL_CAN_STATE_ERROR;
1060
1061 return HAL_ERROR;
1062 }
1063 }
1064
1065 /* Reset the CAN ErrorCode */
1067
1068 /* Return function status */
1069 return HAL_OK;
1070 }
1071 else
1072 {
1073 /* Update error code */
1075
1076 return HAL_ERROR;
1077 }
1078}
1079
1087{
1088 uint32_t tickstart;
1089
1090 if (hcan->State == HAL_CAN_STATE_LISTENING)
1091 {
1092 /* Request initialisation */
1093 SET_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);
1094
1095 /* Get tick */
1096 tickstart = HAL_GetTick();
1097
1098 /* Wait the acknowledge */
1099 while ((hcan->Instance->MSR & CAN_MSR_INAK) == 0U)
1100 {
1101 /* Check for the Timeout */
1102 if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
1103 {
1104 /* Update error code */
1106
1107 /* Change CAN state */
1108 hcan->State = HAL_CAN_STATE_ERROR;
1109
1110 return HAL_ERROR;
1111 }
1112 }
1113
1114 /* Exit from sleep mode */
1115 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);
1116
1117 /* Change CAN peripheral state */
1118 hcan->State = HAL_CAN_STATE_READY;
1119
1120 /* Return function status */
1121 return HAL_OK;
1122 }
1123 else
1124 {
1125 /* Update error code */
1127
1128 return HAL_ERROR;
1129 }
1130}
1131
1142{
1143 HAL_CAN_StateTypeDef state = hcan->State;
1144
1145 if ((state == HAL_CAN_STATE_READY) ||
1146 (state == HAL_CAN_STATE_LISTENING))
1147 {
1148 /* Request Sleep mode */
1149 SET_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);
1150
1151 /* Return function status */
1152 return HAL_OK;
1153 }
1154 else
1155 {
1156 /* Update error code */
1158
1159 /* Return function status */
1160 return HAL_ERROR;
1161 }
1162}
1163
1173{
1174 __IO uint32_t count = 0;
1175 HAL_CAN_StateTypeDef state = hcan->State;
1176
1177 if ((state == HAL_CAN_STATE_READY) ||
1178 (state == HAL_CAN_STATE_LISTENING))
1179 {
1180 /* Wake up request */
1181 CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);
1182
1183 /* Wait sleep mode is exited */
1184 do
1185 {
1186 /* Increment counter */
1187 count++;
1188
1189 /* Check if timeout is reached */
1190 if (count > CAN_WAKEUP_TIMEOUT_COUNTER)
1191 {
1192 /* Update error code */
1194
1195 return HAL_ERROR;
1196 }
1197 } while ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U);
1198
1199 /* Return function status */
1200 return HAL_OK;
1201 }
1202 else
1203 {
1204 /* Update error code */
1206
1207 return HAL_ERROR;
1208 }
1209}
1210
1220{
1221 uint32_t status = 0U;
1222 HAL_CAN_StateTypeDef state = hcan->State;
1223
1224 if ((state == HAL_CAN_STATE_READY) ||
1225 (state == HAL_CAN_STATE_LISTENING))
1226 {
1227 /* Check Sleep mode */
1228 if ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U)
1229 {
1230 status = 1U;
1231 }
1232 }
1233
1234 /* Return function status */
1235 return status;
1236}
1237
1251 const uint8_t aData[], uint32_t *pTxMailbox)
1252{
1253 uint32_t transmitmailbox;
1254 HAL_CAN_StateTypeDef state = hcan->State;
1255 uint32_t tsr = READ_REG(hcan->Instance->TSR);
1256
1257 /* Check the parameters */
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)
1262 {
1263 assert_param(IS_CAN_STDID(pHeader->StdId));
1264 }
1265 else
1266 {
1267 assert_param(IS_CAN_EXTID(pHeader->ExtId));
1268 }
1269 assert_param(IS_FUNCTIONAL_STATE(pHeader->TransmitGlobalTime));
1270
1271 if ((state == HAL_CAN_STATE_READY) ||
1272 (state == HAL_CAN_STATE_LISTENING))
1273 {
1274 /* Check that all the Tx mailboxes are not full */
1275 if (((tsr & CAN_TSR_TME0) != 0U) ||
1276 ((tsr & CAN_TSR_TME1) != 0U) ||
1277 ((tsr & CAN_TSR_TME2) != 0U))
1278 {
1279 /* Select an empty transmit mailbox */
1280 transmitmailbox = (tsr & CAN_TSR_CODE) >> CAN_TSR_CODE_Pos;
1281
1282 /* Store the Tx mailbox */
1283 *pTxMailbox = (uint32_t)1 << transmitmailbox;
1284
1285 /* Set up the Id */
1286 if (pHeader->IDE == CAN_ID_STD)
1287 {
1288 hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->StdId << CAN_TI0R_STID_Pos) |
1289 pHeader->RTR);
1290 }
1291 else
1292 {
1293 hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->ExtId << CAN_TI0R_EXID_Pos) |
1294 pHeader->IDE |
1295 pHeader->RTR);
1296 }
1297
1298 /* Set up the DLC */
1299 hcan->Instance->sTxMailBox[transmitmailbox].TDTR = (pHeader->DLC);
1300
1301 /* Set up the Transmit Global Time mode */
1302 if (pHeader->TransmitGlobalTime == ENABLE)
1303 {
1304 SET_BIT(hcan->Instance->sTxMailBox[transmitmailbox].TDTR, CAN_TDT0R_TGT);
1305 }
1306
1307 /* Set up the data field */
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));
1318
1319 /* Request transmission */
1320 SET_BIT(hcan->Instance->sTxMailBox[transmitmailbox].TIR, CAN_TI0R_TXRQ);
1321
1322 /* Return function status */
1323 return HAL_OK;
1324 }
1325 else
1326 {
1327 /* Update error code */
1329
1330 return HAL_ERROR;
1331 }
1332 }
1333 else
1334 {
1335 /* Update error code */
1337
1338 return HAL_ERROR;
1339 }
1340}
1341
1351{
1352 HAL_CAN_StateTypeDef state = hcan->State;
1353
1354 /* Check function parameters */
1356
1357 if ((state == HAL_CAN_STATE_READY) ||
1358 (state == HAL_CAN_STATE_LISTENING))
1359 {
1360 /* Check Tx Mailbox 0 */
1361 if ((TxMailboxes & CAN_TX_MAILBOX0) != 0U)
1362 {
1363 /* Add cancellation request for Tx Mailbox 0 */
1364 SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ0);
1365 }
1366
1367 /* Check Tx Mailbox 1 */
1368 if ((TxMailboxes & CAN_TX_MAILBOX1) != 0U)
1369 {
1370 /* Add cancellation request for Tx Mailbox 1 */
1371 SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ1);
1372 }
1373
1374 /* Check Tx Mailbox 2 */
1375 if ((TxMailboxes & CAN_TX_MAILBOX2) != 0U)
1376 {
1377 /* Add cancellation request for Tx Mailbox 2 */
1378 SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ2);
1379 }
1380
1381 /* Return function status */
1382 return HAL_OK;
1383 }
1384 else
1385 {
1386 /* Update error code */
1388
1389 return HAL_ERROR;
1390 }
1391}
1392
1400{
1401 uint32_t freelevel = 0U;
1402 HAL_CAN_StateTypeDef state = hcan->State;
1403
1404 if ((state == HAL_CAN_STATE_READY) ||
1405 (state == HAL_CAN_STATE_LISTENING))
1406 {
1407 /* Check Tx Mailbox 0 status */
1408 if ((hcan->Instance->TSR & CAN_TSR_TME0) != 0U)
1409 {
1410 freelevel++;
1411 }
1412
1413 /* Check Tx Mailbox 1 status */
1414 if ((hcan->Instance->TSR & CAN_TSR_TME1) != 0U)
1415 {
1416 freelevel++;
1417 }
1418
1419 /* Check Tx Mailbox 2 status */
1420 if ((hcan->Instance->TSR & CAN_TSR_TME2) != 0U)
1421 {
1422 freelevel++;
1423 }
1424 }
1425
1426 /* Return Tx Mailboxes free level */
1427 return freelevel;
1428}
1429
1442uint32_t HAL_CAN_IsTxMessagePending(const CAN_HandleTypeDef *hcan, uint32_t TxMailboxes)
1443{
1444 uint32_t status = 0U;
1445 HAL_CAN_StateTypeDef state = hcan->State;
1446
1447 /* Check function parameters */
1449
1450 if ((state == HAL_CAN_STATE_READY) ||
1451 (state == HAL_CAN_STATE_LISTENING))
1452 {
1453 /* Check pending transmission request on the selected Tx Mailboxes */
1454 if ((hcan->Instance->TSR & (TxMailboxes << CAN_TSR_TME0_Pos)) != (TxMailboxes << CAN_TSR_TME0_Pos))
1455 {
1456 status = 1U;
1457 }
1458 }
1459
1460 /* Return status */
1461 return status;
1462}
1463
1474uint32_t HAL_CAN_GetTxTimestamp(const CAN_HandleTypeDef *hcan, uint32_t TxMailbox)
1475{
1476 uint32_t timestamp = 0U;
1477 uint32_t transmitmailbox;
1478 HAL_CAN_StateTypeDef state = hcan->State;
1479
1480 /* Check function parameters */
1481 assert_param(IS_CAN_TX_MAILBOX(TxMailbox));
1482
1483 if ((state == HAL_CAN_STATE_READY) ||
1484 (state == HAL_CAN_STATE_LISTENING))
1485 {
1486 /* Select the Tx mailbox */
1487 transmitmailbox = POSITION_VAL(TxMailbox);
1488
1489 /* Get timestamp */
1490 timestamp = (hcan->Instance->sTxMailBox[transmitmailbox].TDTR & CAN_TDT0R_TIME) >> CAN_TDT0R_TIME_Pos;
1491 }
1492
1493 /* Return the timestamp */
1494 return timestamp;
1495}
1496
1509 CAN_RxHeaderTypeDef *pHeader, uint8_t aData[])
1510{
1511 HAL_CAN_StateTypeDef state = hcan->State;
1512
1514
1515 if ((state == HAL_CAN_STATE_READY) ||
1516 (state == HAL_CAN_STATE_LISTENING))
1517 {
1518 /* Check the Rx FIFO */
1519 if (RxFifo == CAN_RX_FIFO0) /* Rx element is assigned to Rx FIFO 0 */
1520 {
1521 /* Check that the Rx FIFO 0 is not empty */
1522 if ((hcan->Instance->RF0R & CAN_RF0R_FMP0) == 0U)
1523 {
1524 /* Update error code */
1526
1527 return HAL_ERROR;
1528 }
1529 }
1530 else /* Rx element is assigned to Rx FIFO 1 */
1531 {
1532 /* Check that the Rx FIFO 1 is not empty */
1533 if ((hcan->Instance->RF1R & CAN_RF1R_FMP1) == 0U)
1534 {
1535 /* Update error code */
1537
1538 return HAL_ERROR;
1539 }
1540 }
1541
1542 /* Get the header */
1543 pHeader->IDE = CAN_RI0R_IDE & hcan->Instance->sFIFOMailBox[RxFifo].RIR;
1544 if (pHeader->IDE == CAN_ID_STD)
1545 {
1546 pHeader->StdId = (CAN_RI0R_STID & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_TI0R_STID_Pos;
1547 }
1548 else
1549 {
1550 pHeader->ExtId = ((CAN_RI0R_EXID | CAN_RI0R_STID) &
1551 hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_RI0R_EXID_Pos;
1552 }
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)
1555 {
1556 /* Truncate DLC to 8 if received field is over range */
1557 pHeader->DLC = 8U;
1558 }
1559 else
1560 {
1561 pHeader->DLC = (CAN_RDT0R_DLC & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_DLC_Pos;
1562 }
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;
1565
1566 /* Get the data */
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);
1575
1576 /* Release the FIFO */
1577 if (RxFifo == CAN_RX_FIFO0) /* Rx element is assigned to Rx FIFO 0 */
1578 {
1579 /* Release RX FIFO 0 */
1580 SET_BIT(hcan->Instance->RF0R, CAN_RF0R_RFOM0);
1581 }
1582 else /* Rx element is assigned to Rx FIFO 1 */
1583 {
1584 /* Release RX FIFO 1 */
1585 SET_BIT(hcan->Instance->RF1R, CAN_RF1R_RFOM1);
1586 }
1587
1588 /* Return function status */
1589 return HAL_OK;
1590 }
1591 else
1592 {
1593 /* Update error code */
1595
1596 return HAL_ERROR;
1597 }
1598}
1599
1608uint32_t HAL_CAN_GetRxFifoFillLevel(const CAN_HandleTypeDef *hcan, uint32_t RxFifo)
1609{
1610 uint32_t filllevel = 0U;
1611 HAL_CAN_StateTypeDef state = hcan->State;
1612
1613 /* Check function parameters */
1615
1616 if ((state == HAL_CAN_STATE_READY) ||
1617 (state == HAL_CAN_STATE_LISTENING))
1618 {
1619 if (RxFifo == CAN_RX_FIFO0)
1620 {
1621 filllevel = hcan->Instance->RF0R & CAN_RF0R_FMP0;
1622 }
1623 else /* RxFifo == CAN_RX_FIFO1 */
1624 {
1625 filllevel = hcan->Instance->RF1R & CAN_RF1R_FMP1;
1626 }
1627 }
1628
1629 /* Return Rx FIFO fill level */
1630 return filllevel;
1631}
1632
1662{
1663 HAL_CAN_StateTypeDef state = hcan->State;
1664
1665 /* Check function parameters */
1666 assert_param(IS_CAN_IT(ActiveITs));
1667
1668 if ((state == HAL_CAN_STATE_READY) ||
1669 (state == HAL_CAN_STATE_LISTENING))
1670 {
1671 /* Enable the selected interrupts */
1672 __HAL_CAN_ENABLE_IT(hcan, ActiveITs);
1673
1674 /* Return function status */
1675 return HAL_OK;
1676 }
1677 else
1678 {
1679 /* Update error code */
1681
1682 return HAL_ERROR;
1683 }
1684}
1685
1695{
1696 HAL_CAN_StateTypeDef state = hcan->State;
1697
1698 /* Check function parameters */
1699 assert_param(IS_CAN_IT(InactiveITs));
1700
1701 if ((state == HAL_CAN_STATE_READY) ||
1702 (state == HAL_CAN_STATE_LISTENING))
1703 {
1704 /* Disable the selected interrupts */
1705 __HAL_CAN_DISABLE_IT(hcan, InactiveITs);
1706
1707 /* Return function status */
1708 return HAL_OK;
1709 }
1710 else
1711 {
1712 /* Update error code */
1714
1715 return HAL_ERROR;
1716 }
1717}
1718
1726{
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);
1734
1735 /* Transmit Mailbox empty interrupt management *****************************/
1736 if ((interrupts & CAN_IT_TX_MAILBOX_EMPTY) != 0U)
1737 {
1738 /* Transmit Mailbox 0 management *****************************************/
1739 if ((tsrflags & CAN_TSR_RQCP0) != 0U)
1740 {
1741 /* Clear the Transmission Complete flag (and TXOK0,ALST0,TERR0 bits) */
1743
1744 if ((tsrflags & CAN_TSR_TXOK0) != 0U)
1745 {
1746 /* Transmission Mailbox 0 complete callback */
1747#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1748 /* Call registered callback*/
1749 hcan->TxMailbox0CompleteCallback(hcan);
1750#else
1751 /* Call weak (surcharged) callback */
1753#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */
1754 }
1755 else
1756 {
1757 if ((tsrflags & CAN_TSR_ALST0) != 0U)
1758 {
1759 /* Update error code */
1760 errorcode |= HAL_CAN_ERROR_TX_ALST0;
1761 }
1762 else if ((tsrflags & CAN_TSR_TERR0) != 0U)
1763 {
1764 /* Update error code */
1765 errorcode |= HAL_CAN_ERROR_TX_TERR0;
1766 }
1767 else
1768 {
1769 /* Transmission Mailbox 0 abort callback */
1770#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1771 /* Call registered callback*/
1772 hcan->TxMailbox0AbortCallback(hcan);
1773#else
1774 /* Call weak (surcharged) callback */
1776#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */
1777 }
1778 }
1779 }
1780
1781 /* Transmit Mailbox 1 management *****************************************/
1782 if ((tsrflags & CAN_TSR_RQCP1) != 0U)
1783 {
1784 /* Clear the Transmission Complete flag (and TXOK1,ALST1,TERR1 bits) */
1786
1787 if ((tsrflags & CAN_TSR_TXOK1) != 0U)
1788 {
1789 /* Transmission Mailbox 1 complete callback */
1790#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1791 /* Call registered callback*/
1792 hcan->TxMailbox1CompleteCallback(hcan);
1793#else
1794 /* Call weak (surcharged) callback */
1796#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */
1797 }
1798 else
1799 {
1800 if ((tsrflags & CAN_TSR_ALST1) != 0U)
1801 {
1802 /* Update error code */
1803 errorcode |= HAL_CAN_ERROR_TX_ALST1;
1804 }
1805 else if ((tsrflags & CAN_TSR_TERR1) != 0U)
1806 {
1807 /* Update error code */
1808 errorcode |= HAL_CAN_ERROR_TX_TERR1;
1809 }
1810 else
1811 {
1812 /* Transmission Mailbox 1 abort callback */
1813#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1814 /* Call registered callback*/
1815 hcan->TxMailbox1AbortCallback(hcan);
1816#else
1817 /* Call weak (surcharged) callback */
1819#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */
1820 }
1821 }
1822 }
1823
1824 /* Transmit Mailbox 2 management *****************************************/
1825 if ((tsrflags & CAN_TSR_RQCP2) != 0U)
1826 {
1827 /* Clear the Transmission Complete flag (and TXOK2,ALST2,TERR2 bits) */
1829
1830 if ((tsrflags & CAN_TSR_TXOK2) != 0U)
1831 {
1832 /* Transmission Mailbox 2 complete callback */
1833#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1834 /* Call registered callback*/
1835 hcan->TxMailbox2CompleteCallback(hcan);
1836#else
1837 /* Call weak (surcharged) callback */
1839#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */
1840 }
1841 else
1842 {
1843 if ((tsrflags & CAN_TSR_ALST2) != 0U)
1844 {
1845 /* Update error code */
1846 errorcode |= HAL_CAN_ERROR_TX_ALST2;
1847 }
1848 else if ((tsrflags & CAN_TSR_TERR2) != 0U)
1849 {
1850 /* Update error code */
1851 errorcode |= HAL_CAN_ERROR_TX_TERR2;
1852 }
1853 else
1854 {
1855 /* Transmission Mailbox 2 abort callback */
1856#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1857 /* Call registered callback*/
1858 hcan->TxMailbox2AbortCallback(hcan);
1859#else
1860 /* Call weak (surcharged) callback */
1862#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */
1863 }
1864 }
1865 }
1866 }
1867
1868 /* Receive FIFO 0 overrun interrupt management *****************************/
1869 if ((interrupts & CAN_IT_RX_FIFO0_OVERRUN) != 0U)
1870 {
1871 if ((rf0rflags & CAN_RF0R_FOVR0) != 0U)
1872 {
1873 /* Set CAN error code to Rx Fifo 0 overrun error */
1874 errorcode |= HAL_CAN_ERROR_RX_FOV0;
1875
1876 /* Clear FIFO0 Overrun Flag */
1878 }
1879 }
1880
1881 /* Receive FIFO 0 full interrupt management ********************************/
1882 if ((interrupts & CAN_IT_RX_FIFO0_FULL) != 0U)
1883 {
1884 if ((rf0rflags & CAN_RF0R_FULL0) != 0U)
1885 {
1886 /* Clear FIFO 0 full Flag */
1888
1889 /* Receive FIFO 0 full Callback */
1890#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1891 /* Call registered callback*/
1892 hcan->RxFifo0FullCallback(hcan);
1893#else
1894 /* Call weak (surcharged) callback */
1896#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */
1897 }
1898 }
1899
1900 /* Receive FIFO 0 message pending interrupt management *********************/
1901 if ((interrupts & CAN_IT_RX_FIFO0_MSG_PENDING) != 0U)
1902 {
1903 /* Check if message is still pending */
1904 if ((hcan->Instance->RF0R & CAN_RF0R_FMP0) != 0U)
1905 {
1906 /* Receive FIFO 0 message pending Callback */
1907#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1908 /* Call registered callback*/
1909 hcan->RxFifo0MsgPendingCallback(hcan);
1910#else
1911 /* Call weak (surcharged) callback */
1913#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */
1914 }
1915 }
1916
1917 /* Receive FIFO 1 overrun interrupt management *****************************/
1918 if ((interrupts & CAN_IT_RX_FIFO1_OVERRUN) != 0U)
1919 {
1920 if ((rf1rflags & CAN_RF1R_FOVR1) != 0U)
1921 {
1922 /* Set CAN error code to Rx Fifo 1 overrun error */
1923 errorcode |= HAL_CAN_ERROR_RX_FOV1;
1924
1925 /* Clear FIFO1 Overrun Flag */
1927 }
1928 }
1929
1930 /* Receive FIFO 1 full interrupt management ********************************/
1931 if ((interrupts & CAN_IT_RX_FIFO1_FULL) != 0U)
1932 {
1933 if ((rf1rflags & CAN_RF1R_FULL1) != 0U)
1934 {
1935 /* Clear FIFO 1 full Flag */
1937
1938 /* Receive FIFO 1 full Callback */
1939#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1940 /* Call registered callback*/
1941 hcan->RxFifo1FullCallback(hcan);
1942#else
1943 /* Call weak (surcharged) callback */
1945#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */
1946 }
1947 }
1948
1949 /* Receive FIFO 1 message pending interrupt management *********************/
1950 if ((interrupts & CAN_IT_RX_FIFO1_MSG_PENDING) != 0U)
1951 {
1952 /* Check if message is still pending */
1953 if ((hcan->Instance->RF1R & CAN_RF1R_FMP1) != 0U)
1954 {
1955 /* Receive FIFO 1 message pending Callback */
1956#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1957 /* Call registered callback*/
1958 hcan->RxFifo1MsgPendingCallback(hcan);
1959#else
1960 /* Call weak (surcharged) callback */
1962#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */
1963 }
1964 }
1965
1966 /* Sleep interrupt management *********************************************/
1967 if ((interrupts & CAN_IT_SLEEP_ACK) != 0U)
1968 {
1969 if ((msrflags & CAN_MSR_SLAKI) != 0U)
1970 {
1971 /* Clear Sleep interrupt Flag */
1973
1974 /* Sleep Callback */
1975#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1976 /* Call registered callback*/
1977 hcan->SleepCallback(hcan);
1978#else
1979 /* Call weak (surcharged) callback */
1981#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */
1982 }
1983 }
1984
1985 /* WakeUp interrupt management *********************************************/
1986 if ((interrupts & CAN_IT_WAKEUP) != 0U)
1987 {
1988 if ((msrflags & CAN_MSR_WKUI) != 0U)
1989 {
1990 /* Clear WakeUp Flag */
1992
1993 /* WakeUp Callback */
1994#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
1995 /* Call registered callback*/
1996 hcan->WakeUpFromRxMsgCallback(hcan);
1997#else
1998 /* Call weak (surcharged) callback */
2000#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */
2001 }
2002 }
2003
2004 /* Error interrupts management *********************************************/
2005 if ((interrupts & CAN_IT_ERROR) != 0U)
2006 {
2007 if ((msrflags & CAN_MSR_ERRI) != 0U)
2008 {
2009 /* Check Error Warning Flag */
2010 if (((interrupts & CAN_IT_ERROR_WARNING) != 0U) &&
2011 ((esrflags & CAN_ESR_EWGF) != 0U))
2012 {
2013 /* Set CAN error code to Error Warning */
2014 errorcode |= HAL_CAN_ERROR_EWG;
2015
2016 /* No need for clear of Error Warning Flag as read-only */
2017 }
2018
2019 /* Check Error Passive Flag */
2020 if (((interrupts & CAN_IT_ERROR_PASSIVE) != 0U) &&
2021 ((esrflags & CAN_ESR_EPVF) != 0U))
2022 {
2023 /* Set CAN error code to Error Passive */
2024 errorcode |= HAL_CAN_ERROR_EPV;
2025
2026 /* No need for clear of Error Passive Flag as read-only */
2027 }
2028
2029 /* Check Bus-off Flag */
2030 if (((interrupts & CAN_IT_BUSOFF) != 0U) &&
2031 ((esrflags & CAN_ESR_BOFF) != 0U))
2032 {
2033 /* Set CAN error code to Bus-Off */
2034 errorcode |= HAL_CAN_ERROR_BOF;
2035
2036 /* No need for clear of Error Bus-Off as read-only */
2037 }
2038
2039 /* Check Last Error Code Flag */
2040 if (((interrupts & CAN_IT_LAST_ERROR_CODE) != 0U) &&
2041 ((esrflags & CAN_ESR_LEC) != 0U))
2042 {
2043 switch (esrflags & CAN_ESR_LEC)
2044 {
2045 case (CAN_ESR_LEC_0):
2046 /* Set CAN error code to Stuff error */
2047 errorcode |= HAL_CAN_ERROR_STF;
2048 break;
2049 case (CAN_ESR_LEC_1):
2050 /* Set CAN error code to Form error */
2051 errorcode |= HAL_CAN_ERROR_FOR;
2052 break;
2053 case (CAN_ESR_LEC_1 | CAN_ESR_LEC_0):
2054 /* Set CAN error code to Acknowledgement error */
2055 errorcode |= HAL_CAN_ERROR_ACK;
2056 break;
2057 case (CAN_ESR_LEC_2):
2058 /* Set CAN error code to Bit recessive error */
2059 errorcode |= HAL_CAN_ERROR_BR;
2060 break;
2061 case (CAN_ESR_LEC_2 | CAN_ESR_LEC_0):
2062 /* Set CAN error code to Bit Dominant error */
2063 errorcode |= HAL_CAN_ERROR_BD;
2064 break;
2065 case (CAN_ESR_LEC_2 | CAN_ESR_LEC_1):
2066 /* Set CAN error code to CRC error */
2067 errorcode |= HAL_CAN_ERROR_CRC;
2068 break;
2069 default:
2070 break;
2071 }
2072
2073 /* Clear Last error code Flag */
2074 CLEAR_BIT(hcan->Instance->ESR, CAN_ESR_LEC);
2075 }
2076 }
2077
2078 /* Clear ERRI Flag */
2080 }
2081
2082 /* Call the Error call Back in case of Errors */
2083 if (errorcode != HAL_CAN_ERROR_NONE)
2084 {
2085 /* Update error code in handle */
2086 hcan->ErrorCode |= errorcode;
2087
2088 /* Call Error callback function */
2089#if USE_HAL_CAN_REGISTER_CALLBACKS == 1
2090 /* Call registered callback*/
2091 hcan->ErrorCallback(hcan);
2092#else
2093 /* Call weak (surcharged) callback */
2095#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */
2096 }
2097}
2098
2137{
2138 /* Prevent unused argument(s) compilation warning */
2139 UNUSED(hcan);
2140
2141 /* NOTE : This function Should not be modified, when the callback is needed,
2142 the HAL_CAN_TxMailbox0CompleteCallback could be implemented in the
2143 user file
2144 */
2145}
2146
2154{
2155 /* Prevent unused argument(s) compilation warning */
2156 UNUSED(hcan);
2157
2158 /* NOTE : This function Should not be modified, when the callback is needed,
2159 the HAL_CAN_TxMailbox1CompleteCallback could be implemented in the
2160 user file
2161 */
2162}
2163
2171{
2172 /* Prevent unused argument(s) compilation warning */
2173 UNUSED(hcan);
2174
2175 /* NOTE : This function Should not be modified, when the callback is needed,
2176 the HAL_CAN_TxMailbox2CompleteCallback could be implemented in the
2177 user file
2178 */
2179}
2180
2188{
2189 /* Prevent unused argument(s) compilation warning */
2190 UNUSED(hcan);
2191
2192 /* NOTE : This function Should not be modified, when the callback is needed,
2193 the HAL_CAN_TxMailbox0AbortCallback could be implemented in the
2194 user file
2195 */
2196}
2197
2205{
2206 /* Prevent unused argument(s) compilation warning */
2207 UNUSED(hcan);
2208
2209 /* NOTE : This function Should not be modified, when the callback is needed,
2210 the HAL_CAN_TxMailbox1AbortCallback could be implemented in the
2211 user file
2212 */
2213}
2214
2222{
2223 /* Prevent unused argument(s) compilation warning */
2224 UNUSED(hcan);
2225
2226 /* NOTE : This function Should not be modified, when the callback is needed,
2227 the HAL_CAN_TxMailbox2AbortCallback could be implemented in the
2228 user file
2229 */
2230}
2231
2239{
2240 /* Prevent unused argument(s) compilation warning */
2241 UNUSED(hcan);
2242
2243 /* NOTE : This function Should not be modified, when the callback is needed,
2244 the HAL_CAN_RxFifo0MsgPendingCallback could be implemented in the
2245 user file
2246 */
2247}
2248
2256{
2257 /* Prevent unused argument(s) compilation warning */
2258 UNUSED(hcan);
2259
2260 /* NOTE : This function Should not be modified, when the callback is needed,
2261 the HAL_CAN_RxFifo0FullCallback could be implemented in the user
2262 file
2263 */
2264}
2265
2273{
2274 /* Prevent unused argument(s) compilation warning */
2275 UNUSED(hcan);
2276
2277 /* NOTE : This function Should not be modified, when the callback is needed,
2278 the HAL_CAN_RxFifo1MsgPendingCallback could be implemented in the
2279 user file
2280 */
2281}
2282
2290{
2291 /* Prevent unused argument(s) compilation warning */
2292 UNUSED(hcan);
2293
2294 /* NOTE : This function Should not be modified, when the callback is needed,
2295 the HAL_CAN_RxFifo1FullCallback could be implemented in the user
2296 file
2297 */
2298}
2299
2307{
2308 /* Prevent unused argument(s) compilation warning */
2309 UNUSED(hcan);
2310
2311 /* NOTE : This function Should not be modified, when the callback is needed,
2312 the HAL_CAN_SleepCallback could be implemented in the user file
2313 */
2314}
2315
2323{
2324 /* Prevent unused argument(s) compilation warning */
2325 UNUSED(hcan);
2326
2327 /* NOTE : This function Should not be modified, when the callback is needed,
2328 the HAL_CAN_WakeUpFromRxMsgCallback could be implemented in the
2329 user file
2330 */
2331}
2332
2340{
2341 /* Prevent unused argument(s) compilation warning */
2342 UNUSED(hcan);
2343
2344 /* NOTE : This function Should not be modified, when the callback is needed,
2345 the HAL_CAN_ErrorCallback could be implemented in the user file
2346 */
2347}
2348
2377{
2378 HAL_CAN_StateTypeDef state = hcan->State;
2379
2380 if ((state == HAL_CAN_STATE_READY) ||
2381 (state == HAL_CAN_STATE_LISTENING))
2382 {
2383 /* Check sleep mode acknowledge flag */
2384 if ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U)
2385 {
2386 /* Sleep mode is active */
2388 }
2389 /* Check sleep mode request flag */
2390 else if ((hcan->Instance->MCR & CAN_MCR_SLEEP) != 0U)
2391 {
2392 /* Sleep mode request is pending */
2394 }
2395 else
2396 {
2397 /* Neither sleep mode request nor sleep mode acknowledge */
2398 }
2399 }
2400
2401 /* Return CAN state */
2402 return state;
2403}
2404
2412{
2413 /* Return CAN error code */
2414 return hcan->ErrorCode;
2415}
2416
2424{
2425 HAL_StatusTypeDef status = HAL_OK;
2426 HAL_CAN_StateTypeDef state = hcan->State;
2427
2428 if ((state == HAL_CAN_STATE_READY) ||
2429 (state == HAL_CAN_STATE_LISTENING))
2430 {
2431 /* Reset CAN error code */
2432 hcan->ErrorCode = 0U;
2433 }
2434 else
2435 {
2436 /* Update error code */
2438
2439 status = HAL_ERROR;
2440 }
2441
2442 /* Return the status */
2443 return status;
2444}
2445
2454#endif /* HAL_CAN_MODULE_ENABLED */
2455
2460#endif /* CAN1 */
2461
#define HAL_CAN_ERROR_TX_TERR1
#define HAL_CAN_ERROR_FOR
#define HAL_CAN_ERROR_TX_ALST2
#define HAL_CAN_ERROR_BD
#define HAL_CAN_ERROR_TIMEOUT
#define HAL_CAN_ERROR_RX_FOV1
#define HAL_CAN_ERROR_STF
#define HAL_CAN_ERROR_TX_ALST1
#define HAL_CAN_ERROR_TX_TERR2
#define HAL_CAN_ERROR_TX_ALST0
#define HAL_CAN_ERROR_NOT_READY
#define HAL_CAN_ERROR_NOT_INITIALIZED
#define HAL_CAN_ERROR_NONE
#define HAL_CAN_ERROR_EWG
#define HAL_CAN_ERROR_TX_TERR0
#define HAL_CAN_ERROR_CRC
#define HAL_CAN_ERROR_NOT_STARTED
#define HAL_CAN_ERROR_BR
#define HAL_CAN_ERROR_PARAM
#define HAL_CAN_ERROR_EPV
#define HAL_CAN_ERROR_RX_FOV0
#define HAL_CAN_ERROR_BOF
#define HAL_CAN_ERROR_ACK
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_ConfigFilter(CAN_HandleTypeDef *hcan, CAN_FilterConfTypeDef *sFilterConfig)
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.
void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan)
Error CAN callback.
void HAL_CAN_IRQHandler(CAN_HandleTypeDef *hcan)
Handles CAN interrupt request.
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_CAN_StateTypeDef HAL_CAN_GetState(CAN_HandleTypeDef *hcan)
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.
uint32_t HAL_CAN_GetError(CAN_HandleTypeDef *hcan)
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_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_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_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.
#define __HAL_CAN_CLEAR_FLAG(__HANDLE__, __FLAG__)
Clear the specified CAN pending flag.
#define __HAL_CAN_DISABLE_IT(__HANDLE__, __INTERRUPT__)
Disable the specified CAN interrupts.
#define __HAL_CAN_ENABLE_IT(__HANDLE__, __INTERRUPT__)
Enable the specified CAN interrupts.
HAL_CAN_StateTypeDef
HAL State structures definition.
@ HAL_CAN_STATE_LISTENING
@ HAL_CAN_STATE_ERROR
@ HAL_CAN_STATE_READY
@ HAL_CAN_STATE_SLEEP_ACTIVE
@ HAL_CAN_STATE_RESET
@ HAL_CAN_STATE_SLEEP_PENDING
#define CAN_ID_STD
#define CAN_IT_RX_FIFO1_FULL
#define CAN_IT_RX_FIFO0_MSG_PENDING
#define CAN_IT_ERROR_WARNING
#define CAN_IT_ERROR_PASSIVE
#define CAN_IT_BUSOFF
#define CAN_IT_RX_FIFO0_OVERRUN
#define CAN_IT_RX_FIFO1_MSG_PENDING
#define CAN_IT_WAKEUP
#define CAN_IT_SLEEP_ACK
#define CAN_IT_RX_FIFO1_OVERRUN
#define CAN_IT_LAST_ERROR_CODE
#define CAN_IT_RX_FIFO0_FULL
#define CAN_IT_TX_MAILBOX_EMPTY
#define CAN_IT_ERROR
#define CAN_TIMEOUT_VALUE
#define CAN_WAKEUP_TIMEOUT_COUNTER
#define IS_CAN_FILTER_BANK_DUAL(BANK)
#define IS_CAN_BS1(BS1)
#define IS_CAN_FILTER_FIFO(FIFO)
#define IS_CAN_RTR(RTR)
#define IS_CAN_TX_MAILBOX_LIST(TRANSMITMAILBOX)
#define IS_CAN_BS2(BS2)
#define IS_CAN_SJW(SJW)
#define IS_CAN_MODE(MODE)
#define IS_CAN_DLC(DLC)
#define IS_CAN_EXTID(EXTID)
#define IS_CAN_RX_FIFO(FIFO)
#define IS_CAN_FILTER_ID_HALFWORD(HALFWORD)
#define IS_CAN_IDTYPE(IDTYPE)
#define IS_CAN_IT(IT)
#define IS_CAN_PRESCALER(PRESCALER)
#define IS_CAN_FILTER_MODE(MODE)
#define IS_CAN_TX_MAILBOX(TRANSMITMAILBOX)
#define IS_CAN_STDID(STDID)
#define IS_CAN_FILTER_ACTIVATION(ACTIVATION)
#define IS_CAN_FILTER_BANK_SINGLE(BANK)
#define IS_CAN_FILTER_SCALE(SCALE)
#define CAN_TX_MAILBOX2
#define CAN_TX_MAILBOX1
#define CAN_TX_MAILBOX0
#define CAN_FILTER_FIFO0
#define CAN_FILTER_ENABLE
#define CAN_FILTERMODE_IDMASK
#define CAN_FILTERSCALE_16BIT
#define CAN_FILTERSCALE_32BIT
#define CAN_FLAG_FF1
#define CAN_FLAG_FF0
#define CAN_FLAG_WKU
#define CAN_FLAG_ERRI
#define CAN_FLAG_FOV0
#define CAN_FLAG_RQCP0
#define CAN_FLAG_RQCP2
#define CAN_FLAG_SLAKI
#define CAN_FLAG_RQCP1
#define CAN_FLAG_FOV1
#define CAN_RX_FIFO0
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
@ HAL_ERROR
@ HAL_OK
#define UNUSED(X)
CAN filter configuration structure definition.
CAN handle Structure definition.
__IO HAL_CAN_StateTypeDef State
FunctionalState AutoBusOff
FunctionalState ReceiveFifoLocked
FunctionalState TimeTriggeredMode
FunctionalState AutoRetransmission
FunctionalState AutoWakeUp
FunctionalState TransmitFifoPriority
CAN Rx message header structure definition.
CAN Tx message header structure definition.
FunctionalState TransmitGlobalTime