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