直奔主題,最近項目上接觸了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) + (DTSEG2+1) + 1 ) * (DBPR + 1) )
但是,實際上,在使用官方的HAL庫進行開發時,很有可能會出現誤解。什么誤解呢?就是在配置CAN的通訊波特率時,我們可能會誤以為我們給FDCAN初始化結構體的成員變量所賦的值為編程值,即實際計算波特率時還需要加一。這樣的話,我們配置的波特率其實並不是你期望的值。
主要是因為在STM32 HAL庫的接口函數中,HAL_FDCAN_Init()函數內部已經做過了處理。做了什么處理呢?就是將我們給FDCAN初始化結構體的成員變量所賦的值減1后再給寄存器賦值,即通過STM32 HAL庫的HAL_FDCAN_Init()函數來配置波特率時,波特率的計算就不需要再進行加1了。
詳情請看文末HAL_FDCAN_Init()函數的處理部分代碼。
- 三、 STM32CubeMX代碼生成
以下就是在STM32CubeMx環境下初始化STM32H743片上外設FDCAN的簡略過程,主要為了更好地描述一下波特率問題。
-
1、先說明下FDCAN的時鍾配置,FDCAN的時鍾可由HSE、PLL1Q、PLL2Q提供,在此處我選擇用PLL1Q,時鍾頻率配置為80MHz
-
2、以下為在STM32CubeMX下配置FDCAN時Configuration窗口的相關配置。
通過上圖配置界面,我們很容易就能看出分頻Fre = 4,SEG1 = 15,SEG2 = 4,則所配置的波特率BaudRate = 80M / ( ( 1+ 15+ 4 ) * 4 ) = 1Mbps
-
3、通過STM32CubeMX生成的FDCAN初始化代碼
附:HAL_FDCAN_Init()內部減1處理的部分代碼圖:

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