為了掌握如何設定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分...