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公司提出,主要用於汽車內部測量與控制中心之間的資料通訊。由於其良好的效能,在世界範圍內廣
STM32中CAN波特率的計算
車輛使用的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原因,也會引起接受節點同步跳轉寬度的調整。調整不好就容易出現錯誤。 取樣點在一
除a、button、input點擊後出現的藍色邊框
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 的ITM、DWT功能實現
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