stm32与GD32 CAN的差异

使用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电子技术开发论坛

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值