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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

《STM32从零开始学习历程》——CAN相关结构体

發布時間:2024/1/1 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《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
typedef struct {uint16_t CAN_Prescaler; /*!< Specifies the length of a time quantum. It ranges from 1 to 1024. 配置CAN外設的時鐘分頻,可以設置為1-1024*/ uint8_t CAN_Mode; /*!< Specifies the CAN operating mode.This parameter can be a value of @ref CAN_operating_mode 配置CAN的工作模式,回環或正常模式*/uint8_t CAN_SJW; /*!< Specifies the maximum number of time quanta the CAN hardware is allowed to lengthen or shorten a bit to perform resynchronization.This parameter can be a value of @ref CAN_synchronisation_jump_width 配置SJW極限值*/uint8_t CAN_BS1; /*!< Specifies the number of time quanta in Bit Segment 1. This parameter can be a value of @ref CAN_time_quantum_in_bit_segment_1 配置BS1段長度*/uint8_t CAN_BS2; /*!< Specifies the number of time quanta in Bit Segment 2.This parameter can be a value of @ref CAN_time_quantum_in_bit_segment_2 配置BS2段長度*/FunctionalState CAN_TTCM; /*!< Enable or disable the time triggered communication mode.This parameter can be set either to ENABLE or DISABLE. 是否使能TTCM時間觸發功能*/FunctionalState CAN_ABOM; /*!< Enable or disable the automatic bus-off management.This parameter can be set either to ENABLE or DISABLE. 是否使能ABOM自動離線管理功能*/FunctionalState CAN_AWUM; /*!< Enable or disable the automatic wake-up mode. This parameter can be set either to ENABLE or DISABLE. 是否使能AWUM自動喚醒功能*/FunctionalState CAN_NART; /*!< Enable or disable the non-automatic retransmission mode.This parameter can be set either to ENABLE or DISABLE.是否使用NART自動重傳功能*/FunctionalState CAN_RFLM; /*!< Enable or disable the Receive FIFO Locked mode.This parameter can be set either to ENABLE or DISABLE.是否使能RELM鎖定FIFO功能 */FunctionalState CAN_TXFP; /*!< Enable or disable the transmit FIFO priority.This parameter can be set either to ENABLE or DISABLE. 配置TXFP報文優先級的判定方法*/ } 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
/** * @brief CAN Tx message structure definition */ typedef struct {uint32_t StdId; /*!< Specifies the standard identifier.This parameter can be a value between 0 to 0x7FF. 存儲報文的標準標識符11位,0-0x7FF*/uint32_t ExtId; /*!< Specifies the extended identifier.This parameter can be a value between 0 to 0x1FFFFFFF. 存儲報文的擴展標識符29位,0-0x1FFFFFFF*/uint8_t IDE; /*!< Specifies the type of identifier for the message that will be transmitted. This parameter can be a value of @ref CAN_identifier_type 存儲IDE擴展標志*/uint8_t RTR; /*!< Specifies the type of frame for the message that will be transmitted. This parameter can be a value of @ref CAN_remote_transmission_request 存儲RTR遠程幀標志*/uint8_t DLC; /*!< Specifies the length of the frame that will be transmitted. This parameter can be a value between 0 to 8 存儲報文數據段長度,0-8*/uint8_t Data[8]; /*!< Contains the data to be transmitted. It ranges from 0 to 0xFF. 存儲報文數據段的內容*/ } CanTxMsg;/** * @brief CAN Rx message structure definition */ typedef struct {uint32_t StdId; /*!< Specifies the standard identifier.This parameter can be a value between 0 to 0x7FF.存儲了報文的標準標識符11位,0-0x7FF */uint32_t ExtId; /*!< Specifies the extended identifier.This parameter can be a value between 0 to 0x1FFFFFFF. 存儲了報文的擴展標識符29位,0-0x1FFFFFFF*/uint8_t IDE; /*!< Specifies the type of identifier for the message that will be received. This parameter can be a value of @ref CAN_identifier_type 存儲了IDE擴展標志*/uint8_t RTR; /*!< Specifies the type of frame for the received message.This parameter can be a value of @ref CAN_remote_transmission_request 存儲了RTR遠程幀標志*/uint8_t DLC; /*!< Specifies the length of the frame that will be received.This parameter can be a value between 0 to 8 存儲了報文數據段的長度,0-8*/uint8_t Data[8]; /*!< Contains the data to be received. It ranges from 0 to 0xFF. 存儲了報文數據段的內容*/uint8_t FMI; /*!< Specifies the index of the filter the message stored in the mailbox passes through. This parameter can be a value between 0 to 0xFF 存儲了本報文是由經過篩選器存儲進FIFO的,0-0xFF*/ } 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中的內容讀取到預先定義的接收類型結構體中,然后再訪問該結構體即可利用報文。

  • 篩選器結構體:
/** * @brief CAN filter init structure definition*/ typedef struct {uint16_t CAN_FilterIdHigh; /*!< Specifies the filter identification number (MSBs for a 32-bitconfiguration, first one for a 16-bit configuration).This parameter can be a value between 0x0000 and 0xFFFF CAN_FxR1寄存器的高16位*/uint16_t CAN_FilterIdLow; /*!< Specifies the filter identification number (LSBs for a 32-bitconfiguration, second one for a 16-bit configuration).This parameter can be a value between 0x0000 and 0xFFFF CAN_FxR1寄存器的低16位*/uint16_t CAN_FilterMaskIdHigh; /*!< Specifies the filter mask number or identification number,according to the mode (MSBs for a 32-bit configuration,first one for a 16-bit configuration).This parameter can be a value between 0x0000 and 0xFFFF CAN_FxR2寄存器的高16位*/uint16_t CAN_FilterMaskIdLow; /*!< Specifies the filter mask number or identification number,according to the mode (LSBs for a 32-bit configuration,second one for a 16-bit configuration).This parameter can be a value between 0x0000 and 0xFFFF CAN_FxR2寄存器的低16位*/uint16_t CAN_FilterFIFOAssignment; /*!< Specifies the FIFO (0 or 1) which will be assigned to the filter.This parameter can be a value of @ref CAN_filter_FIFO 設置經過篩選后數據存儲到哪個接收FIFO*/uint8_t CAN_FilterNumber; /*!< Specifies the filter which will be initialized. 篩選器編號,范圍為0-27*/uint8_t CAN_FilterMode; /*!< Specifies the filter mode to be initialized.This parameter can be a value of @ref CAN_filter_mode 篩選器模式*/uint8_t CAN_FilterScale; /*!< Specifies the filter scale.This parameter can be a value of @ref CAN_filter_scale 設置篩選器的尺度*/FunctionalState CAN_FilterActivation; /*!< Enable or disable the filter.This parameter can be set either to ENABLE or DISABLE. 是否是能本篩選器*/ } CAN_FilterInitTypeDef;

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組成一組篩選器。

不同模式下各結構體成員的內容:

模式CAN_FilterIdHighCAN_FilterIdLowCAN_FilterMaskIdHighCAN_FilterMaskIdLow
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相关结构体的全部內容,希望文章能夠幫你解決所遇到的問題。

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