1. 程式人生 > >STM32 CAN 波特率、取樣點設定

STM32 CAN 波特率、取樣點設定

為了總結在STM32上設定CAN波特率和取樣點,所以整理自己的理解如下:

一,CAN波特率

1.CAN位時序


2.公式推導

這裡Tpclk理解成CAN時鐘的週期(實際上CAN使用APB1時鐘)

根據圖中公式有:

(1)  正常的位時間(Tnbt) = (1+Tbs1 + Tbs2)*Tq

(2)  Tq = (BRP+1)*Tpclk 

設CAN時鐘頻率為Fpclk,則有

(3)  Tq = (BRP+1)/Fpclk

由(1),(3)有:

(4)  Tnbt =(1+Tbs1 + Tbs2)* (BRP+1) / Fpclk

由(4)知CAN輸出波特率(Fcan = 1 / Tnbt )為:

Fcan = Fpclk / ( (1+Tbs1 + Tbs2)* (BRP[9:0]+1) )

3.程式配置

a.預備知識:

在stm32手冊中BTR暫存器內容如下:



公式:Fcan = Fpclk / ( (1+Tbs1 + Tbs2)* (BRP[9:0]+1) )結合上表有:

Fcan = Fpclk  / ( (1 + (TS1[3:0] + 1) + (TS2[2:0] + 1) ) * (BRP[9:0]+1))

在 stm32f10x.h中有:

    /*******************  Bit definition for CAN_BTR register  ********************/
#define  CAN_BTR_BRP                         ((uint32_t)0x000003FF)        /*!< Baud Rate Prescaler */
#define  CAN_BTR_TS1                         ((uint32_t)0x000F0000)        /*!< Time Segment 1 */
#define  CAN_BTR_TS2                         ((uint32_t)0x00700000)        /*!< Time Segment 2 */
#define  CAN_BTR_SJW                         ((uint32_t)0x03000000)        /*!< Resynchronization Jump Width */
#define  CAN_BTR_LBKM                        ((uint32_t)0x40000000)        /*!< Loop Back Mode (Debug) */
#define  CAN_BTR_SILM                        ((uint32_t)0x80000000)        /*!< Silent Mode */

在stm32f10x_can.h中有:

#define CAN_BS1_1tq                 ((uint8_t)0x00)  /*!< 1 time quantum */
#define CAN_BS1_2tq                 ((uint8_t)0x01)  /*!< 2 time quantum */

...

#define CAN_BS2_1tq                 ((uint8_t)0x00)  /*!< 1 time quantum */
#define CAN_BS2_2tq                 ((uint8_t)0x01)  /*!< 2 time quantum */

...

由上可知表示值比實際值大1,Tbs1 = Tq*(TS1[3:0] + 1) 等價於 Tbs1 = Tq*CAN_BS1_xtq,CAN_BS1_xtq即為表示值

在stm32f10x_can.c中CAN_Init介面中設定BTR部分有:

        /* Set the bit timing register */
        CANx->BTR = ( uint32_t )(( uint32_t )CAN_InitStruct->CAN_Mode << 30 ) | \
                    (( uint32_t )CAN_InitStruct->CAN_SJW << 24 ) | \
                    (( uint32_t )CAN_InitStruct->CAN_BS1 << 16 ) | \
                    (( uint32_t )CAN_InitStruct->CAN_BS2 << 20 ) | \
                    (( uint32_t )CAN_InitStruct->CAN_Prescaler - 1 );

由上邊程式碼可知BTR的BRP[9:0]的值為CAN_Prescaler - 1

從2中所推導的公式可知:

CAN波特率 = CAN時鐘/( (1 + CAN_BS1 + CAN_BS2)  * CAN_Prescaler)

舉個例子:

/* 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=DISABLE;

CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;

CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;

CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;

CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;

CAN_InitStructure.CAN_Prescaler=5;

CAN_Init(&CAN_InitStructure);100k

/* CAN cell init */CAN_Interrupt

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=DISABLE;

CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;

CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;

CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;

CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;

CAN_InitStructure.CAN_Prescaler=1;

CAN_Init(&CAN_InitStructure);//500k

如果CAN時鐘為8M, CAN_BS1 = 8,CAN_BS2 = 7,CAN_Prescaler = 5

那麼波特率就是=8M/(1+8+7)/5=100K

二,CAN取樣點

有上面可知得到相同的波特率  CAN_BS1,CAN_BS2會有多種組合,而取樣點由這2個引數確定,計算公式為:

sample = ( 1 +  CAN_BS1) /  (1 + CAN_BS1 CAN_BS2)

參看這篇文章,取樣點設定在80%到80.75%之間比較好。

參考資料:

 《ISO 11898-1-2003》

《STM32_RM_CH_V10_1》

相關推薦

STM32 CAN 波特率取樣設定

為了總結在STM32上設定CAN波特率和取樣點,所以整理自己的理解如下: 一,CAN波特率 1.CAN位時序 2.公式推導 這裡Tpclk理解成CAN時鐘的週期(實際上CAN使用APB1時鐘)

CAN取樣設定為多少合適?設定不對會咋樣?

The CAN bit is logically divided into four segments. The synchronization segment has always a length of 1 tq. The following propagation segment and phase

STM32 CAN 波特率的計算

STM32裡的CAN 支援2.0A,2.0B, 帶有FIFO,中斷等, 這裡主要提一下內部的時鐘應用. bxCAN掛接在APB1總線上,採用匯流排時鐘,所以我們需要知道APB1的匯流排時鐘是多少. 我們先看看下圖,看看APB1匯流排時鐘: APB1時鐘取自AHB的分頻, 

CAN通訊物理層(取樣大端小端)

        KEL15與KEL30存在電壓範圍的區別和功能上的區別:KEL30是指提供基本功能的供電電壓,功能很少:KEL15是指提供多功能的供電電壓。其中KEL15又稱:IG ON。        &nbs

【C語言實現串列埠通訊知識點整理(一)】執行緒開啟串列埠設定波特率設定校驗位互斥鎖等實現基本的通訊

  部分程式碼借鑑地址:https://blog.csdn.net/wangqingchuan92/article/details/73497354/ 謝謝! 1.建立執行緒線上程內進行串列埠之間的收發 void CREAT_pthread(void) { pthr

CAN波特率設定

通過對CAN位定時暫存器CANBIT以及CAN波特率預分頻擴充套件暫存器CANBRPE的設定可以得到需要的CAN通訊波特率。 CAN的位定時配置不當,將使得CAN模組無法按照目標波特率接入CAN網路,將導致CAN節點無法通訊正常。 根據CAN規範,位時間被分成4個時間段:同步段(Sync_Seg)、傳播時

STM32 CAN應用-過濾器設定

在使用STM32的CAN控制器進行資料收發,當用到位遮蔽模式的時候,就要設定過濾器了,這個關係到是否能夠接收到想要的資料。下面針對幾種不同情況對CAN過濾器(Filter)進行設定。CAN_FilterInitStructure.CAN_FilterMode = CAN_F

CAN波特率設定時的引數計算

作者:iamlaosong CAN(Controller Area Network)匯流排最早由德國 BOSCH公司提出,主要用於汽車內部測量與控制中心之間的資料通訊。由於其良好的效能,在世界範圍內廣

STM32CAN波特率的計算

車輛使用的250K 的波特率,使用STM32製作的控制板中的CAN波特率的計算 波特率=APB1Clock/(1+CAN_BS1+CAN_BS2)/CAN_Prescaler (PS:CAN_SJW表示重新同步跳躍寬度,不參與波特率的計算,其值可以程式設計為1到4個時間單

SSO單登入跨域重定向跨域設定Cookie京東單登入例項分析

最近在研究SSO單點登入技術,其中有一種就是通過js的跨域設定cookie來達到單點登入目的的,下面就已京東商城為例來解釋下跨域設定cookie的過程 涉及的關鍵知識點: 1、jquery ajax跨域重定向,要理ajax解跨域重定向,先要了解瀏覽器對重定向的處理。正常我們

CAN匯流排取樣測試

取樣點是什麼? 取樣點是接受節點判斷訊號邏輯的位置,CAN通訊屬於非同步通訊。需要通過不斷的重新同步才能保證收發節點的取樣準確。 若取樣點太靠前,則因為線纜原因,DUT外發報文尚未穩定,容易發生取樣錯誤,若取樣點太靠後,則因為SJW原因,也會引起接受節點同步跳轉寬度的調整。調整不好就容易出現錯誤。 取樣點在一

除abuttoninput擊後出現的藍色邊框

com only .cn tex 如何解決 align put spa http 在微網站上面如何去除a、button、input點擊後出現的藍色覆蓋層或者邊框 0 [待解決問題] 瀏覽: 2959次 a,button,input{ -webkit-tap-highligh

cocos2d JS 函數類型相互轉換(字符串整形布爾值)

賦值 defined 基數 bject 布爾 ring 浮點型 謝謝 val 工作忙好些天了,近段時間抽點空分享一下自己學習JS的一點筆記心得做點記錄,大神勿噴,謝謝! p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0

【Unity Shader】--- 準確認識SubShader語義塊結構渲染狀態設定Tags標簽

strong blend 渲染引擎 引擎 語法 always 加載 setup 使用 一【SubShader】   每個UnityShader文件可以包含多個SubShader語義塊,但至少要有一個。當Unity需要加載這個UnityShader時,Unity會掃描所有的S

A*算法導航網格路徑尋路對比(A-Star VS NavMesh VS WayPoint)

所有 -s mes 路徑 sta 常用 能夠 unity str 在Unity3d中,我們一般常用的尋路算法: 1.A*算法插件 與貪婪算法不一樣,貪婪算法適合動態規劃,尋找局部最優解,不保證最優解。A*是靜態網格中求解最短路最有效的方法。也是耗時的算法,不宜尋路頻

JMeter 參數化檢查集合(轉載)

準備 相同 test 多用戶 監聽器 助手 性能 之間 jmeter 參數化:簡單的來理解一下,我們錄制了一個腳本,這個腳本中有登錄操作,需要輸入用戶名和密碼,假如系統不允許相同的用戶名和密碼同時登錄,或者想更好的模擬多個用戶來登錄系統。 這個時候就需要對用戶名和密碼進行

STM32 的ITMDWT功能實現

rec span input div mce keil file color 事件 I.STM32 DWT時間戳功能實現  1.m3、m4實測可用。   2.精度:1/內核頻率(s)。   3.實現流程:     a.先使能DWT外設,由內核調試寄存器DEM_CR的位24

機器數的定點表示及階碼移碼

小型 機器數 由於 機器 專用 語言 基數 復雜 不同 一、定點表示法 定點,即小數點固定,固定在有效數位的最前面或最後面。因為位置是固定的,所以可以隱藏。 在最前面則表示純小數,在最後面則表示純整數,因此在定點計算機的編程語言中,純小數對應一種變量類型,純整數對應一種變量

求解關於直線的距離垂足對稱公式

表示 sdn 直線 long 絕對值 HA 方程 符號 求解 下面通過兩種直線方程的形式,求解點關於直線的距離、垂足、對稱點公式。 問題描述1: 已知點的坐標(x0,y0),直線的方程為Ax+By+C = 0; 求點到直線上的距離d、點在直線上的垂足(x, y)、點

JVM垃圾回收--年輕代年老和持久代

就會 為什麽 比例 生命 system 碎片 根據 請求 min 年輕代:   一般情況下,所有新生成的對象首先都是放在年輕代的。年輕代的目的就是盡可能快速的收集掉那些生命周期短的對象。年輕代分三個區。一個Eden區,兩個 Survivor區(分別叫from和to)Eden