日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32F103的CAN通讯接收过滤器过滤分析

發布時間:2024/3/26 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32F103的CAN通讯接收过滤器过滤分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言
STM32 的標識符過濾是一個比較復雜的東東,它的存在減少了 CPU 處理 CAN 通信的開銷。STM32 的過濾器組最多有 28 個(互聯型),但是 STM32F103ZET6 只有 14 個(增強型),每個濾波器組 x 由 2 個 32 為寄存器, CAN_FxR1 和 CAN_FxR2 組成。學習了CAN通訊,底層的東東CAN控制器已經幫你處理完成,也就是CAN通訊協議已經做好,你按協議格式往對應的位扔數據發送就好,所以使用CAN通訊,我們只需要去關心制定發送的數據間的協議,也就是給每個數據加上有標識符的協議。

CAN過濾器的分析

因為STM32在非互聯網型產品中CAN控制器提供了14個位寬可變、可配置的過濾器組(13~0),每個過濾器組x由2個32位寄存器,CAN_FxR0和CAN_FxR1組成,而1個過濾器組的位寬設置可以分成四種工作模式,工作模式取決于兩個寄存器FBMx,FSCx的設置,如下圖所示:

看到過濾器的四種工作模式,工作模式中標識符屏蔽和列表模式,如何去理解,舉個例子,假如我們發送的標識IDCanTxMsg.StdId是0x000~0x00f,接收過濾先用標識符屏蔽模式來過濾標識的ID,如下所示:

ID : 000 0000 0000 xxxx 屏蔽 : 111 1111 1111 0000

x代表0或者1都是可以通過,0000到1111的任意組合,這樣就可以過濾出0x000~0x00f的數據的,所以屏蔽的意思就是讓某個范圍的標識符ID可以通過,目的是過濾出一組標志符。那么如果想過濾出一個數據0x003,用標識符屏蔽模式實現方式如下

ID : 000 0000 0000 0011 屏蔽 : 111 1111 1111 1111

如果接收過濾使用標識符列表模式來過濾標識ID,如下所示,

ID : 000 0000 0001 ID : 000 0000 0010

CAN 接收過濾器的四種工作模式的程序配置`

1、32位標識符屏蔽模式
假如要發送的標示符IDCanTxMsg.StdId范圍為0x010~0x01f

ID : 0000 001x xxx0 0000 0000 0000 0000 0000 //分別對應CAN_FxR1高16位、CAN_FxR1低16位 屏蔽 : 1111 1110 0001 1111 1111 1111 1111 1111 //分別對應CAN_FxR2高16位、CAN_FxR2低16位

程序配置如下

CAN_RxFilerconfig(0,CANRX32IDMASK); //32位標識符屏蔽模式 void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode) {CAN_FilterInitTypeDef CAN_FilterInitStructure;CAN_FilterInitStructure.CAN_FilterNumber=FilterNum; //過濾器號0~13可選if(FilterMode==CANRX32IDMASK){CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //標識符屏蔽模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位寬 }else if(FilterMode==CANRX32IDLIST){CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //標識符列表模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位寬 }else if(FilterMode==CANRX16IDMASK){CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //標識符屏蔽模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位寬 }else if(FilterMode==CANRX16IDLIST){CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //標識符列表模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位寬}//標識符寄存器FxR1CAN_FilterInitStructure.CAN_FilterIdHigh=0x010<<5; //32位ID,高16位CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; //低16位//屏蔽寄存器FxR2CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xfe1f; //32位MASK,高16位CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff; //低16位CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //過濾器0關聯到FIFO0CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活過濾器0CAN_FilterInit(&CAN_FilterInitStructure); //濾波器初始化 }

2、32位標識符列表模式
假如要發送的標示符IDCanTxMsg.StdId為0x011和0x012兩個。

ID : 0000 0010 0010 0000 0000 0000 0000 0000 //分別對應CAN_FxR1高16位、CAN_FxR1低16位 //0x011 屏蔽 : 0000 0010 0100 1111 1111 1111 1111 1111 //分別對應CAN_FxR2高16位、CAN_FxR2低16位 //0x012

程序配置

CAN_RxFilerconfig(0,CANRX32IDLIST); //32位標識符列表模式 void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode) {CAN_FilterInitTypeDef CAN_FilterInitStructure;CAN_FilterInitStructure.CAN_FilterNumber=FilterNum; //過濾器號0~13可選if(FilterMode==CANRX32IDMASK){CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //標識符屏蔽模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位寬 }else if(FilterMode==CANRX32IDLIST){CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //標識符列表模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位寬 }else if(FilterMode==CANRX16IDMASK){CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //標識符屏蔽模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位寬 }else if(FilterMode==CANRX16IDLIST){CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //標識符列表模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位寬}//標識符寄存器FxR1CAN_FilterInitStructure.CAN_FilterIdHigh=0x011<<5; //32位ID,高16位CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; //低16位//屏蔽寄存器FxR2CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x012<<5; //32位MASK,高16位CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff; //低16位CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //過濾器0關聯到FIFO0CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活過濾器0CAN_FilterInit(&CAN_FilterInitStructure); //濾波器初始化 }

3、16位標識符屏蔽模式
假如要發送的標示符IDCanTxMsg.StdId范圍為0x0100x01f,0x0000x00f。

ID : 0000 001x xxx0 0000 //分別對應CAN_FxR1低16位 CAN_FilterIdLow 屏蔽 : 1111 1110 0001 1111 //分別對應CAN_FxR1高16位 CAN_FilterIdHighID : 0000 000x xxx0 0000 //分別對應CAN_FxR2低16位 CAN_FilterMaskIdLow 屏蔽 : 1111 1110 0001 1111 //分別對應CAN_FxR2高16位 CAN_FilterMaskIdHigh

程序配置如下

CAN_RxFilerconfig(0,CANRX16IDMASK); //16位標識符屏蔽模式 void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode) {CAN_FilterInitTypeDef CAN_FilterInitStructure;CAN_FilterInitStructure.CAN_FilterNumber=FilterNum; //過濾器號0~13可選if(FilterMode==CANRX32IDMASK){CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //標識符屏蔽模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位寬 }else if(FilterMode==CANRX32IDLIST){CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //標識符列表模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位寬 }else if(FilterMode==CANRX16IDMASK){CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //標識符屏蔽模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位寬 }else if(FilterMode==CANRX16IDLIST){CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //標識符列表模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位寬}//標識符寄存器FxR1CAN_FilterInitStructure.CAN_FilterIdHigh=0xfe1f; //32位ID,高16位CAN_FilterInitStructure.CAN_FilterIdLow=0x010<<5; //低16位//屏蔽寄存器FxR2CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xfe1f; //32位MASK,高16位CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x000<<5; //低16位CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //過濾器0關聯到FIFO0CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活過濾器0CAN_FilterInit(&CAN_FilterInitStructure); //濾波器初始化 }

4、16位標識符列表模式
假如要發送的標示符IDCanTxMsg.StdId 有0x010,0x01f,0x001,0x00f四個。

ID : 0000 0010 0000 0000 //分別對應CAN_FxR1低16位 CAN_FilterIdLow //0x010 ID : 0000 0011 1110 0000 //分別對應CAN_FxR1高16位 CAN_FilterIdHigh //0x01fID : 0000 0000 0010 0000 //分別對應CAN_FxR2低16位 CAN_FilterMaskIdLow //0x001 ID : 0000 0001 1110 0000 //分別對應CAN_FxR2高16位 CAN_FilterMaskIdHigh //0x00f

程序配置如下

CAN_RxFilerconfig(0,CANRX16IDLIST); //16位標識符列表模式 void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode) {CAN_FilterInitTypeDef CAN_FilterInitStructure;CAN_FilterInitStructure.CAN_FilterNumber=FilterNum; //過濾器號0~13可選if(FilterMode==CANRX32IDMASK){CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //標識符屏蔽模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位寬 }else if(FilterMode==CANRX32IDLIST){CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //標識符列表模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位寬 }else if(FilterMode==CANRX16IDMASK){CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //標識符屏蔽模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位寬 }else if(FilterMode==CANRX16IDLIST){CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //標識符列表模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位寬}//標識符寄存器FxR1CAN_FilterInitStructure.CAN_FilterIdHigh=0x01f<<5; //32位ID,高16位CAN_FilterInitStructure.CAN_FilterIdLow=0x010<<5; //低16位//屏蔽寄存器FxR2CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x00f<<5; //32位MASK,高16位CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x001<<5; //低16位CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //過濾器0關聯到FIFO0CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活過濾器0CAN_FilterInit(&CAN_FilterInitStructure); //濾波器初始化 }

總結

以上是生活随笔為你收集整理的STM32F103的CAN通讯接收过滤器过滤分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。