荣陶陶 发表于 2025-5-13 12:11

GD32 CAN过滤器配置

can_filter.filter_number = 0;
    can_filter.filter_mode = CAN_FILTERMODE_MASK;
    can_filter.filter_bits = CAN_FILTERBITS_32BIT;
    can_filter.filter_list_high = ((0X0757A800<<3)&0XFFFF0000)>>16;
    can_filter.filter_list_low = (uint16_t)((0X0757A800<<3)|(4)&0XFFFF);
    can_filter.filter_mask_high = 0XFFFF;
    can_filter.filter_mask_low = (uint16_t)(0XFF00<<3);
    can_filter.filter_fifo_number = CAN_FIFO0;
    can_filter.filter_enable = ENABLE;
    can_filter_init(&can_filter);

    can_filter.filter_number = 1;
    can_filter.filter_mode = CAN_FILTERMODE_LIST;
    can_filter.filter_bits = CAN_FILTERBITS_32BIT;
    can_filter.filter_list_high = ((0X0757A900<<3)&0XFFFF0000)>>16;
    can_filter.filter_list_low = (uint16_t)((0X0757A900<<3)|(4)&0XFFFF);
    can_filter.filter_mask_high = 0;
    can_filter.filter_mask_low = 0;
    can_filter.filter_fifo_number = CAN_FIFO0;
    can_filter.filter_enable = ENABLE;
    can_filter_init(&can_filter);
AI写代码
c
运行



对于过滤器0,设置掩码模式,配置为扩展帧ID,接收范围0X0757A800到0X0757A8FF,低8位可以为任意值,由filter_mask_high 和filter_mask_low决定 。对于过滤器1,设置列表模式,配置为扩展帧ID,只能接收0X0757A900这个ID,filter_mask_high 和filter_mask_low 设置无效。



在图片的低3位,FF:1表示扩展帧,0表示标准帧。FT:1表示遥控帧,0表示数据帧。所以过滤数据ID值和掩码值需要左移3位,然后在filter_list_low 加4,表示扩展帧,按道理filter_mask_low 也要加4,但是我没加,也可以达到目的。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_45449075/article/details/147889796

磨砂 发表于 2025-6-3 14:43

GD32 CAN过滤器是GD32微控制器中用于CAN总线通信的重要功能模块,主要用于筛选接收的CAN报文,确保只有符合预设条件的数据帧被处理

晓伍 发表于 2025-6-3 17:10

can过滤器过滤不需要的CAN报文,减少CPU负载,提高通信效率

八层楼 发表于 2025-6-3 19:34

非CL系列有14个过滤器 CL系列有28个过滤器

观海 发表于 2025-6-3 21:52

每个过滤器单元包含2个寄存器,可配置为32位或16位模式

guanjiaer 发表于 2025-6-4 07:58

通过CAN_FxDATA0设置预设标识符,CAN_FxDATA1设置掩码值,指定哪些位需要匹配

heimaojingzhang 发表于 2025-6-4 10:30

can_parameter_struct can_init_param;
can_init_param.working_mode = CAN_NORMAL_MODE; // 正常模式
can_init_param.prescaler = 12;                // 分频系数
can_init(CAN0, &can_init_param);             // 初始化CAN0


keaibukelian 发表于 2025-6-4 12:53

can_filter_parameter_struct can_filter_param;
can_filter_param.filter_number = 0;         // 过滤器编号(0~27)
can_filter_param.filter_mode = CAN_FILTERMODE_MASK; // 掩码模式
can_filter_param.filter_bits = CAN_FILTER_BITS_32BIT; // 32位模式
can_filter_param.filter_list_high = 0x000;   // 预设ID高16位(如标准帧)
can_filter_param.filter_list_low = 0x000;    // 预设ID低16位
can_filter_param.filter_mask_high = 0x7FF;   // 掩码高16位(匹配ID前11位)
can_filter_param.filter_mask_low = 0xFFFF;   // 掩码低16位(全匹配)
can_filter_init(&can_filter_param);          // 应用过滤器配置


paotangsan 发表于 2025-6-4 15:28

结合发送邮箱的优先级功能,实现关键数据的优先传输

renzheshengui 发表于 2025-6-4 17:55

GD32 CAN过滤器通过灵活的掩码和列表模式,支持多级筛选,适用于复杂CAN网络环境

wowu 发表于 2025-6-4 20:18

我们需要注意过滤器编号与硬件资源的对应关系
页: [1]
查看完整版本: GD32 CAN过滤器配置