《STM32从零开始学习历程》——CAN相关结构体
《STM32從零開始學(xué)習(xí)歷程》@EnzoReventon
CAN相關(guān)結(jié)構(gòu)體
相關(guān)鏈接:
《STM32從零開始學(xué)習(xí)歷程》——CAN通訊協(xié)議物理層
CAN-bus規(guī)范 V2.0版本
CAN總線入門
周立功-CAN協(xié)議中文版
參考資料:
[野火EmbedFire]《STM32庫開發(fā)實(shí)戰(zhàn)指南——基于野火霸天虎開發(fā)板》
[正點(diǎn)原子]STM32F4開發(fā)指南-庫函數(shù)版本_V1.2
[ST]《STM32F4xx中文參考手冊》
CAN-bus規(guī)范 V2.0版本
CAN總線入門
周立功-CAN協(xié)議中文版
CAN結(jié)構(gòu)體
從STM32的CAN外設(shè)我們了解到它的功能非常多,控制涉及的寄存器也非常豐富,而使用STM32標(biāo)準(zhǔn)庫提供的各種結(jié)構(gòu)體及庫函數(shù)可以簡化這些控制過程。跟其它外設(shè)一樣,STM32標(biāo)準(zhǔn)庫提供了CAN初始化結(jié)構(gòu)體及初始化函數(shù)來控制CAN的工作方式,提供了收發(fā)報(bào)文使用的結(jié)構(gòu)體及收發(fā)函數(shù),還有配置控制篩選器模式及ID的結(jié)構(gòu)體。
- 初始化結(jié)構(gòu)體:CAN_InitTypeDef
CAN_Prescaler: 本成員設(shè)置CAN外設(shè)的時(shí)鐘分頻,它可控制時(shí)間片Tq的時(shí)間長度,這里設(shè)置的值最終會(huì)減1后再寫入BRP寄存器位,即前面介紹的Tq計(jì)算公式:
T_q = (BRP[9:0]+1) x T_PCLK
等效于:T_q = CAN_Prescaler x T_PCLK
CAN_Mode: 本成員設(shè)置CAN的工作模式,可設(shè)置為正常模式(CAN_Mode_Normal)、回環(huán)模式(CAN_Mode_LoopBack)、靜默模式(CAN_Mode_Silent)以及回環(huán)靜默模式(CAN_Mode_Silent_LoopBack)。
CAN_SJW: 本成員可以配置SJW的極限長度,即CAN重新同步時(shí)單次可增加或縮短的最大長度,它可以被配置為1-4Tq(CAN_SJW_1/2/3/4tq)。
CAN_BS1:本成員用于設(shè)置CAN位時(shí)序中的BS1段的長度,它可以被配置為1-16個(gè)Tq長度(CAN_BS1_1/2/3…16tq)。
CAN_BS2: 本成員用于設(shè)置CAN位時(shí)序中的BS2段的長度,它可以被配置為1-8個(gè)Tq長度(CAN_BS2_1/2/3…8tq)。
SYNC_SEG、BS1段及BS2段的長度加起來即一個(gè)數(shù)據(jù)位的長度,即前面介紹的原來計(jì)算公式:
T_1bit =1T_q+T_S1+T_S2 =1+ (T_S1[3:0] + 1)+ (T_S2[2:0] + 1)
等效于:T_1bit = 1T_q+CAN_BS1+CAN_BS2
CAN_TTCM: 本成員用于設(shè)置是否使用時(shí)間觸發(fā)功能(ENABLE/DISABLE),時(shí)間觸發(fā)功能在某些CAN標(biāo)準(zhǔn)中會(huì)使用到。
CAN_ABOM: 本成員用于設(shè)置是否使用自動(dòng)離線管理(ENABLE/DISABLE),使用自動(dòng)離線管理可以在節(jié)點(diǎn)出錯(cuò)離線后適時(shí)自動(dòng)恢復(fù),不需要軟件干預(yù)。
CAN_ AWUM: 本成員用于設(shè)置是否使用自動(dòng)喚醒功能(ENABLE/DISABLE),使能自動(dòng)喚醒功能后它會(huì)在監(jiān)測到總線活動(dòng)后自動(dòng)喚醒。
CAN_NART: 本成員用于設(shè)置是否使用自動(dòng)重傳功能(ENABLE/DISABLE),使用自動(dòng)重傳功能時(shí),會(huì)一直發(fā)送報(bào)文直到成功為止。
CAN_RFLM: 本成員用于設(shè)置是否使用鎖定接收FIFO(ENABLE/DISABLE),鎖定接收FIFO后,若FIFO溢出時(shí)會(huì)丟棄新數(shù)據(jù),否則在FIFO溢出時(shí)以新數(shù)據(jù)覆蓋舊數(shù)據(jù)。
CAN_TXFP: 本成員用于設(shè)置發(fā)送報(bào)文的優(yōu)先級判定方法(ENABLE/DISABLE),使能時(shí),以報(bào)文存入發(fā)送郵箱的先后順序來發(fā)送,否則按照報(bào)文ID的優(yōu)先級來發(fā)送。
- 發(fā)送及接收結(jié)構(gòu)體:CanTxMsg及CanRxMsg
在發(fā)送或接收報(bào)文時(shí),需要往發(fā)送郵箱中寫入報(bào)文信息或從接收FIFO中讀取報(bào)文信息,利用STM32標(biāo)準(zhǔn)庫的發(fā)送及接收結(jié)構(gòu)體可以方便地完成這樣的工作。
StdId: 本成員存儲(chǔ)的是報(bào)文的11位標(biāo)準(zhǔn)標(biāo)識符,范圍是0-0x7FF。
ExtId: 本成員存儲(chǔ)的是報(bào)文的29位擴(kuò)展標(biāo)識符,范圍是0-0x1FFFFFFF。ExtId與StdId這兩個(gè)成員根據(jù)下面的IDE位配置,只有一個(gè)是有效的。
IDE: 本成員存儲(chǔ)的是擴(kuò)展標(biāo)志IDE位,當(dāng)它的值為宏CAN_ID_STD時(shí)表示本報(bào)文是標(biāo)準(zhǔn)幀,使用StdId成員存儲(chǔ)報(bào)文ID;當(dāng)它的值為宏CAN_ID_EXT時(shí)表示本報(bào)文是擴(kuò)展幀,使用ExtId成員存儲(chǔ)報(bào)文ID。
RTR: 本成員存儲(chǔ)的是報(bào)文類型標(biāo)志RTR位,當(dāng)它的值為宏CAN_RTR_Data時(shí)表示本報(bào)文是數(shù)據(jù)幀;當(dāng)它的值為宏CAN_RTR_Remote時(shí)表示本報(bào)文是遙控幀,由于遙控幀沒有數(shù)據(jù)段,所以當(dāng)報(bào)文是遙控幀時(shí),下面的Data[8]成員的內(nèi)容是無效的。
DLC: 本成員存儲(chǔ)的是數(shù)據(jù)幀數(shù)據(jù)段的長度,它的值的范圍是0-8,當(dāng)報(bào)文是遙控幀時(shí)DLC值為0。
Data[8]: 本成員存儲(chǔ)的就是數(shù)據(jù)幀中數(shù)據(jù)段的數(shù)據(jù)。
FMI: 本成員只存在于接收結(jié)構(gòu)體,它存儲(chǔ)了篩選器的編號,表示本報(bào)文是經(jīng)過哪個(gè)篩選器存儲(chǔ)進(jìn)接收FIFO的,可以用它簡化軟件處理。
CAN_FilterInitTypeDef當(dāng)需要使用CAN發(fā)送報(bào)文時(shí),先定義一個(gè)上面發(fā)送類型的結(jié)構(gòu)體,然后把報(bào)文的內(nèi)容按成員賦值到該結(jié)構(gòu)體中,最后調(diào)用庫函數(shù)CAN_Transmit把這些內(nèi)容寫入到發(fā)送郵箱即可把報(bào)文發(fā)送出去。
接收報(bào)文時(shí),通過檢測標(biāo)志位獲知接收FIFO的狀態(tài),若收到報(bào)文,可調(diào)用庫函數(shù)CAN_Receive把接收FIFO中的內(nèi)容讀取到預(yù)先定義的接收類型結(jié)構(gòu)體中,然后再訪問該結(jié)構(gòu)體即可利用報(bào)文。
- 篩選器結(jié)構(gòu)體:
CAN_FilterIdHigh: CAN_FilterIdHigh成員用于存儲(chǔ)要篩選的ID,若篩選器工作在32位模式,它存儲(chǔ)的是所篩選ID的高16位;若篩選器工作在16位模式,它存儲(chǔ)的就是一個(gè)完整的要篩選的ID。
CAN_FilterIdLow: 類似地,CAN_FilterIdLow成員也是用于存儲(chǔ)要篩選的ID,若篩選器工作在32位模式,它存儲(chǔ)的是所篩選ID的低16位;若篩選器工作在16位模式,它存儲(chǔ)的就是一個(gè)完整的要篩選的ID。
CAN_FilterMaskIdHigh: CAN_FilterMaskIdHigh存儲(chǔ)的內(nèi)容分兩種情況,當(dāng)篩選器工作在標(biāo)識符列表模式時(shí),它的功能與CAN_FilterIdHigh相同,都是存儲(chǔ)要篩選的ID;而當(dāng)篩選器工作在掩碼模式時(shí),它存儲(chǔ)的是CAN_FilterIdHigh成員對應(yīng)的掩碼,與CAN_FilterIdLow組成一組篩選器。
CAN_FilterMaskIdLow: 類似地,CAN_FilterMaskIdLow存儲(chǔ)的內(nèi)容也分兩種情況,當(dāng)篩選器工作在標(biāo)識符列表模式時(shí),它的功能與CAN_FilterIdLow相同,都是存儲(chǔ)要篩選的ID;而當(dāng)篩選器工作在掩碼模式時(shí),它存儲(chǔ)的是CAN_FilterIdLow成員對應(yīng)的掩碼,與CAN_FilterIdLow組成一組篩選器。
不同模式下各結(jié)構(gòu)體成員的內(nèi)容:
| 32位列表模式 | ID1的高16位 | ID1的低16位 | ID2的高16位 | ID2的低16位 |
| 16位列表模式 | ID1的完整數(shù)值 | ID2的完整數(shù)值 | ID3的完整數(shù)值 | ID4的完整數(shù)值 |
| 32位掩碼模式 | ID1的高16位 | ID1的低16位 | ID1掩碼的高16位 | ID1掩碼的低16位 |
| 16位掩碼模式 | ID1的完整數(shù)值 | ID2的完整數(shù)值 | ID1掩碼的完整數(shù)值 | ID2掩碼完整數(shù)值 |
CAN_FilterFIFOAssignment: 本成員用于設(shè)置當(dāng)報(bào)文通過篩選器的匹配后,該報(bào)文會(huì)被存儲(chǔ)到哪一個(gè)接收FIFO,它的可選值為FIFO0或FIFO1(宏CAN_Filter_FIFO0/1)。
CAN_FilterNumber: 本成員用于設(shè)置篩選器的編號,即本過濾器結(jié)構(gòu)體配置的是哪一組篩選器,CAN一共有28個(gè)篩選器,所以它的可輸入?yún)?shù)范圍為0-27。
CAN_FilterMode: 本成員用于設(shè)置篩選器的工作模式,可以設(shè)置為列表模式(宏CAN_FilterMode_IdList)及掩碼模式(宏CAN_FilterMode_IdMask)。
CAN_FilterScale: 本成員用于設(shè)置篩選器的尺度,可以設(shè)置為32位長(宏CAN_FilterScale_32bit)及16位長(宏CAN_FilterScale_16bit)。
CAN_FilterActivation: 本成員用于設(shè)置是否激活這個(gè)篩選器(宏ENABLE/DISABLE)。
總結(jié)
以上是生活随笔為你收集整理的《STM32从零开始学习历程》——CAN相关结构体的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mac OS X 安装 Nginx
- 下一篇: 硬盘分区进不去,右键属性显示raw的解决