福州php做网站,太原做网站的,传统文化网站设计,东莞房产信息网官网STM32 CAN过滤器细节
简介
每组筛选器包含2个32位的寄存器#xff0c;分别为CAN_FxR1和CAN_FxR2#xff0c;它们用来存储要筛选的ID或掩码 四种模式
模式说明32位掩码模式CAN_FxR1存储ID#xff0c; CAN_FxR2存储哪个位必须要与CAN_FxR1中的ID一致 #xff0c; 2个寄存器…STM32 CAN过滤器细节
简介
每组筛选器包含2个32位的寄存器分别为CAN_FxR1和CAN_FxR2它们用来存储要筛选的ID或掩码 四种模式
模式说明32位掩码模式CAN_FxR1存储ID CAN_FxR2存储哪个位必须要与CAN_FxR1中的ID一致 2个寄存器表示1组掩码。32位标识符模式CAN_FxR1和CAN_FxR2各存储1个ID 2个寄存器表示2个筛选的ID16位掩码模式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 CAN_FilterIdHigh CAN_FilterIdHigh成员用于存储要筛选的ID若筛选器工作在32位模式它存储的是所筛选ID的高16位若筛选器工作在16位模式它存储的就是一个完整的要筛选的ID。 CAN_FilterIdLow 类似地 CAN_FilterIdLow成员也是用于存储要筛选的ID若筛选器工作在32位模式它存储的是所筛选ID的低16位若筛选器工作在16位模式它存储的就是一个完整的要筛选的ID。 CAN_FilterMaskIdHigh CAN_FilterMaskIdHigh存储的内容分两种情况当筛选器工作在标识符列表模式时它的功能与CAN_FilterIdHigh相同都是存储要筛选的ID而当筛选器工作在掩码模式时它存储的是CAN_FilterIdHigh成员对应的掩码与CAN_FilterIdLow组成一组筛选器。 CAN_FilterMaskIdLow 类似地 CAN_FilterMaskIdLow存储的内容也分两种情况当筛选器工作在标识符列表模式时它的功能与CAN_FilterIdLow相同都是存储要筛选的ID而当筛选器工作在掩码模式时它存储的是CAN_FilterIdLow成员对应的掩码与CAN_FilterIdLow组成一组筛选器。 CAN_FilterFIFOAssignment 本成员用于设置当报文通过筛选器的匹配后该报文会被存储到哪一个接收FIFO它的可选值为FIFO0或FIFO1(宏CAN_Filter_FIFO0/1)。 CAN_FilterNumber 本成员用于设置筛选器的编号即本过滤器结构体配置的是哪一组筛选器 CAN一共有28个筛选器所以它的可输入参数范围为0-27。 CAN_FilterMode 本成员用于设置筛选器的工作模式可以设置为列表模式(宏CAN_FilterMode_IdList)及掩码模式(宏CAN_FilterMode_IdMask)。 CAN_FilterScale 本成员用于设置筛选器的尺度可以设置为32位长(宏CAN_FilterScale_32bit)及16位长(宏CAN_FilterScale_16bit)。 CAN_FilterActivation 本成员用于设置是否激活这个筛选器(宏ENABLE/DISABLE)。
代码示例
32位掩码模式
0x581 0101 1000 0001 0x582 0101 1000 0010 也就是忽略倒数两位可同时接收0x581和0x582
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位标识符模式
同时接收0x581和0x582
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);}