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