修正图像文件夹名称.

Signed-off-by: ithink.chan <chenyang@autoai.com>
This commit is contained in:
ithink.chan 2020-05-06 13:19:13 +08:00
parent a4d8b0a406
commit 188c066cec
16 changed files with 26 additions and 24 deletions

View File

@ -6,7 +6,7 @@ bxCAN是STM32系列最稳定的IP核之一无论有哪个新型号出来
## 2、准备工作 ## 2、准备工作
### 2.1、为什么要过滤器 ### 2.1、为什么要过滤器
在这里我们可以将CAN总线看成一个广播消息通道上面传输着各种类型的消息好比报纸有体育新闻财经新闻政治新闻还有军事新闻每个人都有自己的喜好不一定对所有新闻都感兴趣因此在看报纸的时候一般人都是只看自己感兴趣的那类新闻而过滤掉其他不感兴趣的内容。那么我们一般是怎么过滤掉那些不感兴趣的内容的呢下面有两种方法来实现这个目的 在这里我们可以将CAN总线看成一个广播消息通道上面传输着各种类型的消息好比报纸有体育新闻财经新闻政治新闻还有军事新闻每个人都有自己的喜好不一定对所有新闻都感兴趣因此在看报纸的时候一般人都是只看自己感兴趣的那类新闻而过滤掉其他不感兴趣的内容。那么我们一般是怎么过滤掉那些不感兴趣的内容的呢下面有两种方法来实现这个目的
@ -26,7 +26,7 @@ bxCAN是STM32系列最稳定的IP核之一无论有哪个新型号出来
下面假设我们是古时候一座城镇的守卫城主要求只有1156年出生的人才可以进城我们又该如何执行呢假设古时候的人也有类似今天的身份证...->_<-,大家都知道身份份证号码中有4位是表示出生年月如下图 下面假设我们是古时候一座城镇的守卫城主要求只有1156年出生的人才可以进城我们又该如何执行呢假设古时候的人也有类似今天的身份证...->_<-,大家都知道身份份证号码中有4位是表示出生年月如下图
![身份证](./imgs/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/001.png) ![身份证](./img/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/001.png)
如上图身份证中第7~10这4位数表示的是出生年份那么我们可以这么执行 如上图身份证中第7~10这4位数表示的是出生年份那么我们可以这么执行
@ -63,7 +63,7 @@ else
对于机器来说我们要为它准备好两张纸片一片写上屏蔽码另一片纸片写上验证码屏蔽码上相应位为1时表示此位需要与验证码对应位进行比较反之则表示不需要。机器在执行任务的时候先将获取的身份证号码与屏蔽码进行“与”操作再将结果与验证码的进行比较根据判断是否相同来决定是否通过。整个判别流程如下所示 对于机器来说我们要为它准备好两张纸片一片写上屏蔽码另一片纸片写上验证码屏蔽码上相应位为1时表示此位需要与验证码对应位进行比较反之则表示不需要。机器在执行任务的时候先将获取的身份证号码与屏蔽码进行“与”操作再将结果与验证码的进行比较根据判断是否相同来决定是否通过。整个判别流程如下所示
![掩码模式的计算过程](./imgs/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/002.png) ![掩码模式的计算过程](./img/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/002.png)
从上图可以很容易地理解屏蔽码与验证码的含义,这样一来,能通过的结果数量就完全取决于屏蔽码,设得宽,则可以通过的多(所有位为0则不过任何过滤操作则谁都可以通过),设得窄,则通过的少(所有位设为1则只有一个能通过)。那么知道这个有什么用呢因为bxCAN的过滤器的掩码模式就是采用这种方式在bxCAN中分别采用了两个寄存器(CAN_FiR1,CAN_FiR2)来存储屏蔽码与验证码,从而实现掩码模式的工作流程的。这样,我们就知道了bxCAN过滤器的掩码模式的大概工作原理。 从上图可以很容易地理解屏蔽码与验证码的含义,这样一来,能通过的结果数量就完全取决于屏蔽码,设得宽,则可以通过的多(所有位为0则不过任何过滤操作则谁都可以通过),设得窄,则通过的少(所有位设为1则只有一个能通过)。那么知道这个有什么用呢因为bxCAN的过滤器的掩码模式就是采用这种方式在bxCAN中分别采用了两个寄存器(CAN_FiR1,CAN_FiR2)来存储屏蔽码与验证码,从而实现掩码模式的工作流程的。这样,我们就知道了bxCAN过滤器的掩码模式的大概工作原理。
@ -82,16 +82,16 @@ else
1986 年德国电气商BOSCH公司开发出面向汽车的CAN 通信协议刚开始的时候CAN ID定义为11位我们称之为标准格式ISO11898-1标准中CAN的基本格式如下图所示 1986 年德国电气商BOSCH公司开发出面向汽车的CAN 通信协议刚开始的时候CAN ID定义为11位我们称之为标准格式ISO11898-1标准中CAN的基本格式如下图所示
![标准CAN报文格式定义](./imgs/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/003.png) ![标准CAN报文格式定义](./img/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/003.png)
如上图所示标准CAN ID存放在上图ID18~ID28中共11位。随着工业发展后来发现11位的CAN ID已经不够用于是就增加了18位扩展CAN ID到29位如下图所示 如上图所示标准CAN ID存放在上图ID18~ID28中共11位。随着工业发展后来发现11位的CAN ID已经不够用于是就增加了18位扩展CAN ID到29位如下图所示
![扩展CAN报文格式定义](./imgs/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/004.png) ![扩展CAN报文格式定义](./img/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/004.png)
从上图对比扩展CAN报文与标准CAN报文发现在仲裁域部分扩展CAN报文的CAN ID包含了base Identifier与extension Identifier即基本ID与扩展ID而标准CAN报文的CAN ID部分只包含基本ID扩展ID(ID0~ID17)被放在基本ID的右方,也就是说,属于低位。知道这些有什么用呢?至少我们可以得到这两条信息: 从上图对比扩展CAN报文与标准CAN报文发现在仲裁域部分扩展CAN报文的CAN ID包含了base Identifier与extension Identifier即基本ID与扩展ID而标准CAN报文的CAN ID部分只包含基本ID扩展ID(ID0~ID17)被放在基本ID的右方,也就是说,属于低位。知道这些有什么用呢?至少我们可以得到这两条信息:
标准ID一般小于或等于<=0x7FF(11位)只包含基本ID。 * 标准ID一般小于或等于<=0x7FF(11位)只包含基本ID。
对于扩展CAN的低18位为扩展ID高11位为基本ID。 * 对于扩展CAN的低18位为扩展ID高11位为基本ID。
例如标准CAN ID 0x7E1二进制展开为0b 0[111 1110 0001] ,只有中括号内的11位才有效其全部是基本ID。 例如标准CAN ID 0x7E1二进制展开为0b 0[111 1110 0001] ,只有中括号内的11位才有效其全部是基本ID。
@ -103,19 +103,19 @@ else
首先过滤模式分列表模式和掩码模式,因此,对于没有过滤器,我们需要这么一个位来标记,用户可以通过设置这个位来标记他到底是想要这个过滤器工作在列表模式下还是掩码模式,于是,这个表示过滤模式的位就定义在CAN_FM1R寄存器中的FBMx位上如下图 首先过滤模式分列表模式和掩码模式,因此,对于没有过滤器,我们需要这么一个位来标记,用户可以通过设置这个位来标记他到底是想要这个过滤器工作在列表模式下还是掩码模式,于是,这个表示过滤模式的位就定义在CAN_FM1R寄存器中的FBMx位上如下图
![CAN过滤器模式寄存器CAN_FM1R定义](./imgs/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/005.png) ![CAN过滤器模式寄存器CAN_FM1R定义](./img/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/005.png)
这里以STM32F407为例bxCAN共有28个过滤器于是上图的每一个位对应地表示这28个过滤器的工作模式供用户设置。”0”表示掩码模式”1”表示列表模式。 这里以STM32F407为例bxCAN共有28个过滤器于是上图的每一个位对应地表示这28个过滤器的工作模式供用户设置。”0”表示掩码模式”1”表示列表模式。
另外我们知道了标准CAN ID位11位而扩展CAN ID有29位对于标准的CAN ID来说我们有一个16位的寄存器来处理他足够了相应地扩展CAN ID我们就必须使用32位的寄存器来处理它而在实际应用中根据需求我们可能自始至终都只需要处理11位的CAN ID。对于资源严重紧张的MCU环境来说本着不浪费的原则这里最好能有另外一个标志用告诉过滤器是否需要处理32位的CAN ID。于是bxCAN处于这种考虑也设置了这么一个寄存器CAN_FS1R来表示CAN ID的位宽如下图所示 另外我们知道了标准CAN ID位11位而扩展CAN ID有29位对于标准的CAN ID来说我们有一个16位的寄存器来处理他足够了相应地扩展CAN ID我们就必须使用32位的寄存器来处理它而在实际应用中根据需求我们可能自始至终都只需要处理11位的CAN ID。对于资源严重紧张的MCU环境来说本着不浪费的原则这里最好能有另外一个标志用告诉过滤器是否需要处理32位的CAN ID。于是bxCAN处于这种考虑也设置了这么一个寄存器CAN_FS1R来表示CAN ID的位宽如下图所示
![CAN过滤器位宽寄存器CAN_FS1R定义](./imgs/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/006.png) ![CAN过滤器位宽寄存器CAN_FS1R定义](./img/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/006.png)
如上图每一个位对应着bxCAN中28个过滤器的位宽这个需要用户来设置。 如上图每一个位对应着bxCAN中28个过滤器的位宽这个需要用户来设置。
于是根据模式与位宽的设置我们共可以得出4中不同的组合32位宽的列表模式16位宽的列表模式32位宽掩码模式16位宽的掩码模式。如下图所示 于是根据模式与位宽的设置我们共可以得出4中不同的组合32位宽的列表模式16位宽的列表模式32位宽掩码模式16位宽的掩码模式。如下图所示
![CAN过滤器的4中工作模式](./imgs/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/007.png) ![CAN过滤器的4中工作模式](./img/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/007.png)
在bxCAN中每个过滤器都存在这么两个寄存器CAN_FxR1和CAN_FxR2这两个寄存器都是32位的他的定义并不是固定的针对不同的工作模式组合他的定义是不一样的如列表模式-32位宽模式下这两个寄存器的各位定义都是一样的都用来存储某个具体的期望通过的CAN ID这样就可以存入2个期望通过的CAN ID(标准CAN ID和扩展CAN ID均可);若在掩码模式-32位宽模式下时则CAN_FxR1用做32位宽的验证码而CAN_FxR2则用作32位宽的屏蔽码。在16位宽时CAN_FxR1和CAN_FxR2都要各自拆分成两个16位宽的寄存器来使用在列表模式-16位宽模式下CAN_FxR1和CAN_FxR2定义一样且各自拆成两个则总共可以写入4个标准CAN ID若在16位宽的掩码模式下则可以当做2对验证码+屏蔽码组合来用但它只能对标准CAN ID进行过滤。这个就是bxCAN过滤器的解决方案它采用了这4种工作模式。 在bxCAN中每个过滤器都存在这么两个寄存器CAN_FxR1和CAN_FxR2这两个寄存器都是32位的他的定义并不是固定的针对不同的工作模式组合他的定义是不一样的如列表模式-32位宽模式下这两个寄存器的各位定义都是一样的都用来存储某个具体的期望通过的CAN ID这样就可以存入2个期望通过的CAN ID(标准CAN ID和扩展CAN ID均可);若在掩码模式-32位宽模式下时则CAN_FxR1用做32位宽的验证码而CAN_FxR2则用作32位宽的屏蔽码。在16位宽时CAN_FxR1和CAN_FxR2都要各自拆分成两个16位宽的寄存器来使用在列表模式-16位宽模式下CAN_FxR1和CAN_FxR2定义一样且各自拆成两个则总共可以写入4个标准CAN ID若在16位宽的掩码模式下则可以当做2对验证码+屏蔽码组合来用但它只能对标准CAN ID进行过滤。这个就是bxCAN过滤器的解决方案它采用了这4种工作模式。
@ -129,22 +129,24 @@ else
引脚如下: 引脚如下:
```blk
PD0: CAN1_Rx PD0: CAN1_Rx
PD1: CAN1_Tx PD1: CAN1_Tx
PG6: LED1 PG6: LED1
PG8: LED2 PG8: LED2
PI9: LED3 PI9: LED3
PC7: LED4 PC7: LED4
```
![引脚定义](./imgs/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/008.png) ![引脚定义](./img/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/008.png)
时钟树如下设置: 时钟树如下设置:
![时钟树设置](./imgs/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/009.png) ![时钟树设置](./img/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/009.png)
在配置中的NVIC中打开CAN1 RX0接收中断如下图所示 在配置中的NVIC中打开CAN1 RX0接收中断如下图所示
![打开CAN1的RX0接收中断](./imgs/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/010.png) ![打开CAN1的RX0接收中断](./img/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/010.png)
其他的没有什么特殊设置生成工程后的main函数如下 其他的没有什么特殊设置生成工程后的main函数如下
@ -220,7 +222,7 @@ void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan)
### 4.2、32位宽的列表模式 ### 4.2、32位宽的列表模式
![32位宽下的CAN_FxR1与CAN_FxR2各位定义](./imgs/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/011.png) ![32位宽下的CAN_FxR1与CAN_FxR2各位定义](./img/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/011.png)
如上图所示在32位宽的列表模式下CAN_FxR1与CAN_FxR2都用来存储希望通过的CAN ID由于是32位宽的因此既可以存储标准CAN ID也可以存储扩展CAN ID。注意看上图最底下的各位定义可以看出从右到左首先最低位是没有用的然后是RTR表示是否为远程帧接着IDE扩展帧标志然后才是EXID[0:17]这18位扩展ID最后才是STID[0:10]这11位标准ID也就是前面所说的基本ID。在进行配置的时候即将希望通过的CAN ID写入的时候要注意各个位对号入座即基本ID放到对应的STD[0:10]扩展ID对应放到EXID[0:17],若是扩展帧则需要将IDE设为“1”标准帧则为“0”数据帧设RTR为“0”远程帧设RTR为“1”。示例代码如下 如上图所示在32位宽的列表模式下CAN_FxR1与CAN_FxR2都用来存储希望通过的CAN ID由于是32位宽的因此既可以存储标准CAN ID也可以存储扩展CAN ID。注意看上图最底下的各位定义可以看出从右到左首先最低位是没有用的然后是RTR表示是否为远程帧接着IDE扩展帧标志然后才是EXID[0:17]这18位扩展ID最后才是STID[0:10]这11位标准ID也就是前面所说的基本ID。在进行配置的时候即将希望通过的CAN ID写入的时候要注意各个位对号入座即基本ID放到对应的STD[0:10]扩展ID对应放到EXID[0:17],若是扩展帧则需要将IDE设为“1”标准帧则为“0”数据帧设RTR为“0”远程帧设RTR为“1”。示例代码如下
@ -261,7 +263,7 @@ sFilterConfig.FilterIdHigh = StdId<<5;
### 4.3、16位宽的列表模式 ### 4.3、16位宽的列表模式
![16位宽的列表模式](./imgs/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/012.png) ![16位宽的列表模式](./img/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/012.png)
如上图所示在16位宽的列表模式下FilterIdHighFilterIdLowFilterMaskIdHighFilterMaskIdLow这4个16位变量都是用来存储一个标准CAN ID这样就可以存放4个标准CAN ID了需要注意地是此种模式下是不能处理扩展CANID凡是需要过滤扩展CAN ID的都是需要用到32位宽的模式。于是有以下代码示例 如上图所示在16位宽的列表模式下FilterIdHighFilterIdLowFilterMaskIdHighFilterMaskIdLow这4个16位变量都是用来存储一个标准CAN ID这样就可以存放4个标准CAN ID了需要注意地是此种模式下是不能处理扩展CANID凡是需要过滤扩展CAN ID的都是需要用到32位宽的模式。于是有以下代码示例
@ -296,7 +298,7 @@ static void CANFilterConfig_Scale16_IdList(void)
### 4.4、32位宽掩码模式 ### 4.4、32位宽掩码模式
![32位宽掩码模式](./imgs/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/013.png) ![32位宽掩码模式](./img/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/013.png)
如上图所示32位宽模式下FilterIdHigh与FilterIdLow合在一起表示CAN_FxR1寄存器用来存放验证码而FilterMaskIdHigh与FilterMaskIdLow合在一起表示CAN_FxR2寄存器用来存放屏蔽码关于验证码与屏蔽码的概念在之前的2.3节已经明确说明了不清楚的可以回过去看看2.3节的内容。在32位宽的掩码模式下既可以过滤标准CAN ID也可以过滤扩展CAN ID甚至两者混合这来也是可以的下面我们就这3中情况分别给出示例。 如上图所示32位宽模式下FilterIdHigh与FilterIdLow合在一起表示CAN_FxR1寄存器用来存放验证码而FilterMaskIdHigh与FilterMaskIdLow合在一起表示CAN_FxR2寄存器用来存放屏蔽码关于验证码与屏蔽码的概念在之前的2.3节已经明确说明了不清楚的可以回过去看看2.3节的内容。在32位宽的掩码模式下既可以过滤标准CAN ID也可以过滤扩展CAN ID甚至两者混合这来也是可以的下面我们就这3中情况分别给出示例。
@ -445,7 +447,7 @@ static void CANFilterConfig_Scale32_IdMask_StandardId_ExtendId_Mix(void)
如下图所示: 如下图所示:
![16位宽的掩码模式](./imgs/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/014.png) ![16位宽的掩码模式](./img/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/014.png)
如上图所示在16位宽的掩码模式下CAN_FxR1的低16位是作为验证码对应的16位屏蔽码为CAN_FxR1的高16位同样的CAN_FxR2的低16位是作为验证码对应与CAN_FxR2的高16位为屏蔽码。于是其示例代码如下 如上图所示在16位宽的掩码模式下CAN_FxR1的低16位是作为验证码对应的16位屏蔽码为CAN_FxR1的高16位同样的CAN_FxR2的低16位是作为验证码对应与CAN_FxR2的高16位为屏蔽码。于是其示例代码如下
@ -503,7 +505,7 @@ static void CANFilterConfig_Scale16_IdMask(void)
上述代码运行的STM3240G-EVAL评估板上使用ZLG的USBCAN-2E-U盒子配合PC上的软件CANTest进行验证整个系统连接后的效果如下图所示 上述代码运行的STM3240G-EVAL评估板上使用ZLG的USBCAN-2E-U盒子配合PC上的软件CANTest进行验证整个系统连接后的效果如下图所示
![测试环境](./imgs/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/015.png) ![测试环境](./img/再谈_STM32_的_CAN_过滤器_-bxCAN_的过滤器的_4_种工作模式以及使用方法总结/015.png)
## 5. 总结 ## 5. 总结