STM32H743 | FDCAN 波特率問題
直奔主題,最近項目上接觸了FDCAN,主控為STM32H743。在開發過程中存在疑點,特此記錄。
疑點:芯片手冊上,波特率的相關寄存器位標明硬件將該值解析為編程值加 1,但是實際上通過STM32 HAL庫的HAL_FDCAN_Init()函數來初始化FDCAN時,我們給FDCAN初始化結構體的成員變量所賦的值並不是編程值,計算波特率時並不需要加1。
- 一、 波特率計算
CAN通訊的波特率計算方式為:
BaudRate = Tq *(SYNC_SEG + BS1 + BS2)
- 二、 芯片手冊說明
在芯片手冊上,FDCAN_DBTP寄存器中,DBRP、DTSEG1、DTSEG2分別為時鐘分頻值、BS1 及 BS2 段的長度。對於以上寄存器值,硬件將該值解析為編程值加 1,也就是說,實際上我們在計算波特率時,需要將寄存器值加上1來進行計算,即
BaudRate = CLK / ( ( (DTSEG1+1) + (DTSEG1+1) + 1 ) * (DBPR + 1) )
但是,實際上,在使用官方的HAL庫進行開發時,很有可能會出現誤解。什麼誤解呢?就是在配置CAN的通訊波特率時,我們可能會誤以為我們給FDCAN初始化結構體的成員變量所賦的值為編程值,即實際計算波特率時還需要加一。這樣的話,我們配置的波特率其實並不是你期望的值。
主要是因為在STM32 HAL庫的接口函數中,HAL_FDCAN_Init()函數內部已經做過了處理。做了什麼處理呢?就是將我們給FDCAN初始化結構體的成員變量所賦的值減1後再給寄存器賦值,即通過STM32 HAL庫的HAL_FDCAN_Init()函數來配置波特率時,波特率的計算就不需要再進行加1了。
- 三、 STM32CubeMX代碼生成
以下就是在STM32CubeMx環境下初始化STM32H743片上外設FDCAN的簡略過程,主要說明以下波特率問題。
-
1、先說明下FDCAN的時鐘配置,FDCAN的時鐘可由HSE、PLL1Q、PLL2Q提供,在此處我選擇用PLL1Q,頻率為80MHz
-
2、以下為在STM32CubeMX下配置FDCAN時Configuration窗口的相關配置。
-
3、通過STM32CubeMX生成的FDCAN初始化代碼
- HAL_FDCAN_Init()內部處理部分
HAL_StatusTypeDef HAL_FDCAN_Init(FDCAN_HandleTypeDef *hfdcan)

從上圖可以看出,STM32 HAL庫的HAL_FDCAN_Init()函數內部已經做過了處理,在給寄存器位賦值之前就將已經我們給FDCAN初始化結構體的成員變量所賦的值減1了。