• FDCAN硬件过滤器详解


    这里以FDCAN2、FDCAN3为例,分别加上标准帧、扩展帧硬件过滤器
    注意cubemx的配置,按照需要增加Std Filters Nbr,我这里设置为30组。

    先看FDCAN2,加上标准帧过滤器

    在这里插入图片描述
    下面是FDCAN2加上硬件过滤器的代码:

    void MX_FDCAN2_Init(void)
    {
    
      /* USER CODE BEGIN FDCAN2_Init 0 */
    	FDCAN_FilterTypeDef FDCAN2_RXFilter;
      /* USER CODE END FDCAN2_Init 0 */
    
      /* USER CODE BEGIN FDCAN2_Init 1 */
    
      /* USER CODE END FDCAN2_Init 1 */
      hfdcan2.Instance = FDCAN2;
      hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
      hfdcan2.Init.Mode = FDCAN_MODE_NORMAL;
      hfdcan2.Init.AutoRetransmission = DISABLE;
      hfdcan2.Init.TransmitPause = DISABLE;
      hfdcan2.Init.ProtocolException = DISABLE;
      hfdcan2.Init.NominalPrescaler = 5;
      hfdcan2.Init.NominalSyncJumpWidth = 8;
      hfdcan2.Init.NominalTimeSeg1 = 31;
      hfdcan2.Init.NominalTimeSeg2 = 8;
      hfdcan2.Init.DataPrescaler = 1;
      hfdcan2.Init.DataSyncJumpWidth = 1;
      hfdcan2.Init.DataTimeSeg1 = 15;
      hfdcan2.Init.DataTimeSeg2 = 4;
      hfdcan2.Init.MessageRAMOffset = 0x406;
      hfdcan2.Init.StdFiltersNbr = 30;
      hfdcan2.Init.ExtFiltersNbr = 0;
      hfdcan2.Init.RxFifo0ElmtsNbr = 0;
      hfdcan2.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
      hfdcan2.Init.RxFifo1ElmtsNbr = 32;
      hfdcan2.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
      hfdcan2.Init.RxBuffersNbr = 0;
      hfdcan2.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
      hfdcan2.Init.TxEventsNbr = 0;
      hfdcan2.Init.TxBuffersNbr = 0;
      hfdcan2.Init.TxFifoQueueElmtsNbr = 6;
      hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
      hfdcan2.Init.TxElmtSize = FDCAN_DATA_BYTES_8;
      if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK)
      {
        Error_Handler();
      }
      /* USER CODE BEGIN FDCAN2_Init 2 */
    	
    	#if  0
    	//不过滤ID,都接收
    	//配置RX滤波器   
        FDCAN2_RXFilter.IdType=FDCAN_STANDARD_ID;                       //标准ID
        FDCAN2_RXFilter.FilterIndex=0;                                  //滤波器索引                   
        FDCAN2_RXFilter.FilterType=FDCAN_FILTER_MASK;                   //滤波器类型
        FDCAN2_RXFilter.FilterConfig=FDCAN_FILTER_TO_RXFIFO1;           //过滤器0关联到FIFO1  
        FDCAN2_RXFilter.FilterID1=0x0000;                               //32位ID
        FDCAN2_RXFilter.FilterID2=0x0000;                               //如果FDCAN配置为传统模式的话,这里是32位掩码
    	
    		HAL_FDCAN_ConfigFilter(&hfdcan2,&FDCAN2_RXFilter);
    	
        HAL_FDCAN_Start(&hfdcan2);                               //开启FDCAN
    	 
    	 
    	 /* HAL_FDCAN_ConfigGlobalFilter()
        * 参数2:设置标准帧ID,接收的报文ID没有匹配上滤波器时,选择拒绝接收(没有匹配上时,可以选择放入FIFO0或者FIFO1)。
        * 参数3:设置拓展帧ID,接收的报文ID没有匹配上滤波器时,选择拒绝接收。
        * 参数4:设置是否拒绝远程标准帧,ENABLE代表拒绝接收。
        * 参数5:设置是否拒绝远程拓展帧,ENABLE代表拒绝接收。
        */
       HAL_FDCAN_ConfigGlobalFilter(&hfdcan2,FDCAN_REJECT,FDCAN_REJECT,ENABLE,ENABLE); /* 设置FDCAN1滤波器1全局配置  */
    	 HAL_FDCAN_ActivateNotification(&hfdcan2,FDCAN_IT_RX_FIFO1_NEW_MESSAGE,0);
    	 #else
    	 
    	 //配置RX滤波器   
        FDCAN2_RXFilter.IdType=FDCAN_STANDARD_ID;                       //标准ID
        FDCAN2_RXFilter.FilterIndex=0;                                  //滤波器索引                   
        FDCAN2_RXFilter.FilterType=FDCAN_FILTER_RANGE;                   //滤波器类型
        FDCAN2_RXFilter.FilterConfig=FDCAN_FILTER_TO_RXFIFO1;           //过滤器0关联到FIFO1  
        FDCAN2_RXFilter.FilterID1=0x110;                               //32位ID
        FDCAN2_RXFilter.FilterID2=0x110;                               //如果FDCAN配置为传统模式的话,这里是32位掩码
    	
    		HAL_FDCAN_ConfigFilter(&hfdcan2,&FDCAN2_RXFilter);
    		
    		FDCAN2_RXFilter.FilterIndex=1;  
    		FDCAN2_RXFilter.FilterID1=0x111;                               //32位ID
        FDCAN2_RXFilter.FilterID2=0x111;                               //如果FDCAN配置为传统模式的话,这里是32位掩码
    		HAL_FDCAN_ConfigFilter(&hfdcan2,&FDCAN2_RXFilter);
    		
    		
    		FDCAN2_RXFilter.FilterIndex=2;  
    		FDCAN2_RXFilter.FilterID1=0x60B;                               //32位ID
        FDCAN2_RXFilter.FilterID2=0x60B;                               //如果FDCAN配置为传统模式的话,这里是32位掩码
    		HAL_FDCAN_ConfigFilter(&hfdcan2,&FDCAN2_RXFilter);
    		
    		FDCAN2_RXFilter.FilterIndex=3;  
    		FDCAN2_RXFilter.FilterID1=0x60E;                               //32位ID
        FDCAN2_RXFilter.FilterID2=0x60E;                               //如果FDCAN配置为传统模式的话,这里是32位掩码
    		HAL_FDCAN_ConfigFilter(&hfdcan2,&FDCAN2_RXFilter);
    		
    		FDCAN2_RXFilter.FilterIndex=4;  
    		FDCAN2_RXFilter.FilterID1=0x201;                               //32位ID
        FDCAN2_RXFilter.FilterID2=0x201;                               //如果FDCAN配置为传统模式的话,这里是32位掩码
    		HAL_FDCAN_ConfigFilter(&hfdcan2,&FDCAN2_RXFilter);
    		
    		FDCAN2_RXFilter.FilterIndex=5;  
    		FDCAN2_RXFilter.FilterID1=0x60A;                               //32位ID
        FDCAN2_RXFilter.FilterID2=0x60A;                               //如果FDCAN配置为传统模式的话,这里是32位掩码
    		HAL_FDCAN_ConfigFilter(&hfdcan2,&FDCAN2_RXFilter);
    		
    		FDCAN2_RXFilter.FilterIndex=6;  
    		FDCAN2_RXFilter.FilterID1=0x700;                               //32位ID
        FDCAN2_RXFilter.FilterID2=0x700;                               //如果FDCAN配置为传统模式的话,这里是32位掩码
    		HAL_FDCAN_ConfigFilter(&hfdcan2,&FDCAN2_RXFilter);
    		
    		FDCAN2_RXFilter.FilterIndex=7;  
    		FDCAN2_RXFilter.FilterID1=0x402;                               //32位ID
        FDCAN2_RXFilter.FilterID2=0x402;                               //如果FDCAN配置为传统模式的话,这里是32位掩码
    		HAL_FDCAN_ConfigFilter(&hfdcan2,&FDCAN2_RXFilter);
    		
    	
        HAL_FDCAN_Start(&hfdcan2);                               //开启FDCAN
    	 
    	 
    	 /* HAL_FDCAN_ConfigGlobalFilter()
        * 参数2:设置标准帧ID,接收的报文ID没有匹配上滤波器时,选择拒绝接收(没有匹配上时,可以选择放入FIFO0或者FIFO1)。
        * 参数3:设置拓展帧ID,接收的报文ID没有匹配上滤波器时,选择拒绝接收。
        * 参数4:设置是否拒绝远程标准帧,ENABLE代表拒绝接收。
        * 参数5:设置是否拒绝远程拓展帧,ENABLE代表拒绝接收。
        */
       HAL_FDCAN_ConfigGlobalFilter(&hfdcan2,FDCAN_REJECT,FDCAN_REJECT,ENABLE,ENABLE); /* 设置FDCAN1滤波器1全局配置  */
    	 HAL_FDCAN_ActivateNotification(&hfdcan2,FDCAN_IT_RX_FIFO1_NEW_MESSAGE,0);
    	 
    	 #endif
    	 
      /* USER CODE END FDCAN2_Init 2 */
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133

    接着看FDCAN3,加上扩展帧过滤器

    在这里插入图片描述
    下面是FDCAN3加上硬件过滤器的代码:

    void MX_FDCAN3_Init(void)
    {
    
      /* USER CODE BEGIN FDCAN3_Init 0 */
    	FDCAN_FilterTypeDef FDCAN3_RXFilter;
      /* USER CODE END FDCAN3_Init 0 */
    
      /* USER CODE BEGIN FDCAN3_Init 1 */
    
      /* USER CODE END FDCAN3_Init 1 */
      hfdcan3.Instance = FDCAN3;
      hfdcan3.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
      hfdcan3.Init.Mode = FDCAN_MODE_NORMAL;
      hfdcan3.Init.AutoRetransmission = DISABLE;
      hfdcan3.Init.TransmitPause = DISABLE;
      hfdcan3.Init.ProtocolException = DISABLE;
      hfdcan3.Init.NominalPrescaler = 5;
      hfdcan3.Init.NominalSyncJumpWidth = 8;
      hfdcan3.Init.NominalTimeSeg1 = 31;
      hfdcan3.Init.NominalTimeSeg2 = 8;
      hfdcan3.Init.DataPrescaler = 1;
      hfdcan3.Init.DataSyncJumpWidth = 1;
      hfdcan3.Init.DataTimeSeg1 = 15;
      hfdcan3.Init.DataTimeSeg2 = 4;
      hfdcan3.Init.MessageRAMOffset = 0x800;
      hfdcan3.Init.StdFiltersNbr = 1;
      hfdcan3.Init.ExtFiltersNbr = 30;
      hfdcan3.Init.RxFifo0ElmtsNbr = 0;
      hfdcan3.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
      hfdcan3.Init.RxFifo1ElmtsNbr = 32;
      hfdcan3.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
      hfdcan3.Init.RxBuffersNbr = 0;
      hfdcan3.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
      hfdcan3.Init.TxEventsNbr = 0;
      hfdcan3.Init.TxBuffersNbr = 0;
      hfdcan3.Init.TxFifoQueueElmtsNbr = 6;
      hfdcan3.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
      hfdcan3.Init.TxElmtSize = FDCAN_DATA_BYTES_8;
      if (HAL_FDCAN_Init(&hfdcan3) != HAL_OK)
      {
        Error_Handler();
      }
      /* USER CODE BEGIN FDCAN3_Init 2 */
    	
    
    		#if 0
    		//不过滤ID,都接收
    		//配置RX滤波器   
        FDCAN3_RXFilter.IdType=FDCAN_EXTENDED_ID;                       //扩展ID 接收不到标准CAN数据
        FDCAN3_RXFilter.FilterIndex=0;                                  //滤波器索引                   
        FDCAN3_RXFilter.FilterType=FDCAN_FILTER_MASK;                   //滤波器类型
        FDCAN3_RXFilter.FilterConfig=FDCAN_FILTER_TO_RXFIFO1;           //过滤器0关联到FIFO1  
        FDCAN3_RXFilter.FilterID1=0x0000;                               //32位ID 设置滤波器的第一个标识符为 0x0000,表示不过滤任何 ID。
        FDCAN3_RXFilter.FilterID2=0x0000;                               //如果FDCAN配置为传统模式的话,这里是32位掩码 表示不过滤任何 ID。
    	
    		HAL_FDCAN_ConfigFilter(&hfdcan3,&FDCAN3_RXFilter);	//调用 HAL 库函数配置 FDCAN3 的滤波器。
    	
        HAL_FDCAN_Start(&hfdcan3);                               //开启FDCAN
    	 
    	 
    	 /* HAL_FDCAN_ConfigGlobalFilter()
        * 参数2:设置标准帧ID,接收的报文ID没有匹配上滤波器时,选择拒绝接收(没有匹配上时,可以选择放入FIFO0或者FIFO1)。
        * 参数3:设置拓展帧ID,接收的报文ID没有匹配上滤波器时,选择拒绝接收。
        * 参数4:设置是否拒绝远程标准帧,ENABLE代表拒绝接收。
        * 参数5:设置是否拒绝远程拓展帧,ENABLE代表拒绝接收。
        */
       HAL_FDCAN_ConfigGlobalFilter(&hfdcan3,FDCAN_REJECT,FDCAN_REJECT,ENABLE,ENABLE); /* 设置FDCAN1滤波器1全局配置  */
    	 HAL_FDCAN_ActivateNotification(&hfdcan3,FDCAN_IT_RX_FIFO1_NEW_MESSAGE,0);	//激活 FDCAN3 的 RX FIFO 1 新消息中断通知。
    	 
    	 
    	 #else
    
    	 //只接收0x18F00503、0x18FEE6EE、0x18FFCCF2、0x18FFEEF2、0x1CFFEAF2这五个CAN ID的数据
    	 // 配置 RX 滤波器
    	FDCAN3_RXFilter.IdType = FDCAN_EXTENDED_ID;                       // 扩展 ID 接收不到标准 CAN 数据
    	FDCAN3_RXFilter.FilterIndex = 0;                                  // 滤波器索引                   
    	FDCAN3_RXFilter.FilterType = FDCAN_FILTER_RANGE;                  // 滤波器类型改为范围模式
    	FDCAN3_RXFilter.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;           // 过滤器 0 关联到 FIFO1
    	FDCAN3_RXFilter.FilterID1 = 0x18F00503;                           // 要过滤的 ID
    	FDCAN3_RXFilter.FilterID2 = 0x18F00503;                           // 只接收指定的 ID,其他 ID 将被过滤
    
    	HAL_FDCAN_ConfigFilter(&hfdcan3, &FDCAN3_RXFilter);
    	
    	FDCAN3_RXFilter.FilterIndex = 1;                                  // 滤波器索引                   
    	FDCAN3_RXFilter.FilterID1 = 0x18FEE6EE;                  // 要过滤的 ID1
    	FDCAN3_RXFilter.FilterID2 = 0x18FEE6EE;                  // 要过滤的 ID2
    	HAL_FDCAN_ConfigFilter(&hfdcan3, &FDCAN3_RXFilter);
    	
    	
    	FDCAN3_RXFilter.FilterIndex = 2;                                  // 滤波器索引                   
    	FDCAN3_RXFilter.FilterID1 = 0x18FFCCF2;                  // 要过滤的 ID1
    	FDCAN3_RXFilter.FilterID2 = 0x18FFCCF2;                  // 要过滤的 ID2
    	HAL_FDCAN_ConfigFilter(&hfdcan3, &FDCAN3_RXFilter);
    
    	FDCAN3_RXFilter.FilterIndex = 3;                                  // 滤波器索引                   
    	FDCAN3_RXFilter.FilterID1 = 0x18FFEEF2;                  // 要过滤的 ID1
    	FDCAN3_RXFilter.FilterID2 = 0x18FFEEF2;                  // 要过滤的 ID2
    	HAL_FDCAN_ConfigFilter(&hfdcan3, &FDCAN3_RXFilter);
    
    	FDCAN3_RXFilter.FilterIndex = 4;                                  // 滤波器索引                   
    	FDCAN3_RXFilter.FilterID1 = 0x1CFFEAF2;                  // 要过滤的 ID1
    	FDCAN3_RXFilter.FilterID2 = 0x1CFFEAF2;                  // 要过滤的 ID2
    	HAL_FDCAN_ConfigFilter(&hfdcan3, &FDCAN3_RXFilter);
    	
    
    	HAL_FDCAN_Start(&hfdcan3);                               // 开启 FDCAN
    
    	HAL_FDCAN_ConfigGlobalFilter(&hfdcan3, FDCAN_REJECT, FDCAN_REJECT, ENABLE, ENABLE); /* 设置 FDCAN1 滤波器 1 全局配置 */
    	HAL_FDCAN_ActivateNotification(&hfdcan3, FDCAN_IT_RX_FIFO1_NEW_MESSAGE, 0);
    	 
    	#endif
    	 
    	 
    	 
      /* USER CODE END FDCAN3_Init 2 */
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
  • 相关阅读:
    DASCTF2022.07赋能赛 web 复现
    Java项目论文+PPT+源码等]S2SH+mysql的报刊订阅系统
    cesium 雷达扫描 (波纹线性雷达扫描效果)
    ansible command 模块
    BERT-of-Theseus
    并发与并行,同步和异步,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang并发编程之GoroutineEP13
    【C语言刷LeetCode】1962. 最大宽度坡(M)
    do while循环、嵌套循环、数组简介
    【多线程入门】&线程的三种创建方式&线程的生命周期&并行和并发的区别
    全流程TOUGH系列软件应用
  • 原文地址:https://blog.csdn.net/weixin_37787043/article/details/134013710