STM32 CAN滤波器配置总结

本文介绍了STM32处理器中CAN滤波器的配置方法。通过合理的配置,可以有效减少无效数据的处理,提高CPU使用效率。文章详细解释了标准帧与扩展帧的区别,并给出具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很早就开始STM32处理器的研究工作了,期间开发了几款设备,使用的外设基本上是SPIUARTIICGPIO,应用还是比较方便灵活的。

后来由于工作需要使用CAN的外设,也就通过ST提供的接口进行测试,比较顺利,CAN收发正确了。编写代码是发现通过配置验收滤波器可以大幅降低系统的负担,提高CPU的使用效率,所以就花时间研究这部分的使用了。

开始时查找资料,进行复制粘贴,不断的测试,一直不好用,不知为何。

进一步上网搜索后发现,网上的说明比较片面,只是说明了CAN的扩展帧铝滤波的实例,我做的是标准帧的测试,两种配置是不一样的,按网上的一片文章验证,可用的,目前只测试标准帧,扩展帧还没测试,按找理解的知识来看,那部分是应该可以通过的,暂时就不测试了。

//can总线 配置滤波器,属于硬件屏蔽,只允许指定的ID可以通过滤波进入到接收存储区
//与软件滤波相比,可以提高CPU的使用效率,
//入口参数:
//CAN_FilterNumber: 滤波器索引,可以设置多个滤波ID 取值范围0-12
//CAN_FilterId: 滤波ID 
//CAN_ID_Std_Ext: 帧类别(CAN_ID_STD:11bit标准帧,CAN_ID_EXT:29bit扩展帧)
//无返回参数
void CAN_Config_FilterInit(  uint8_t CAN_FilterNumber,u32 CAN_FilterId,u32 CAN_ID_Std_Ext)   //can总线 配置
{
 CAN_FilterInitTypeDef CAN_FilterInitStructure;  //定义can过滤器 结构
 u32 tempid;
 
 tempid = CAN_FilterId;
 tempid &= 0x1FFFFFFF;
 
   if(CAN_ID_Std_Ext == CAN_ID_STD)
 {
  tempid <<= 5;
//  tempid |= CAN_ID_STD;//CAN_ID_EXT;   //扩展ID
//  tempid |= CAN_RTR_DATA; 
     CAN_FilterInitStructure.CAN_FilterNumber = CAN_FilterNumber;       //指定了待初始化的过滤器,它的范围是 1到 13。
     CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;     //指定了过滤器将被初始化到的模式 CAN_FilterMode_IdMask标识符屏蔽位模式
    
  CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;
 
  CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;    //给出了过滤器位宽
    
  CAN_FilterInitStructure.CAN_FilterIdHigh = tempid;
  CAN_FilterInitStructure.CAN_FilterIdLow = 0;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;  
     CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFF8;            //RTR 可以为数据帧也可以远帧
     CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;       //
     CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;      //使能或者失能过滤器
  CAN_FilterInit ( &CAN_FilterInitStructure );        //根据 CAN_FilterInitStruct中指定的参数初始化外设 CAN的寄存器
 }
 else
 {
  tempid <<= 3;
  tempid |= CAN_ID_EXT;   //扩展ID
//  tempid |= CAN_RTR_DATA; 
     CAN_FilterInitStructure.CAN_FilterNumber = CAN_FilterNumber;       //指定了待初始化的过滤器,它的范围是 1到 13。
     CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;     //指定了过滤器将被初始化到的模式 CAN_FilterMode_IdMask标识符屏蔽位模式
    
  CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;
 
  CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;    //给出了过滤器位宽
    
  CAN_FilterInitStructure.CAN_FilterIdHigh = (tempid>>16)&0xFFFF;
  CAN_FilterInitStructure.CAN_FilterIdLow = tempid&0xFFFF;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;  
     CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFF8;            //RTR 可以为数据帧也可以远帧
     CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;       //
     CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;      //使能或者失能过滤器
  CAN_FilterInit ( &CAN_FilterInitStructure );        //根据 CAN_FilterInitStruct中指定的参数初始化外设 CAN的寄存器
 }
}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13771794/viewspace-692373/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/13771794/viewspace-692373/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值