深入了解STM32 CAN过滤器设置细节
STM32 CAN过滤器细节
简介
四种模式
模式 | 说明 |
---|---|
32位掩码模式 | CAN_FxR1存储ID, CAN_FxR2存储哪个位必须要与CAN_FxR1中的ID一致 , 2个寄存器表示1组掩码。 |
32位标识符模式 | CAN_FxR1和CAN_FxR2各存储1个ID, 2个寄存器表示2个筛选的ID |
16位掩码模式 | CAN_FxR1高16位存储ID, 低16位存储哪个位必须要与高16位的ID一致; CAN_FxR2高16位存储ID, 低16位存储哪个位必须要与高16位的ID一致 2个寄存器表示2组掩码。 |
16位标识符模式 | CAN_FxR1和CAN_FxR2各存储2个ID, 2个寄存器表示4个筛选的ID |
过滤器结构体 CAN_FilterInitTypeDef
代码示例
32位掩码模式
void CAN_Filter_Config(void) {
// 定义一个CAN_FilterInitTypeDef结构体变量,用于配置CAN过滤器
CAN_FilterInitTypeDef CAN_Filter_InitStruct;
// 设置过滤器编号,这里使用编号14。CAN控制器可能支持多个过滤器,编号用于区分它们。
CAN_Filter_InitStruct.CAN_FilterNumber = 14;
// 设置过滤器模式为掩码模式。在掩码模式下,接收的消息ID会与掩码进行逻辑与操作,结果与ID比较来决定是否接收消息。
CAN_Filter_InitStruct.CAN_FilterMode = CAN_FilterMode_IdMask;
// 设置过滤器的规模为32位。这意味着过滤器将使用32位的ID和掩码进行匹配。
CAN_Filter_InitStruct.CAN_FilterScale = CAN_FilterScale_32bit;
// 设置过滤器的ID高位部分。因为ID是32位,这里只需要设置高16位。ID被左移5位以匹配32位寄存器的格式。
// 这里以0x581为例,作为需要接收的ID之一。
CAN_Filter_InitStruct.CAN_FilterIdHigh = (0x581 << 5) & 0xFFFF;
// 设置过滤器的ID低位部分。在32位模式下,通常将其设置为0。
CAN_Filter_InitStruct.CAN_FilterIdLow = 0x0000;
// 设置掩码的高位部分。掩码确定了哪些位需要匹配。这里0x7FC左移5位,忽略ID的最后两位,允许0x581和0x582通过。
CAN_Filter_InitStruct.CAN_FilterMaskIdHigh = (0x7FC << 5) & 0xFFFF;
// 设置掩码的低位部分。在32位模式下,通常将其设置为0。
CAN_Filter_InitStruct.CAN_FilterMaskIdLow = 0x0000;
// 指定匹配到的消息应该被存储在哪个FIFO中。CAN控制器通常有多个接收FIFO。
CAN_Filter_InitStruct.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;
// 启用过滤器。在配置完所有参数后,需要将过滤器激活,以开始对传入的消息进行过滤。
CAN_Filter_InitStruct.CAN_FilterActivation = ENABLE;
// 使用前面设置的参数初始化CAN过滤器。这一步是将上面的配置应用到硬件上。
CAN_FilterInit(&CAN_Filter_InitStruct);
}
32位标识符模式
void CAN_Filter_Config(void) {
// 定义一个CAN_FilterInitTypeDef结构体变量,用于配置CAN过滤器
CAN_FilterInitTypeDef CAN_Filter_InitStruct;
// 设置过滤器编号,这里使用编号14。CAN控制器可能支持多个过滤器,编号用于区分它们。
CAN_Filter_InitStruct.CAN_FilterNumber = 14;
// 设置过滤器模式为标识符列表模式。在这种模式下,可以直接指定要接收的消息ID。
CAN_Filter_InitStruct.CAN_FilterMode = CAN_FilterMode_IdList;
// 设置过滤器的规模为32位。这意味着过滤器将直接比较32位的ID。
CAN_Filter_InitStruct.CAN_FilterScale = CAN_FilterScale_32bit;
// 设置第一个ID。在32位标识符模式下,将0x581左移5位后赋值给CAN_FilterIdHigh。
// 左移5位是因为在硬件中,标识符通常需要对齐到特定的位置。
CAN_Filter_InitStruct.CAN_FilterIdHigh = (0x581 << 5) & 0xFFFF;
// 在32位模式下,ID的低16位不用设置,所以赋值为0。
CAN_Filter_InitStruct.CAN_FilterIdLow = 0x0000;
// 设置第二个ID。在32位标识符模式下,将0x582左移5位后赋值给CAN_FilterMaskIdHigh。
// 尽管变量名包含“Mask”,在标识符列表模式下,这里实际上用于存放第二个ID。
CAN_Filter_InitStruct.CAN_FilterMaskIdHigh = (0x582 << 5) & 0xFFFF;
// 在32位模式下,第二个ID的低16位同样不用设置,所以赋值为0。
CAN_Filter_InitStruct.CAN_FilterMaskIdLow = 0x0000;
// 指定匹配到的消息应该被存储在哪个FIFO中。CAN控制器通常有多个接收FIFO。
CAN_Filter_InitStruct.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;
// 启用过滤器。在配置完所有参数后,需要将过滤器激活,以开始对传入的消息进行过滤。
CAN_Filter_InitStruct.CAN_FilterActivation = ENABLE;
// 使用前面设置的参数初始化CAN过滤器。这一步是将上面的配置应用到硬件上。
CAN_FilterInit(&CAN_Filter_InitStruct);
}
AN_FilterActivation = ENABLE;
// 使用前面设置的参数初始化CAN过滤器。这一步是将上面的配置应用到硬件上。
CAN_FilterInit(&CAN_Filter_InitStruct);
}
作者:YRr YRr