STM32F4xx_HAL_Driver  1.8.3
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 
275 HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef *hcan)
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));
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));
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 */
346  hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;
347 
348  /* Change CAN state */
349  hcan->State = HAL_CAN_STATE_ERROR;
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 */
367  hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;
368 
369  /* Change CAN state */
370  hcan->State = HAL_CAN_STATE_ERROR;
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 */
444  hcan->ErrorCode = HAL_CAN_ERROR_NONE;
445 
446  /* Initialize the CAN state */
447  hcan->State = HAL_CAN_STATE_READY;
448 
449  /* Return function status */
450  return HAL_OK;
451 }
452 
460 HAL_StatusTypeDef HAL_CAN_DeInit(CAN_HandleTypeDef *hcan)
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 */
492  hcan->ErrorCode = HAL_CAN_ERROR_NONE;
493 
494  /* Change CAN state */
495  hcan->State = HAL_CAN_STATE_RESET;
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
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  {
577  hcan->TxMailbox0CompleteCallback = pCallback;
578  break;
579 
581  hcan->TxMailbox1CompleteCallback = pCallback;
582  break;
583 
585  hcan->TxMailbox2CompleteCallback = pCallback;
586  break;
587 
589  hcan->TxMailbox0AbortCallback = pCallback;
590  break;
591 
593  hcan->TxMailbox1AbortCallback = pCallback;
594  break;
595 
597  hcan->TxMailbox2AbortCallback = pCallback;
598  break;
599 
601  hcan->RxFifo0MsgPendingCallback = pCallback;
602  break;
603 
605  hcan->RxFifo0FullCallback = pCallback;
606  break;
607 
609  hcan->RxFifo1MsgPendingCallback = pCallback;
610  break;
611 
613  hcan->RxFifo1FullCallback = pCallback;
614  break;
615 
616  case HAL_CAN_SLEEP_CB_ID :
617  hcan->SleepCallback = pCallback;
618  break;
619 
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 
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 
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 
703 {
704  HAL_StatusTypeDef status = HAL_OK;
705 
706  if (hcan->State == HAL_CAN_STATE_READY)
707  {
708  switch (CallbackID)
709  {
711  hcan->TxMailbox0CompleteCallback = HAL_CAN_TxMailbox0CompleteCallback;
712  break;
713 
715  hcan->TxMailbox1CompleteCallback = HAL_CAN_TxMailbox1CompleteCallback;
716  break;
717 
719  hcan->TxMailbox2CompleteCallback = HAL_CAN_TxMailbox2CompleteCallback;
720  break;
721 
723  hcan->TxMailbox0AbortCallback = HAL_CAN_TxMailbox0AbortCallback;
724  break;
725 
727  hcan->TxMailbox1AbortCallback = HAL_CAN_TxMailbox1AbortCallback;
728  break;
729 
731  hcan->TxMailbox2AbortCallback = HAL_CAN_TxMailbox2AbortCallback;
732  break;
733 
735  hcan->RxFifo0MsgPendingCallback = HAL_CAN_RxFifo0MsgPendingCallback;
736  break;
737 
739  hcan->RxFifo0FullCallback = HAL_CAN_RxFifo0FullCallback;
740  break;
741 
743  hcan->RxFifo1MsgPendingCallback = HAL_CAN_RxFifo1MsgPendingCallback;
744  break;
745 
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 
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 
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 
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 
840 HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan, const CAN_FilterTypeDef *sFilterConfig)
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 */
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));
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 */
866  assert_param(IS_CAN_FILTER_BANK_SINGLE(sFilterConfig->FilterBank));
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 */
875  assert_param(IS_CAN_FILTER_BANK_DUAL(sFilterConfig->FilterBank));
876  assert_param(IS_CAN_FILTER_BANK_DUAL(sFilterConfig->SlaveStartFilterBank));
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 */
884  assert_param(IS_CAN_FILTER_BANK_DUAL(sFilterConfig->FilterBank));
885  assert_param(IS_CAN_FILTER_BANK_DUAL(sFilterConfig->SlaveStartFilterBank));
886 #else
887  /* CAN1 is single instance with 14 dedicated filters banks */
888 
889  /* Check the parameters */
890  assert_param(IS_CAN_FILTER_BANK_SINGLE(sFilterConfig->FilterBank));
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 */
991  hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
992 
993  return HAL_ERROR;
994  }
995 }
996 
1034 HAL_StatusTypeDef HAL_CAN_Start(CAN_HandleTypeDef *hcan)
1035 {
1036  uint32_t tickstart;
1037 
1038  if (hcan->State == HAL_CAN_STATE_READY)
1039  {
1040  /* Change CAN peripheral state */
1041  hcan->State = HAL_CAN_STATE_LISTENING;
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 */
1056  hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;
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 */
1066  hcan->ErrorCode = HAL_CAN_ERROR_NONE;
1067 
1068  /* Return function status */
1069  return HAL_OK;
1070  }
1071  else
1072  {
1073  /* Update error code */
1074  hcan->ErrorCode |= HAL_CAN_ERROR_NOT_READY;
1075 
1076  return HAL_ERROR;
1077  }
1078 }
1079 
1086 HAL_StatusTypeDef HAL_CAN_Stop(CAN_HandleTypeDef *hcan)
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 */
1105  hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;
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 */
1126  hcan->ErrorCode |= HAL_CAN_ERROR_NOT_STARTED;
1127 
1128  return HAL_ERROR;
1129  }
1130 }
1131 
1141 HAL_StatusTypeDef HAL_CAN_RequestSleep(CAN_HandleTypeDef *hcan)
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 */
1157  hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
1158 
1159  /* Return function status */
1160  return HAL_ERROR;
1161  }
1162 }
1163 
1172 HAL_StatusTypeDef HAL_CAN_WakeUp(CAN_HandleTypeDef *hcan)
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 */
1193  hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;
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 */
1205  hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
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 
1250 HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan, const CAN_TxHeaderTypeDef *pHeader,
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 */
1328  hcan->ErrorCode |= HAL_CAN_ERROR_PARAM;
1329 
1330  return HAL_ERROR;
1331  }
1332  }
1333  else
1334  {
1335  /* Update error code */
1336  hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
1337 
1338  return HAL_ERROR;
1339  }
1340 }
1341 
1350 HAL_StatusTypeDef HAL_CAN_AbortTxRequest(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes)
1351 {
1352  HAL_CAN_StateTypeDef state = hcan->State;
1353 
1354  /* Check function parameters */
1355  assert_param(IS_CAN_TX_MAILBOX_LIST(TxMailboxes));
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 */
1387  hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
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 
1442 uint32_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 */
1448  assert_param(IS_CAN_TX_MAILBOX_LIST(TxMailboxes));
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 
1474 uint32_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 
1508 HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo,
1509  CAN_RxHeaderTypeDef *pHeader, uint8_t aData[])
1510 {
1511  HAL_CAN_StateTypeDef state = hcan->State;
1512 
1513  assert_param(IS_CAN_RX_FIFO(RxFifo));
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 */
1525  hcan->ErrorCode |= HAL_CAN_ERROR_PARAM;
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 */
1536  hcan->ErrorCode |= HAL_CAN_ERROR_PARAM;
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 */
1594  hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
1595 
1596  return HAL_ERROR;
1597  }
1598 }
1599 
1608 uint32_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 */
1614  assert_param(IS_CAN_RX_FIFO(RxFifo));
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 
1661 HAL_StatusTypeDef HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan, uint32_t ActiveITs)
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 */
1680  hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
1681 
1682  return HAL_ERROR;
1683  }
1684 }
1685 
1694 HAL_StatusTypeDef HAL_CAN_DeactivateNotification(CAN_HandleTypeDef *hcan, uint32_t InactiveITs)
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 */
1713  hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
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) */
1742  __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_RQCP0);
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) */
1785  __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_RQCP1);
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) */
1828  __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_RQCP2);
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 */
1877  __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV0);
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 */
1887  __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FF0);
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 */
1926  __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV1);
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 */
1936  __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FF1);
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 */
1972  __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_SLAKI);
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 */
1980  HAL_CAN_SleepCallback(hcan);
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 */
1991  __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_WKU);
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 */
2079  __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_ERRI);
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 */
2094  HAL_CAN_ErrorCallback(hcan);
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 
2423 HAL_StatusTypeDef HAL_CAN_ResetError(CAN_HandleTypeDef *hcan)
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 */
2437  hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
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 
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.
FunctionalState TransmitGlobalTime
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_ERROR
@ HAL_CAN_STATE_READY
@ HAL_CAN_STATE_SLEEP_ACTIVE
@ HAL_CAN_STATE_RESET
@ HAL_CAN_STATE_SLEEP_PENDING
@ HAL_CAN_WAKEUP_FROM_RX_MSG_CB_ID
@ HAL_CAN_SLEEP_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_ERROR_CB_ID
@ HAL_CAN_MSPINIT_CB_ID
@ HAL_CAN_RX_FIFO1_FULL_CB_ID
CAN filter configuration structure definition.
CAN Rx message header structure definition.
CAN Tx message header 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.