stm32 Can通讯过滤器寄存器设置(实验验证)

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

解决:

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

typedef struct
{
  __IO uint32_t FR1;
  __IO uint32_t FR2;
} CAN_FilterRegister_TypeDef;

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

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

stm32 Can通讯过滤器寄存器设置(实验验证)_第1张图片

我们所要设置的寄存器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,stm32,通讯,单片机,can,过滤器)