You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32H723VGT6的FDCAN滤波器无法生效问题求助

问题描述

STM32H723VGT6控制器上的FDCAN通信功能正常,但配置HAL CAN滤波器后无过滤效果,所有接收消息都会触发RxFIFO0回调函数。

已尝试的操作

滤波器配置代码

// Can初始化(hfcan指向hfdcan1)
{
    FDCAN_FilterConfig->IdType = FDCAN_STANDARD_ID;
    FDCAN_FilterConfig->FilterType = FDCAN_FILTER_DUAL;
    FDCAN_FilterConfig->FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
    
    FDCAN_FilterConfig->FilterIndex = 0;
    FDCAN_FilterConfig->FilterID1 = 0x262;
    FDCAN_FilterConfig->FilterID2 = 0x362;
    if (HAL_FDCAN_ConfigFilter(hfdcan, FDCAN_FilterConfig) != HAL_OK) 
    {
        return Result_Fault;
    }
    
    if (HAL_FDCAN_Start(hfdcan) != HAL_OK) return Result_Init_Fault;
    if (HAL_FDCAN_ActivateNotification(hfdcan, can_interuppt_fifo, 0) != HAL_OK) return Result_Init_Fault;
}

回调函数

void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
    /* 避免未使用参数的编译警告 */
    UNUSED(RxFifo0ITs);
    
    // 接收消息时该回调可被成功触发,无异常。
}

FDCAN初始化代码(can.c)

void MX_FDCAN1_Init(void)
{

  /* USER CODE BEGIN FDCAN1_Init 0 */

  /* USER CODE END FDCAN1_Init 0 */

  /* USER CODE BEGIN FDCAN1_Init 1 */

  /* USER CODE END FDCAN1_Init 1 */
  hfdcan1.Instance = FDCAN1;
  hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
  hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
  hfdcan1.Init.AutoRetransmission = DISABLE;
  hfdcan1.Init.TransmitPause = DISABLE;
  hfdcan1.Init.ProtocolException = DISABLE;
  hfdcan1.Init.NominalPrescaler = 23;
  hfdcan1.Init.NominalSyncJumpWidth = 1;
  hfdcan1.Init.NominalTimeSeg1 = 8;
  hfdcan1.Init.NominalTimeSeg2 = 3;
  hfdcan1.Init.DataPrescaler = 1;
  hfdcan1.Init.DataSyncJumpWidth = 1;
  hfdcan1.Init.DataTimeSeg1 = 1;
  hfdcan1.Init.DataTimeSeg2 = 1;
  hfdcan1.Init.MessageRAMOffset = 0;
  hfdcan1.Init.StdFiltersNbr = 0;
  hfdcan1.Init.ExtFiltersNbr = 0;
  hfdcan1.Init.RxFifo0ElmtsNbr = 1;
  hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
  hfdcan1.Init.RxFifo1ElmtsNbr = 0;
  hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
  hfdcan1.Init.RxBuffersNbr = 0;
  hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
  hfdcan1.Init.TxEventsNbr = 0;
  hfdcan1.Init.TxBuffersNbr = 0;
  hfdcan1.Init.TxFifoQueueElmtsNbr = 10;
  hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
  hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_8;
  if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN FDCAN1_Init 2 */

  /* USER CODE END FDCAN1_Init 2 */
}
问题原因与解决方案

核心问题

你在MX_FDCAN1_Init中设置了hfdcan1.Init.StdFiltersNbr = 0,这个参数用于指定要分配给标准ID滤波器的Message RAM数量。当设为0时,即使后续调用HAL_FDCAN_ConfigFilter配置了滤波器,硬件也不会为标准ID滤波器预留空间,导致所有消息都绕过滤波器直接进入接收FIFO。

解决步骤

  1. 修改MX_FDCAN1_Init中的StdFiltersNbr值,至少设置为你需要使用的标准ID滤波器数量(这里你用了索引0的滤波器,所以设为1即可):
hfdcan1.Init.StdFiltersNbr = 1; // 从0改为1
  1. 确保滤波器配置代码在HAL_FDCAN_Init之后执行(你当前的代码顺序是正确的,无需调整)。
  2. 重新编译下载程序,测试过滤效果。

额外验证点

  • 确认can_interuppt_fifo参数包含FDCAN_IT_RX_FIFO0_NEW_MESSAGE,确保只在收到匹配的消息时触发回调。
  • 后续若需添加更多标准ID滤波器,只需同步增大StdFiltersNbr的值即可。

内容的提问来源于stack exchange,提问作者Archon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 08:32:15