本帖最后由 Tong459 于 2022-5-9 11:22 编辑
#申请原创#
引入 F407拥有两个CAN,对于CAN的过滤器每隔时间久了我就淡忘了,于是就想写一篇关于CAN过滤器的内容,就算没人看也能自己看。 过滤器原理 首先介绍一下过滤器的原理。过滤器分为掩码(Mask)和ID两个部分。掩码可以理解为筛子,ID是基于“筛子”的第二层过滤。 拿身份号打个比方,我们的身份号的前6位是所属地区,那如果想对它做筛选,你会怎么做?那第一步肯定是提取出前6位,那我们可以制作个“掩码”,1就是想提取的,0就是不提取的,那就有类似于:111111xxxxxxxxxxxx这样的掩码结构,这样我们就能提取前6位了。第二步就是提取特定地区的ID,比如浙江温州江南皮革厂前6位ID为886886(瞎写的别较真),那ID就设为886886,这样就是:提取前6位的值,它们必须满足886886,其他位不管。 再打个比方,某商场进场需查码,掩码设为健康码,其余的收款码、微信码、特码我都不看,我就看健康码,那单看码还不行,还得是绿码,其他颜色一概不通过,这就是ID。 在F407上的CAN过滤器组和上述原理差不多,分别讲解下: ①掩码(Mask) 假设掩码为16位,值为0x0001,那它表示的是筛出bit0,意味着过滤器只关注bit0;若值为0x0000,则意味着所有ID都可通过,即全通。 ②ID ID所占位数同掩码。前面假设了掩码为0x0001,那当ID为0x1230时,表示能通过的ID需要满足bit0为0,其他不管;当ID为0x1231,表示能通过的ID需要满足bit0为1,其他不管。当有掩码的时候,ID需要结合掩码使用,当无掩码时,可当做掩码值为全F,即关注ID的所有位。 APM32F407上的CAN 一组过滤器为两个32bit寄存器。掩码可以设置有或没有、过滤位宽可设置16bit或32bit,那就有4种结合方式。在极海F407的SDK中调用的函数是CAN_ConfigFilter,我们对其参数配置就可以调整掩码和ID了。 需要注意的是,掩码和ID组个过滤的功能正常用就行,但是函数传参进去的整个掩码或ID包含的信息还有:拓展标识符、远程帧等信息。因此需要移位运算。下图是16bit位宽下的结构(APM32F4用户手册截):
下图是32bit位宽下的结构(APM32F4用户手册截):
最后提醒一下,F407拥有两个CAN,但是CAN2与CAN1共用一套过滤器组,CAN1的0~13过滤器组属于CAN1,CAN1的14~27过滤器组属于CAN2。 如果有地方讲错了或者需要补充的,请留言。
|