STM32L4xx_HAL_Driver  1.14.0
Configuration functions

Configuration functions. More...

Functions

HAL_StatusTypeDef HAL_CAN_ConfigFilter (CAN_HandleTypeDef *hcan, CAN_FilterTypeDef *sFilterConfig)
 Configures the CAN reception filter according to the specified parameters in the CAN_FilterInitStruct. More...
 

Detailed Description

Configuration functions.

  ==============================================================================
              ##### Configuration functions #####
  ==============================================================================
    [..]  This section provides functions allowing to:
      (+) HAL_CAN_ConfigFilter            : Configure the CAN reception filters

Function Documentation

◆ HAL_CAN_ConfigFilter()

HAL_StatusTypeDef HAL_CAN_ConfigFilter ( CAN_HandleTypeDef hcan,
CAN_FilterTypeDef sFilterConfig 
)

Configures the CAN reception filter according to the specified parameters in the CAN_FilterInitStruct.

Parameters
hcanpointer to a CAN_HandleTypeDef structure that contains the configuration information for the specified CAN.
sFilterConfigpointer to a CAN_FilterTypeDef structure that contains the filter configuration information.
Return values
None

Definition at line 838 of file stm32l4xx_hal_can.c.

839 {
840  uint32_t filternbrbitpos;
841  CAN_TypeDef *can_ip = hcan->Instance;
842  HAL_CAN_StateTypeDef state = hcan->State;
843 
844  if ((state == HAL_CAN_STATE_READY) ||
845  (state == HAL_CAN_STATE_LISTENING))
846  {
847  /* Check the parameters */
848  assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->FilterIdHigh));
849  assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->FilterIdLow));
850  assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->FilterMaskIdHigh));
851  assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->FilterMaskIdLow));
852  assert_param(IS_CAN_FILTER_MODE(sFilterConfig->FilterMode));
853  assert_param(IS_CAN_FILTER_SCALE(sFilterConfig->FilterScale));
854  assert_param(IS_CAN_FILTER_FIFO(sFilterConfig->FilterFIFOAssignment));
855  assert_param(IS_CAN_FILTER_ACTIVATION(sFilterConfig->FilterActivation));
856 
857 #if defined(CAN2)
858  /* CAN1 and CAN2 are dual instances with 28 common filters banks */
859  /* Select master instance to access the filter banks */
860  can_ip = CAN1;
861 
862  /* Check the parameters */
863  assert_param(IS_CAN_FILTER_BANK_DUAL(sFilterConfig->FilterBank));
864  assert_param(IS_CAN_FILTER_BANK_DUAL(sFilterConfig->SlaveStartFilterBank));
865 #else
866  /* CAN1 is single instance with 14 dedicated filters banks */
867 
868  /* Check the parameters */
869  assert_param(IS_CAN_FILTER_BANK_SINGLE(sFilterConfig->FilterBank));
870 #endif
871 
872  /* Initialisation mode for the filter */
873  SET_BIT(can_ip->FMR, CAN_FMR_FINIT);
874 
875 #if defined(CAN2)
876  /* Select the start filter number of CAN2 slave instance */
877  CLEAR_BIT(can_ip->FMR, CAN_FMR_CAN2SB);
878  SET_BIT(can_ip->FMR, sFilterConfig->SlaveStartFilterBank << CAN_FMR_CAN2SB_Pos);
879 
880 #endif
881  /* Convert filter number into bit position */
882  filternbrbitpos = (uint32_t)1 << (sFilterConfig->FilterBank & 0x1FU);
883 
884  /* Filter Deactivation */
885  CLEAR_BIT(can_ip->FA1R, filternbrbitpos);
886 
887  /* Filter Scale */
888  if (sFilterConfig->FilterScale == CAN_FILTERSCALE_16BIT)
889  {
890  /* 16-bit scale for the filter */
891  CLEAR_BIT(can_ip->FS1R, filternbrbitpos);
892 
893  /* First 16-bit identifier and First 16-bit mask */
894  /* Or First 16-bit identifier and Second 16-bit identifier */
895  can_ip->sFilterRegister[sFilterConfig->FilterBank].FR1 =
896  ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow) << 16U) |
897  (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdLow);
898 
899  /* Second 16-bit identifier and Second 16-bit mask */
900  /* Or Third 16-bit identifier and Fourth 16-bit identifier */
901  can_ip->sFilterRegister[sFilterConfig->FilterBank].FR2 =
902  ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) |
903  (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh);
904  }
905 
906  if (sFilterConfig->FilterScale == CAN_FILTERSCALE_32BIT)
907  {
908  /* 32-bit scale for the filter */
909  SET_BIT(can_ip->FS1R, filternbrbitpos);
910 
911  /* 32-bit identifier or First 32-bit identifier */
912  can_ip->sFilterRegister[sFilterConfig->FilterBank].FR1 =
913  ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh) << 16U) |
914  (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdLow);
915 
916  /* 32-bit mask or Second 32-bit identifier */
917  can_ip->sFilterRegister[sFilterConfig->FilterBank].FR2 =
918  ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) |
919  (0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow);
920  }
921 
922  /* Filter Mode */
923  if (sFilterConfig->FilterMode == CAN_FILTERMODE_IDMASK)
924  {
925  /* Id/Mask mode for the filter*/
926  CLEAR_BIT(can_ip->FM1R, filternbrbitpos);
927  }
928  else /* CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdList */
929  {
930  /* Identifier list mode for the filter*/
931  SET_BIT(can_ip->FM1R, filternbrbitpos);
932  }
933 
934  /* Filter FIFO assignment */
935  if (sFilterConfig->FilterFIFOAssignment == CAN_FILTER_FIFO0)
936  {
937  /* FIFO 0 assignation for the filter */
938  CLEAR_BIT(can_ip->FFA1R, filternbrbitpos);
939  }
940  else
941  {
942  /* FIFO 1 assignation for the filter */
943  SET_BIT(can_ip->FFA1R, filternbrbitpos);
944  }
945 
946  /* Filter activation */
947  if (sFilterConfig->FilterActivation == CAN_FILTER_ENABLE)
948  {
949  SET_BIT(can_ip->FA1R, filternbrbitpos);
950  }
951 
952  /* Leave the initialisation mode for the filter */
953  CLEAR_BIT(can_ip->FMR, CAN_FMR_FINIT);
954 
955  /* Return function status */
956  return HAL_OK;
957  }
958  else
959  {
960  /* Update error code */
961  hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
962 
963  return HAL_ERROR;
964  }
965 }
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
__IO HAL_CAN_StateTypeDef State
return HAL_OK
HAL_CAN_StateTypeDef
HAL State structures definition.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))