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