STM32之CAN 配置波特率

2021-07-22 03:51:27 字數 2898 閱讀 8122

為了掌握如何設定stm32 can的波特率,首先我們得先了解一下位時間特性。

位時間特性邏輯通過取樣來監視序列的can匯流排,並且通過跟幀起始位的邊沿進行同步,及通過跟後面的邊沿進行重新同步,來調整其取樣點。

它的操作可以簡單解釋為,如下所述把名義上的每位的時間分為3段:

● 同步段(sync_seg):通常期望位的變化發生在該時間段內。其值固定為1個時間單元(1 x tcan)。

● 時間段1(bs1):定義取樣點的位置。它包含can標準裡的prop_seg和phase_seg1。其值可以程式設計為1到16個時間單元,但也可以被自動延長,以補償因為網路中不同節點的頻率差異所造成的相位的正向漂移。

● 時間段2(bs2):定義傳送點的位置。它代表can標準裡的phase_seg2。其值可以程式設計為1到8個時間單元,但也可以被自動縮短以補償相位的負向漂移。

● 重新同步跳躍寬度(sjw):定義了在每位中可以延長或縮短多少個時間單元的上限。其值可以程式設計為1到4個時間單元。

● 有效跳變:被定義為,當bxcan自己沒有傳送隱性位時,從顯性位到隱性位的第1次轉變。

如果在時間段1(bs1)而不是在同步段(sync_seg)檢測到有效跳變,那麼bs1的時間就被延長最多sjw那麼長,從而取樣點被延遲了。相反如果在時間段2(bs2)而不是在sync_seg檢測到有效跳變,那麼bs2的時間就被縮短最多sjw那麼長,從而取樣點被提前了。為了避免軟體的程式設計錯誤,對位時間特性暫存器(can_btr)的設定,只能在bxcan處於初始化狀態下進行。

注: 關於can位時間特性和重同步機制的詳細資訊,請參考iso11898標準。

圖1

特別注意上圖下方的幾個公式.可以得出的結論是:

can波特率=apb匯流排頻率/brp分頻器/(1+tbs1+tbs2)

can位時間特性暫存器 (can_btr)

圖2

位31silm: 靜默模式(用於除錯)

0: 正常狀態;

1: 靜默模式。

位30lbkm: 環迴模式(用於除錯)

0: 禁止環迴模式;

1: 允許環迴模式。

位29:26

保留位,硬體強制為0。

位25:24

sjw[1:0]: 重新同步跳躍寬度

為了重新同步,該位域定義了can硬體在每位中可以延長或縮短多少個時間單元的上限。

trjw = tcan x (sjw[1:0] + 1)。

位23保留位,硬體強制為0。

位22:20

ts2[2:0]: 時間段2

該位域定義了時間段2占用了多少個時間單元

tbs2 = tcan x (ts2[2:0] + 1)。

位19:16

ts1[3:0]: 時間段1

該位域定義了時間段1占用了多少個時間單元

tbs1 = tcan x (ts1[3:0] + 1)

位15:10

保留位,硬體強制其值為0。

位9:0

brp[9:0]: 波特率分頻器

該位域定義了時間單元(tq)的時間長度

tq = (brp[9:0]+1) x tpclk

配置波特率是在can模組初始化時配置,**示例如下:

[cpp]view plain

copy

//can1 register init 

can_deinit(can1);  

can_structinit(&can_initstructure);  

//can cell init 

can_initstructure.can_ttcm = disable;   

can_initstructure.can_abom = disable;  

can_initstructure.can_awum = disable;   

can_initstructure.can_nart = disable;   

can_initstructure.can_rflm = disable;   

can_initstructure.can_txfp = enable;   

can_initstructure.can_mode = can_mode_normal;   

can_initstructure.can_sjw = can_sjw_1tq;   

can_initstructure.can_bs1 = can_bs1_6tq; //tbs1=6個tcan時鐘週期

can_initstructure.can_bs2 = can_bs2_8tq; //tbs2=8個tcan時鐘週期

can_initstructure.can_prescaler = 4; //abp匯流排時鐘時鐘4分頻

//canbps= fpclk/((brp+1)*((tseg1+1)+(tseg2+1)+1)  

//所以這裡canbps=apb1匯流排頻率30000000/4/(8+6+1))=500k bps

//總體配置方向: tseg1>=tseg2  tseg2>=tq; tseg2>=2tsjw    

if (can_init(can1,&can_initstructure) == caninitfailed)           

can_itconfig(can1,can_it_fmp0, enable);//開啟fmp0中斷

總體配置保持tbs1>=tbs2 tbs2>=1個can時鐘週期  tbs2>=2tsjw

參考文章:

STM32之CAN 配置波特率

為了掌握如何設定stm32 can的波特率,首先我們得先了解一下位時間特性。位時間特性邏輯通過取樣來監視序列的can匯流排,並且通過跟幀起始位的邊沿進行同步,及通過跟後面的邊沿進行重新同步,來調整其取樣點。它的操作可以簡單解釋為,如下所述把名義上的每位的時間分為3段 同步段 sync seg 通常期...

STM32之CAN 配置波特率

為了掌握如何設定stm32 can的波特率,首先我們得先了解一下位時間特性。位時間特性邏輯通過取樣來監視序列的can匯流排,並且通過跟幀起始位的邊沿進行同步,及通過跟後面的邊沿進行重新同步,來調整其取樣點。它的操作可以簡單解釋為,如下所述把名義上的每位的時間分為3段 同步段 sync seg 通常期...

STM32波特率設定

usart1的波特率公式 baud rate fck 16 usartdiv usartdiv fck 16 baud rate 然後按下述方法計算,例如匯流排時鐘頻率為72mhz,配置波特率為9600過程如下 求得 usartdiv 468.75,因為stm32的波特比率暫存器usart brr分...