ST意法半导体
直播中

石正厚

7年用户 1106经验值
私信 关注
[问答]

如何使用ST HAL配置滤波器组呢?

有没有在像 STM32F777 这样的双 CAN MCU 中使用 CAN1 和 CAN2 的例子,特别是如何使用 ST HAL(立方体)配置滤波器组??
据我了解,过滤器组是共享的。FIFO0和FIFO1也是共享的吗?
为什么会有 CAN2_FMR 寄存器?CAN1_FMR 的 CAN2SB 用于指定用于 CAN1 的滤波器数量。其余 27 个过滤器分配给 CAN2。那么 CAN1_FMR 的 CAN2SB 有什么用?
如果我执行我的软件,CAN1_FMR.FINIT 的 FINIT 变为 0(过滤器激活),但 CAN2_FMR.FINIT 保持在 1(过滤器的初始化模式)。
这是我的代码:
  //##-2- 配置 CAN 过滤器 ####################################### ####
  filterCfg.FilterFIFOAssignment = CAN_RX_FIFO0;//CAN2 的 CAN_RX_FIFO1 ???
  如果(hcan->实例== CAN1){
   filterCfg.FilterBank = 0;
  }
  否则{ // CAN2
   filterCfg.FilterBank = 14;  
  }
// CAN_FILTER_MODE_LIST
   如果(initCfg.idSizeType == CAN_EXT_ID){
     tmp = (initCfg.SystemCanId & 0x1FFFFFFF) << 3;
     // Shift um 3, denn die oberen Bits [31:3] werden verwendet für Vgl
     // mit der Ext.ID[0:29],
     // siehe 参考手册:图 500. Filter bank scale configuration   
   }
   else{ // CAN_STD_ID     
     tmp = (initCfg.SystemCanId & 0x000003FF) << 21;
     // 链接 Shift um 21, denn die oberen Bits [31:21] werden verwendet
     // für den Vgl mit der Std.ID[0:11]
     // siehe 参考手册:图 500. Filter bank scale configuration      
   }
   tmp = (initCfg.SystemCanId & 0x1FFFFFFF) << 3;
   filterCfg.FilterIdHigh = (uint16_t)(tmp >> 16);
   filterCfg.FilterIdLow = (uint16_t) tmp;
   filterCfg.FilterMaskIdHigh = 0x0000;//(uint16_t)(tmp >> 16);
   filterCfg.FilterMaskIdLow = 0x0000;//(uint16_t) tmp;
   filterCfg.FilterMode = CAN_FILTERMODE_IDLIST;  

  filterCfg.FilterScale = CAN_FILTERSCALE_32BIT;
  filterCfg.FilterActivation = ENABLE;
  filterCfg.SlaveStartFilterBank = 14;

  如果 (HAL_CAN_ConfigFilter(hcan, &filterCfg) != HAL_OK){
   返回 CAN_ERROR_INIT;// 过滤器配置错误
  }



回帖(1)

李可熠

2022-12-23 11:30:11
我现在解决了这些问题。通过调试 ST HAL 代码,我了解到,在 CAN 双模式下,CAN2 是从站,CAN2 的过滤器设置也在 CAN1 的过滤器寄存器中找到。
CAN1_FMR.FINIT 确实适用于 CAN1 和 CAN2,而 CAN2_FMR.FINIT 没有相关性。这就是为什么 CAN2_FMR.FINIT 保持在 1(过滤器的初始化模式)。
在使用 CAN_FILTER_MODE_LIST 时,我也忘了注意 IDE-Bit。这就是我在使用过滤模式列表时没有收到传入消息的原因。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分