STM32H743 | FDCAN 波特率問題

 

  直奔主題,最近項目上接觸了FDCAN,主控為STM32H743。在開發過程中存在疑點,特此記錄。

  疑點:芯片手冊上,波特率的相關寄存器位標明硬件將該值解析為編程值加 1,但是實際上通過STM32 HAL庫的HAL_FDCAN_Init()函數來初始化FDCAN時,我們給FDCAN初始化結構體的成員變量所賦的值並不是編程值,計算波特率時並不需要加1。

 

  • 一、 波特率計算

  CAN通訊的波特率計算方式為:

BaudRate = Tq *(SYNC_SEG + BS1 + BS2)

  其中 SYNC_SEG 段固定長度為 1Tq,而 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了。

 

 

Tags: