stm32与GD32 CAN的差异

在将使用ST的CUBEMX配置的STM32 CAN代码移植到GD32时,遇到CAN接收中断无法触发的问题。原因在于STM32的CAN1和CAN2过滤器共享资源,而GD32的CAN可能与此不同。通过修改CAN初始化函数中的`sFilterConfig.SlaveStartFilterBank`为14,解决了接收中断问题。此问题提示开发者注意不同MCU之间的硬件差异。
摘要由CSDN通过智能技术生成

使用ST的CUBEMX生成STM32工程,后下载到GD32中遇到如下问题:

在GD32中CAN可以发送,但无法进入接收中断,而在STM32中发送接收都正常。

CAN初始化代码如下:

void CAN_User_Init(CAN_HandleTypeDef* hcan)   //用户初始化函数
{
  CAN_FilterTypeDef  sFilterConfig;


  sFilterConfig.FilterBank = 0;                         //过滤器0
  sFilterConfig.FilterMode =  CAN_FILTERMODE_IDMASK;    //屏蔽位模式
  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;    //32位宽       
  sFilterConfig.FilterIdHigh =(((0x0100ffff)<<3)&0xffff0000)>>16;    //对扩展数据帧进行过滤
  sFilterConfig.FilterIdLow  = (((0x0100ffff)<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xffff;
  sFilterConfig.FilterMaskIdHigh =( (0x00000000<<3)&0xffff0000)>>16; //高位两个字节完全匹配
  sFilterConfig.FilterMaskIdLow  =(0x00000000<<3)&0xffff;
  sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;    //过滤器0关联到FIFO0
  sFilterConfig.FilterActivation = ENABLE;      //激活过滤器0
  sFilterConfig.SlaveStartFilterBank  = 0;
 
 
  HAL_CAN_ConfigFilter(hcan, &sFilterConfig);//滤波器初始化
  HAL_CAN_Start(hcan);  //开启CAN
 
  HAL_CAN_ActivateNotification(hcan,CAN_IT_RX_FIFO0_MSG_PENDING);//开启挂起中段允许

}

解决办法:

sFilterConfig.SlaveStartFilterBank  = 0;改成sFilterConfig.SlaveStartFilterBank  = 14;

原因是STM32的CAN1和CAN2过滤器公用28个过滤器,SlaveStartFilterBank不能设置为CAN1用的那几个过滤器。GD32手册却未提及两个CAN公用过滤器的问题。GD32的CAN是GD自己开发的,可能这里和ST不一样。

参考链接:关于HAL库的CAN的设置SlaveStartFilterBank - STM32/STM8单片机论坛 - ST MCU意法半导体官方技术支持论坛 - 21ic电子技术开发论坛

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值