STM32CAN滤波器、滤波屏蔽器设置详解
- 格式:doc
- 大小:123.00 KB
- 文档页数:16
STM32 CAN详细配置方法1、CAN 引脚不用初始就可以工作2、BOUNDRA TE设置查看文件夹相关文件(这个文档不错BAIDU :CAN总线通讯速率设定)3、CAN 要配转换器4、CAN_InitStatus_TypeDef status = CAN_InitStatus_Failed;5、6、 /* Filter Parameters */7、 CAN_FilterNumber_TypeDef CAN_FilterNumber; //CAN过滤器组1 2 3 4 5 //filter 0 1 2 3 4 58、 FunctionalState CAN_FilterActivation; //Filter激活//是否激活CAN Filter9、 CAN_FilterMode_TypeDef CAN_FilterMode; //过虑的方式屏蔽位模式与标识符模式//标识符过滤MODE select10、CAN_FilterScale_TypeDef CAN_FilterScale; //过滤器组位宽度和模式设置// CANfilter scale11、u8 CAN_FilterID1;12、u8 CAN_FilterID2;13、u8 CAN_FilterID3;14、u8 CAN_FilterID4;15、u8 CAN_FilterIDMask1; //如果选择标识、屏蔽,MASK为0不须比较16、u8 CAN_FilterIDMask2; //若全为标识则都要比较17、u8 CAN_FilterIDMask3;18、u8 CAN_FilterIDMask4;19、20、/* Init Parameters*/21、// MCR设置22、CAN_MasterCtrl_TypeDef CAN_MasterCtrl; // CAN Time Triggered Communication mode23、24、CAN_Mode_TypeDef CAN_Mode; //设置运行模式CANMode We can change Mode when here .25、CAN_SynJumpWidth_TypeDef CAN_SynJumpWidth; //同步跳跃宽度1 2 3 4 CAN26、CAN_BitSeg1_TypeDef CAN_BitSeg1; //补偿不同节点的正向漂移27、CAN_BitSeg2_TypeDef CAN_BitSeg2; //补偿不同节点的负向漂移28、//尽量大一点且要是SJW的整数倍29、//100K 为10 000ns30、CAN_ClockSource_TypeDef CAN_ClockSource; //选择类型,是外部还是内部31、u8 CAN_Prescaler; //分频32、33、/* CAN register init */34、CAN_DeInit(); //寄存器初始化35、36、/* CAN init */37、CAN_MasterCtrl=CAN_MasterCtrl_AllDisabled;38、//测试模式,使用静默环回模式39、// CAN Time Triggered Communication mode40、CAN_SynJumpWidth = CAN_SynJumpWidth_1TimeQuantum;41、CAN_BitSeg1 = CAN_BitSeg1_8TimeQuantum;42、CAN_BitSeg2 = CAN_BitSeg2_7TimeQuantum;43、CAN_Prescaler = 1;44、CAN_ClockSource = CAN_ClockSource_Internal; //内部时钟45、46、status =CAN_Init(CAN_MasterCtrl,CAN_Mode,CAN_SynJumpWidth,CAN_BitSeg1,CAN_BitSeg2,CAN_ClockSo urce,CAN_Prescaler);47、48、/* CAN filter init */49、CAN_FilterNumber = 0; //0 1 2 3 4 5FILTER SELECT50、CAN_FilterActivation = ENABLE; //是否激活过滤51、CAN_FilterMode = CAN_FilterMode_IdMask; //FMR Register设置CAN_FilterMode_IdMask52、CAN_FilterScale = CAN_FilterScale_32Bit; //过虑模式8 16 32 16/853、CAN_FilterID1=0x64;54、CAN_FilterID2=0;55、CAN_FilterID3=0;56、CAN_FilterID4=0;57、CAN_FilterIDMask1=0xff; //0;58、CAN_FilterIDMask2=0x0; //0;59、CAN_FilterIDMask3=0x0; //0;60、CAN_FilterIDMask4=0x0; //0;61、62、CAN_FilterInit(CAN_FilterNumber, CAN_FilterActivation, CAN_FilterMode,CAN_FilterScale,CAN_FilterID1, CAN_FilterID2, CAN_FilterID3, CAN_FilterID4,CAN_FilterIDMask1, CAN_FilterIDMask2, CAN_FilterIDMask3, CAN_FilterIDMask4);63、}。
stm32速度估计与滤波方法STM32速度估计与滤波方法在许多应用中,需要对旋转物体的速度进行估计和控制。
例如,电机控制系统和运动控制系统均需要速度估计。
在STM32微控制器中,可以使用编码器、计数器和定时器等工具来进行速度测量。
本文将介绍如何在STM32上使用这些工具进行速度估计,并讨论如何使用滤波方法来积极地消除速度测量中的噪声。
1. 编码器编码器是用于测量电机或运动部件转动角度和速度的传感器。
STM32可以使用两种类型的编码器:增量编码器和绝对编码器。
增量编码器列有两个输出:A 相和 B 相。
当电机或运动部件旋转时,这些输出发出周期波形。
可以通过极限速度和跟踪极限计数器的变化来测量转速。
绝对编码器输出一个数字编码,用于表示电机或运动部件旋转的位置和方向。
当旋转时,这个数字编码发生变化。
可以使用定时器输入捕捉模式、外部中断或通过读取GPIO端口来测量转速。
2. 计数器计数器是用于计算某个事件的数量的工具。
在STM32中,计数器可以计算定时器引脚的脉冲数量。
此外,当与编码器结合使用时,它可以计数编码器输出脉冲的数量。
计数器可以使用定时器输入捕捉模式、外部中断或通过读取GPIO 端口来测量转速。
3. 定时器在STM32中,定时器可以用于测量编码器输出脉冲的时间间隔,进而计算转速。
定时器可以使用输入捕获模式测量脉冲的时间间隔。
在输入捕获模式下,当定时器计数器与特定的定时器引脚上的脉冲的时间间隔到达设置值时,将捕获计数器值。
可以使用这些捕获计数器值来测量时间间隔,并计算速度。
4. 滤波方法在进行速度测量时,可能会受到噪声的干扰。
为了避免噪声对测量结果的影响,可以使用滤波方法来平滑噪声信号。
常用的滤波方法包括低通滤波器、中值滤波器和卡尔曼滤波器。
低通滤波器通过滤除高频噪声信号来平滑信号。
可以将一阶低通滤波器实现为RC电路。
另一个常用的低通滤波器是Butterworth滤波器。
中值滤波器通过计算信号中的中值来平滑信号。
stm32 can2设置问题在stm32的互联型产品中,有两个can接口,一个主,一个从,主接口一般正常配置,网上资料比较多,但是从接口在配置的时候经常是只能发送,不能接收,一般原因都在于过滤器没有设置,如上图所示,在互联型产品中,会有0~28个过滤器组,而寄存器CAN_FMR的CAN2SB[5:0]代表了从can的过滤器开始组,由于其复位值为0x2A1C 0E01,所以可以判断CAN2SB[5:0]的开机复位值为14,从而在互联型产品中,can2的默认过滤器开始值为14,所以在进行can2的初始化过程中需要调用以下代码:/* CAN2 filter init */CAN_FilterInitStructure.CAN_FilterNumber=14;CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;CAN_FilterInit(&CAN_FilterInitStructure);这样设置后,其他设置可以跟can1的设置一样,就可以在接受到数据后产生中断,从而进行进一步处理。
STM32的CAN总线的标识符过滤器组使用注意事项CAN 总线的标识符过滤器很重要。
1. 标识符过滤器是用于接收的,发送的时候无需设置过滤器,这点一定要整明白。
根据发送端发送来的帧数据,通过标识符过滤器就可以设置仅接收需要接收的帧数据有效降低CPU 多余的处理时间。
2 什么是标识符?标识符主要包括如下,也可以简单的理解仅包含ID 号,但是在这里下面这些都是要包含的。
比如:数据帧和遥控帧,标识符就包含在其中,所以发送端发帧数据给接收端后,接收端就可以通过硬件标识符过滤器进行筛选,节省了CPU 时间:3. 下面就是最重要的,STM32 的CAN 总线标识符滤波器组包含两种实现方法:屏蔽位模式和标识符列表模式,这两种方式怎么理解呢,重点看下面的截图:书面上解释屏蔽位模式和标识符列表模式的区别屏蔽位模式在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照必须匹配或不用关心处理。
标识符列表模式在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。
因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2 个标识符寄存器。
接收报文标识符的每一位都必须跟过滤器标识符相同。
===================================标识符的列表模式比较好理解,就是指的所有的过滤器寄存器位全部用于过滤,简单的说就是发送端发送的标识符所有的位必须跟接收端的滤波器寄存器定义一样。
有一个位定义不一样,拒收此消息。
比STM32F103 有14 个过滤器组,如果采用两个16 位的过滤器形式,那么就可以固定识别出14 * 4 = 56 个不同的标识符,实际使用中也够用了。
为什么是乘以4,注意看上面的截图,4 个16 位过滤器--标识符列表===================================屏蔽位模式要稍麻烦一些,我们以2 个16 位过滤器---标识符屏蔽为例进行。
STM32 CAN 滤波器设置Identifier filterstm32 的屏蔽滤波功能对ID 是有要求的,mpc2515 你可以直接写ID,但在STM32 这里ID 必须进行移位处理.对照下表:Extended Id 滤波器设置(已验证,只接受Receive_ID 节点的数据):/* CAN filter init */ //设置成只能接受主节点Extended Id:01 的数据reference manualp557CAN_FilterInitStructure.CAN_FilterNumber=0;CAN_FilterInitStructure.CAN_ FilterMode=CAN_FilterMode_IdMask;//CAN_FilterInitStructure.CAN_FilterMode= CAN_FilterMode_IdList;//###########################################CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;CAN_FilterInitStruc ture.CAN_FilterIdHigh=(((u32)Receive_ID>16;CAN_FilterInitStructure.CAN_Filter IdLow=(((u32)Receive_IDStandard Id 滤波器设置:CAN_FilterMaskId 位的含义是MaskEach bit of the register specifies whether the bit of the associated identifier register mustmatch with the corresponding bit of the expected identifier or not.0: Dont care, the bit is not used for the comparison1: Must match, the bit of the incoming identifier must have the same level has specified inthe corresponding identifier register of the filter.我们这里全部设置成1 ,也就是只接受CAN_Filter 中设置的节点的数据tips:感谢大家的阅读,本文由我司收集整编。
前言在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。
因此,发送者以广播的形式把报文发送给所有的接收者。
节点在接收报文时,根据标识符(CAN ID)的值决定软件是否需要该报文;如果需要,就拷贝到SRAM里;如果不需要,报文就被丢弃且无需软件的干预。
为满足这一需求,bxCAN为应用程序提供了14个位宽可变的、可配置的过滤器组(13~0),以便只接收那些软件需要的报文。
硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从而占用一定的CPU开销。
每个过滤器组x 由2个32位寄存器,CAN_FxR0和CAN_FxR1组成。
为了让大家了解STM32的bxCAN的接收过滤机制,首先大家需要了解几个概念。
2 几个重要的概念2.1 过滤器组STM32总共提供14个过滤器组来处理CAN接收过滤问题,每个过滤器组包含两个32位寄存器CAN_FxR0和CAN_FxR1组成,在设置为屏蔽位模式下,其中一个作为标识符寄存器,另一个作为屏蔽码寄存器。
过滤器组中的每个过滤器,编号(叫做过滤器号)从0开始,到某个最大数值(这时最大值并非13,而是取决于14个过滤器组的模式和位宽的设置,当全部配置为位宽为16,且为标识符列表模式时,最大编号为14*4-1=55)。
2.2 过滤器的过滤模式STM32提供两种过滤模式供用户设置:屏蔽位模式和标识符列表模式。
2.2.1 屏蔽位模式为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式。
在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。
2.2.2 标识符列表模式为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。
在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。
因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。
接收报文标识符的每一位都必须跟过滤器标识符相同。
2.3 过滤器的位宽每个过滤器组的位宽都可以独立配置,以满足应用程序的不同需求。
标题:STM32低通滤波器参数详解一、引言在嵌入式系统设计中,滤波器是一个非常重要的模块。
它可以用于滤除噪声、降低采样频率、去除高频干扰等。
而对于STM32系列微控制器来说,其内置了丰富的滤波器功能,包括低通滤波器。
了解STM32低通滤波器的参数对于嵌入式系统设计者来说是非常有益的。
本文将从参数的角度出发,对STM32低通滤波器进行详细解析。
二、STM32低通滤波器的作用低通滤波器是一种能够通过滤除输入信号中高于截止频率部分而传递低于截止频率部分的信号的滤波器。
在STM32中,低通滤波器可以用于滤除高频噪声,降低采样频率,减小系统开销等。
其主要作用包括但不限于:1. 降低噪声 2. 降低采样频率 3. 增强系统稳定性等。
三、STM32低通滤波器参数介绍在STM32中,低通滤波器的参数主要包括截止频率、增益、失真度等。
接下来,我们将详细介绍这些参数的含义和作用。
1. 截止频率(cutoff frequency)截止频率是指在滤波器中起作用的频率上限。
对于低通滤波器来说,截止频率就是能够通过滤波器的最大频率。
在STM32中,用户可以通过设置滤波器的截止频率来控制滤波效果。
通常情况下,截止频率越低,滤波效果越好。
但是需要注意的是,过低的截止频率可能会导致信号变形或失真。
在实际应用中,需要根据具体的信号特性来选择合适的截止频率。
2. 增益(gain)增益是指滤波器对不同频率信号的响应幅度。
在STM32中,用户可以通过设置增益参数来控制滤波器对不同频率信号的响应。
通常情况下,增益越大,滤波效果越明显。
但是需要注意的是,过大的增益会导致信号失真或滤波器不稳定。
3. 失真度(distortion)失真度是指滤波器输出信号与输入信号之间的差异程度。
在STM32中,失真度可以通过一些特定的参数来衡量,比如信号的谐波含量、非线性等。
通常情况下,失真度越小,滤波效果越好。
在设计滤波器时,需要充分考虑失真度参数的影响。
关于STM32的CAN过滤问题在使用CAN接收时,一般都是使用如下图模式:过滤器长度是32位,然后过滤模式有两种,一种list过滤,一种mask过滤,list过滤就是过滤出你要的唯一的那个ID,而mask过滤可以滤出满足条件的一组ID,比如,在list模式下,你期望收到的ID是0x12345678,那么只要它收到0x12345678了才能触发接收中断或者接收函数才能收到数据,如果在mask模式下,你还得多设置一个mask寄存器,例如设置为0xFFFF0000,则只要收到的ID是符合0x1234xxxx 的就行了一般的CAN过滤器初始化如下图注意:在上图模式中,MaskId寄存器全为0,所以收到的ID全都不检查(或者说不理会它的所有位是否符合要求),这样,STM32的CAN将会收到所有ID 现在描述一下我在调试过滤器时发现的一个很容易犯错的地方:首先,注意上图中的四个16位的寄存器等价于下图中两个32位的寄存器这两个32位的寄存器,一个装的是mask,一个是list,它们的结构是一样的,前半部分是ID,后半部分是3个控制位。
现假设CAN接收端期望接收到的ID 为0x123456xx,思路为:list随便填一个符合0x123456xx格式的数,然后mask的高16位设为0xFFFF,低16位设为0xFF00,这样它不就会检查每个ID是不是符合0x123456xx了吗,那么设置如下:认真查看一下手册,你会发现这样做是错的,请仔细看下图:CAN发送端发来的ID当然是0x12345678,但是接收端收到此ID后,在过滤器中,它先把该ID封装成上图中的“CAN接收”帧,可见,它加了3个控制位进去了,这样一来,mask不理会的地方变成了ID的低5位和3个控制位,明显跟需要的“不理会的是ID的低8位”不符,要明白:stm32 CAN接收过滤时,ID要左移3位再在低3位添加3个控制位变成一个32位的帧再拿去跟mask 比较的,所以mask也应该左移3位才对:补充说明:可以这样更简单地理解:一个CAN帧有32位的帧头,再加上32位的帧体,在ST给的库函数中,CAN 发送时必须先设置好ID,假设这个ID是扩展ID,29位,那么设置的这个ID 开头3位必然是0,ST的库函数把这个ID左移3位以后再发出去的,接收时再右移3位所以你看起来并不感觉到ID有动过,但是如果你要使用CAN过滤的话就必须考虑这些中间环节了,因为CAN接收到的第一手ID等于CAN发送时的ID左移3位(低3位插入了IDE、RTR等3个位),所以你的CAN过滤的mask和id两个量基于的应该是CAN发送时的ID左移3位,这是库函数带来的一个麻烦,用寄存器编程则没有这个问题。
S T M32C A N接收过滤和发送分析通过对CANBUS协议的理解,我们知道:CAN总线上的节点接收或发送数据都是以帧为单位的!!!CAN协议规定了好几种帧类型,但是对于我们应用来说,只有数据帧和远程帧可以通过软件编程来控制。
(其他几种帧都是由CAN控制器硬件实现的,我们想管也管不了)。
而数据帧和远程帧最大的区别在于:远程帧没有数据域。
数据帧分为标准数据帧和扩展数据帧,它们之间最大的区别在于:标识符(ID)长度不同(标准帧为11位,扩展帧为29位)。
为了能更好地理解下面的内容,让我们先来回忆一下标准数据帧是什么样子的:0x5A,!!!我们必须按照帧的格式填充它!TNND,我们来看一下uint32_tuint8_tuint8_tuint8_tuint8_t}CanTxMsg;StdIdStdId用来设定标准标识符。
它的取值范围为0到0x7FF。
ExtIdExtId用来设定扩展标识符。
它的取值范围为0到0x1FFFFFFF。
IDEIDE用来设定消息标识符的类型。
IDE值IDE描述CAN_Id_Standard使用标准标识符CAN_Id_Extended使用扩展标识符RTRRTR用来设定待传输消息的帧类型。
它可以设置为数据帧或者远程帧。
RTR值RTR描述CAN_RTR_Data数据帧CAN_RTR_Remote远程帧DLCDLC用来设定待传输消息的帧长度。
它的取值范围是0到0x8。
Data[8]Data[8]包含了待传输数据,它的取值范围为0到0xFF。
先声明一个CanTxMsg类型的变量,然后按照自己具体的需要,填充此结构变量就可以发送了(帧结构中其他没有填充的部分由硬件自动完成)。
强调:这里的StdId或者ExtId是根据自己的实际需要设置的!我们先抛开它们所代表的实际意义,认为它们存在的目的是为了“进攻”。
(发送出去让别人过滤)接下来,我们来看接收,第一个问题就是它是怎样接收的?------过滤!!!无数的初学者都倒在了这里。
STM32 CAN 过滤器、滤波屏蔽器配置总结下面容为:一、在STM32互联型产品中,CAN1和CAN2分享28个过滤器组,其它STM32F103xx系列产品中有14个过滤器组,用以对接收到的帧进行过滤。
1、过滤器组每组过滤器包括了2个可配置的32位寄存器:CAN_FxR0和CAN_FxR1。
这些过滤器相当于关卡,每当收到一条报文时,CAN要先将收到的报文从这些过滤器上"过"一下,能通过的报文是有效报文,收进相关联FIFO(FIFO1或FIFO2),不能通过的是无效报文(不是发给"我"的报文),直接丢弃。
(标准CAN的标志位长度是11位。
扩展格式CAN的标志位长度是29。
CAN2.0A协议规定CAN控制器必须有一个11位的标识符。
CAN2.0B协议中规定CAN控制器的标示符长度可以是11位或29位。
STM32同时支持CAN2.0A/CAN2.0B 协议。
)每组过滤器组有两种工作模式:标识符列表模式和标识符屏蔽位模式。
标识符屏蔽位模式:可过滤出一组标识符。
此时,这样CAN_FxR0中保存的就是标识符匹配值,CAN_FxR1中保存的是屏蔽码,即CAN_FxR1中如果某一位为1,则CAN_FxR0中相应的位必须与收到的帧的标志符中的相应位吻合才能通过过滤器;CAN_FxR1中为0的位表示CAN_FxR0中的相应位可不必与收到的帧进行匹配。
标识符列表模式:可过滤出一个标识。
此时CAN_FxR0和CAN_FxR1中的都是要匹配的标识符,收到的帧的标识符必须与其中的一个吻合才能通过过滤。
注意:CAN_FilterIdHigh是指高16位CAN_FilterIdLow是低16位应该将需要得到的帧的和过滤器的设置值左对齐起。
所有的过滤器是并联的,即一个报文只要通过了一个过滤器,就是算是有效的。
按工作模式和宽度,一个过滤器组可以变成以下几中形式之一:(1) 1个32位的屏蔽位模式的过滤器。
(2) 2个32位的列表模式的过滤器。
(3) 2个16位的屏蔽位模式的过滤器。
(4) 4个16位的列表模式的过滤器。
每组过滤器组有两个32位的寄存器用于存储过滤用的"标准值",分别是FxR1,FxR2。
在32位的屏蔽位模式下:有1个过滤器。
FxR1用于指定这些位的标准值,FxR2用于指定需要关心哪些位。
在32位的列表模式下:有2个过滤器。
FxR1指定过滤器0的标准值,FxR2指定过滤器1的标准值。
在16位的屏蔽位模式下:有2个过滤器。
FxR1配置过滤器0,其中,[31-16]位指定要关心的位,[15-0]位指定这些位的标准值。
FxR2配置过滤器1,其中,[31-16]位指定要关心的位,[15-0]位指定这些位的标准值。
在16位的列表模式下:有4个过滤器。
FxR1的[15-0]位配置过滤器0,FxR1的[31-16]位配置过滤器1。
FxR2的[15-0]位配置过滤器2,FxR2的[31-16]位配置过滤器3。
STM32的CAN有两个FIFO,分别是FIFO0和FIFO1。
为了便于区分,下面FIFO0写作FIFO_0,FIFO1写作FIFO_1。
每组过滤器组必须关联且只能关联一个FIFO。
复位默认都关联到FIFO_0。
所谓“关联”是指假如收到的报文从某个过滤器通过了,那么该报文会被存到该过滤器相连的FIFO。
从另一方面来说,每个FIFO都关联了一串的过滤器组,两个FIFO刚好瓜分了所有的过滤器组。
每当收到一个报文,CAN就将这个报文先与FIFO_0关联的过滤器比较,如果被匹配,就将此报文放入FIFO_0中。
如果不匹配,再将报文与FIFO_1关联的过滤器比较,如果被匹配,该报文就放入FIFO_1中。
如果还是不匹配,此报文就被丢弃。
每个FIFO的所有过滤器都是并联的,只要通过了其中任何一个过滤器,该报文就有效。
如果一个报文既符合FIFO_0的规定,又符合FIFO_1的规定,显然,根据操作顺序,它只会放到FIFO_0中。
每个FIFO中只有激活了的过滤器才起作用,换句话说,如果一个FIFO有20个过滤器,但是只激话了5个,那么比较报文时,只拿这5个过滤器作比较。
一般要用到某个过滤器时,在初始化阶段就直接将它激活。
需要注意的是,每个FIFO必须至少激活一个过滤器,它才有可能收到报文。
如果一个过滤器都没有激活,那么是所有报文都报废的。
一般的,如果不想用复杂的过滤功能,FIFO可以只激活一组过滤器组,且将它设置成32位的屏蔽位模式,两个标准值寄存器(FxR1,FxR2)都设置成0。
这样所有报文均能通过。
2、过滤器编号过滤器编号用于加速CPU对收到报文的处理。
收到一个有效报文时, CAN会将收到的报文以及它所通过的过滤器编号,一起存入接收中。
CPU在处理时,可以根据过滤器编号,快速的知道该报文的用途,从而作出相应处理。
不用过滤器编号其实也是可以的,这时候CPU就要分析所收报文的标识符,从而知道报文的用途。
由于标识符所含的信息较多,处理起来就慢一点了。
会消耗CPU资源。
STM32使用以下规则对过滤器编号:(1) FIFO_0和FIFO_1的过滤器分别独立编号,均从0开始按顺序编号。
(2) 所有关联同一个FIFO的过滤器,不管有没有被激活,均统一进行编号。
(3) 编号从0开始,按过滤器组的编号从小到大,按顺序排列。
(4) 在同一过滤器组,按寄存器从小到大编号。
FxR1配置的过滤器编号小,FxR2配置的过滤器编号大。
(5) 同一个寄存器,按位序从小到大编号。
[15-0]位配置的过滤器编号小,[31-16]位配置的过滤器编号大。
(6) 过滤器编号是弹性的。
当更改了设置时,每个过滤器的编号都会改变。
但是在设置不变的情况下,各个过滤器的编号是相对稳定的。
这样,每个过滤器在自己在FIFO中都有编号。
在FIFO_0中,编号从0 -- (M-1),其中M为它的过滤器总数。
在FIFO_1中,编号从0 -- (N-1),,其中N为它的过滤器总数。
一个FIFO如果有很多的过滤器,,可能会有一条报文,在几个过滤器上均能通过,这时候,,这条报文算是从哪儿过来的呢?STM32在使用过滤器时,按以下顺序进行过滤:(1) 位宽为32位的过滤器,优先级高于位宽为16位的过滤器。
(2) 对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式。
(3) 位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优先级高。
按这样的顺序,报文能通过的第一个过滤器,就是该报文的过滤器编号,被存入接收中。
二、代码:u32 slave_id = 0x11 ;/*CAN1配置函数*/void CAN_Configuration(void){CAN_InitTypeDef CAN_InitStructure;CAN_FilterInitTypeDef CAN_FilterInitStructure;// CAN register initCAN_DeInit(CAN1);CAN_StructInit(&CAN_InitStructure);// CAN cell initCAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式CAN_InitStructure.CAN_ABOM=DISABLE;CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通过清除sleep位来唤醒CAN_InitStructure.CAN_NART=ENABLE;//ENABLE;报文自动重传CAN_InitStructure.CAN_RFLM=DISABLE;//接收溢出时,FIFO未锁定 CAN_InitStructure.CAN_TXFP=DISABLE;//发送的优先级由标示符的大小决定CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//正常模式下//设置can通讯波特率为50KbpsCAN_InitStructure.CAN_SJW=CAN_SJW_1tq;CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;CAN_InitStructure.CAN_Prescaler=45;CAN_Init(CAN1,&CAN_InitStructure);// CAN filter initCAN_FilterInitStructure.CAN_FilterNumber=0; //使用0号过滤器组CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//屏蔽位标识符模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;// 1个32bit的过滤器CAN_FilterInitStructure.CAN_FilterIdHigh =(((u32)slave_id<<21)&0xffff0000)>>16;CAN_FilterInitStructure.CAN_FilterIdLow =(((u32)slave_id<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xffff;CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF; //完全匹配CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF; //完全匹配CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0; //使用FIFO0CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //使能过滤器CAN_FilterInit(&CAN_FilterInitStructure);CAN_ITConfig(CAN1,CAN_IT_FMP0|CAN_IT_EPV, ENABLE);}/*CAN 发送函数*/unsigned char CAN1_SendData(void){CanTxMsg TxMessage;TxMessage.StdId=0x11; //标准标识符TxMessage.RTR=CAN_RTR_DATA; //数据帧TxMessage.IDE=CAN_ID_STD; //标准帧TxMessage.DLC=2; //数据长度 2TxMessage.Data[0]=0xCA; //发送的数据TxMessage.Data[1]=0xFE;CAN_Transmit(CAN1,&TxMessage); //发送数据}/*中断服务函数*/void USB_LP_CAN1_RX0_IRQHandler(void){CanRxMsg RxMessage;CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);If(RxMessage.FMI == 0){/*接收数据处理*/}}三、滤波器配置详细如下:1、对扩展数据帧进行过滤:(只接收扩展数据帧)CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)slave_id<<3)&0xFFFF0000)>>16;CAN_FilterInitStructure.CAN_FilterIdLo=(((u32)slave_id<<3)|CAN_ID_EXT |CAN_RTR_DATA)&0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;(注:标准帧数据帧、标准远程帧和扩展远程帧均被过滤)2、对扩展远程帧过滤:(只接收扩展远程帧)CAN_FilterInitStructure.CAN_FilterIdHigh =(((u32)slave_id<<3)&0xFFFF0000)>>16;CAN_FilterInitStructure.CAN_FilterIdLow =(((u32)slave_id<<3)|CAN_ID_EXT|CAN_RTR_REMOTE)&0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;3、对标准远程帧过滤:(只接收标准远程帧)CAN_FilterInitStructure.CAN_FilterIdHigh =(((u32)slave_id<<21)&0xffff0000)>>16;CAN_FilterInitStructure.CAN_FilterIdLow =(((u32)slave_id<<21)|CAN_ID_STD|CAN_RTR_REMOTE)&0xffff;CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;4、对标准数据帧过滤:(只接收标准数据帧)CAN_FilterInitStructure.CAN_FilterIdHigh =(((u32)slave_id<<21)&0xffff0000)>>16;CAN_FilterInitStructure.CAN_FilterIdLow =(((u32)slave_id<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xffff;CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;5、对扩展帧进行过滤:(扩展帧不会被过滤掉)CAN_FilterInitStructure.CAN_FilterIdHigh =(((u32)slave_id<<3)&0xFFFF0000)>>16;CAN_FilterInitStructure.CAN_FilterIdLow =(((u32)slave_id<<3)|CAN_ID_EXT)&0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFC;6、对标准帧进行过滤:(标准帧不会被过滤掉)CAN_FilterInitStructure.CAN_FilterIdHigh =(((u32)slave_id<<21)&0xffff0000)>>16;CAN_FilterInitStructure.CAN_FilterIdLow =(((u32)slave_id<<21)|CAN_ID_STD)&0xffff;CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFC;注:slave_id为要过滤的id号。