STM32的ID过滤器有两种关于屏蔽位的设置,1个32位过滤器模式和2个16位过滤器模式:
STM32的HAL库中关于这个ID设置在结构体 CAN_FilterTypeDef 中定义。但这个定义设计的并不好:
1个32位过滤器模式下:
FilterIdHigh 是指ID的高16位;FilterIdLow是指ID的低16位。这两个变量组成一个32位ID。
FilterMaskIdHigh和 FilterMaskIdLow是掩码的高低16位。这两个变量组成32位的ID掩码。
2个16位过滤器模式下:
FilterIdHigh 是指第一个ID;FilterIdLow是指第二个ID;
FilterMaskIdHigh是指第一个ID的掩码;FilterMaskIdLow是指第二个ID的掩码。
而CANOPEN协议有整体控制命令和单独控制命令。这两种命令需要有2种ID的过滤方式,所以在采用CANOPEN协议时,CAN要配置成2个16位过滤器模式:
如果要修改一下这个结构体定义,建议改成共用体 union 类型,在union中将变量定义成16位的数据类型,使得定义更加清晰。