×
单片机 > 单片机程序设计 > 详情

stm32 Can通讯过滤器寄存器设置

发布时间:2020-06-02 发布时间:
|

起因:在使用stm32单片机can通讯时,参考手册的介绍与寄存器封装有差别,不好理解怎么去设置寄存器。在参考一些代码时,对怎么去设置过滤器还是难以理解。


解决: 


在寄存器封装库中,我们发现CAN过滤器设置寄存器封装有CAN1->sFilterRegister[ x ].FR1 和 CAN1->sFilterRegister[ x ].FR2 两个寄存器,其封装如下:


typedef struct

{

  __IO uint32_t FR1;

  __IO uint32_t FR2;

} CAN_FilterRegister_TypeDef;

我所碰到的问题便是这两个寄存器的如何设置问题。

首先我们得理解过滤器的格式,如下: 

我们所要设置的寄存器CAN1->sFilterRegister[ x ].FR1便是如上图所说的标识符屏蔽模式中的 ID,


而CAN1->sFilterRegister[ x ].FR2, 就是屏蔽寄存器; 在标识符列表模式中,两者都是ID。


我们按上面的格式去设置寄存器: 标准ID / 拓展ID + IDE + RTR + x 。


已知 IDE = 0 代表标准ID,  IDE =1 代表拓展ID;  RTR = 0代表数据帧,RTR = 1代表远程帧; 


那么,我们给个例子:



标识符列表 ID = 0x09  拓展帧 :


 CAN1->sFilterRegister[0].FR1=0x09<<3|0x04;     //id=0x01,拓展帧数据

 CAN1->sFilterRegister[0].FR2=0x09<<3|0x04;  //标识符列表,相同

过滤寄存器如此设置就能过滤拓展帧的id为0x09的数据了

         标识符屏蔽  ID = 0x11  标准帧 :


CAN1->sFilterRegister[1].FR1=0x11<<21|0x04;  //标准id, 0x04为屏蔽模式,

CAN1->sFilterRegister[1].FR2=0xffc00004;    //id全部屏蔽,IDE屏蔽,RTR屏蔽

过滤器如此设置就能过滤标准帧id为0x11的数据。

到这里基本上写完了,这些都是通过验证得到的。如果有问题的欢迎交流。


关键字:stm32  Can通讯  过滤器  寄存器设置 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机中断源的扩展方法