ITPub博客

首页 > Linux操作系统 > Linux操作系统 > STM32 CAN滤波器配置总结

STM32 CAN滤波器配置总结

原创 Linux操作系统 作者:cifra_guokun 时间:2011-04-13 08:51:51 0 删除 编辑

很早就开始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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-04-07

  • 博文量
    92
  • 访问量
    305437