1. 程式人生 > >STM32 CAN 波特率的計算

STM32 CAN 波特率的計算

STM32裡的CAN 支援2.0A,2.0B, 帶有FIFO,中斷等這裡主要提一下內部的時鐘應用.

bxCAN掛接在APB1總線上,採用匯流排時鐘,所以我們需要知道APB1的匯流排時鐘是多少我們先看看下圖,看看APB1匯流排時鐘:

APB1時鐘取自AHB的分頻AHB又取自系統時鐘的分頻系統時鐘可選HSI,HSE, PLLCLK, 這個在例程的RC設定裡都有的,

然後再看看有了APB1的時鐘後,如何算CAN的匯流排速率先看下圖:

有了上邊的這個圖,基本就清楚了.

                       匯流排時鐘MHz   (3+TS1+TS2)*(BRP+1)

===================================================

下面是我的計算:

CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq; 

注意//#define CAN_BS1_3tq                 ((uint8_t)0x02) /*!< 3 time quantum */CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;CAN_InitStructure.CAN_Prescaler = 4;//2nominal bit time3+5+1tq=9tq關於分頻係數 檢視 system_stm32f10x.c

下面的static void SetSysClockTo72(void) 函式/* HCLK = SYSCLK *//* PCLK2 = HCLK *//* PCLK1 = HCLK/2 */

所以can時鐘 72MHZ/2/4=9 Mhztq=1/36Mhz波特率為 1/nominal bit time= 9/9=1MHZ

=========================================

-----------------------------------------------

              ====================================================

void CAN_Configuration(void) CAN_InitTypeDef         CAN_InitStructure; CAN_FilterInitTypeDef   CAN_FilterInitStructure; /* CAN register init */ CAN_DeInit(); 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=DISABLE; CAN_InitStructure.CAN_Mode=CAN_Mode_Normal; CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_9tq; CAN_InitStructure.CAN_BS2=CAN_BS2_8tq; CAN_InitStructure.CAN_Prescaler=200; CAN_Init(&CAN_InitStructure); /* CAN filter init */ CAN_FilterInitStructure.CAN_FilterNumber=0; CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0; CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); 注意//#define CAN_BS1_3tq                 ((uint8_t)0x02) /*!< 3 time quantum */撥特率10K,公式:72MHZ/2/200/1+9+8=0.0110K,和SJA1000測試通

================================================

120歐姆電阻要加上!!! 

確實是       CAN->BTR = (u32)((u32)CAN_InitStruct->CAN_Mode << 30) | ((u32)CAN_InitStruct->CAN_SJW << 24) |                 ((u32)CAN_InitStruct->CAN_BS1 << 16) | ((u32)CAN_InitStruct->CAN_BS2 << 20) |                 ((u32)CAN_InitStruct->CAN_Prescaler - 1);    總結一下    Fpclk=36M 時 can波特率為250k   的配置為 /* 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=9;    CAN_Init(&CAN_InitStructure); 250k 

======================================

的:將can匯流排波特率設定為250k  在官方的can例程上 給出了100k 查詢 和500k 中斷方式的例子 分別設定如下:    CAN_Polling:    /* 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時鐘是RCC_APB1PeriphClock,你要注意CAN時鐘頻率 CAN波特率 = RCC_APB1PeriphClock/CAN_SJW+CAN_BS1+CAN_BS2/CAN_Prescaler; 如果CAN時鐘為8M, CAN_SJW = 1CAN_BS1 = 8CAN_BS2 = 7CAN_Prescaler = 2 那麼波特率就是=8M/(1+8+7)/2=250K 

=========================================

得到500Kb/s的波特率

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;每一位的Tq數目 = 1 (固定SYNC_SEG) +   8 (BS1) + 7 (BS2) = 16如果CAN時鐘是 8 MHz : (8M / 1 ) / 16 = 500K其中:為分頻係數16 為每一位的Tq數目為了設定為 100K, 把分頻係數改為5即可, BS1 BS2 不變每一位的Tq數目 = 1 (固定) +   8 (BS1) + 7 (BS2) = 16如果CAN時鐘是 8 MHz : (8M / 5 ) / 16 = 100K如果想得到 1M 的波特率, CAN時鐘仍然是 8 MHz的情況下, 分頻係數不變應該改變 BS1 BS2CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;每一位的Tq數目 = 1 (固定) +   5 (BS1) + 2 (BS2) = 8如果CAN時鐘是 8 MHz : (8M / 1 ) / 8 = 1000K另外儘可能的把取樣點設定為 CiA 推薦的值:75%      when 波特率 > 800K80%      when 波特率 > 500K87.5%    when 波特率 <= 500K所以對於 100K 的波特率(假定使用 8MHz 時鐘) 可以修改該BS1 BS2 為:CAN_InitStructure.CAN_Prescaler=5;CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+13) / (1+13+2) = 87.5%所以對於 500K 的波特率(假定使用 8MHz 時鐘) 可以修改該BS1 BS2 為:CAN_InitStructure.CAN_Prescaler=1;CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+13) / (1+13+2) = 87.5%所以對於 1000K 的波特率(假定使用 8MHz 時鐘) 可以修改該BS1 BS2 為:CAN_InitStructure.CAN_Prescaler=1;CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+5) / (1+5+2) = 75%個人見解僅供參考。 

上邊這個公式算出來的就是CAN的速率了

相關推薦

STM32 CAN 波特率計算

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

飛思卡爾s12系列CAN波特率計算

最近在看飛思卡爾s12系列CAN部分,發現波特率計算這塊沒有一個講的詳細的,在資料手冊裡也沒有詳細說明。 經過仔細研究,特將CAN部分波特率計算總結出來。 引用部分CAN波特率計算資料如下: 簡單介紹一個波特率的計算,在CAN的底層協議裡將CAN資料的每一位時間

STM32 CAN 波特率、取樣點設定

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

STM32CAN波特率計算

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

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

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

8051單片機串口波特率計算方式

計算公式 波特率 post 12c mod 計算 log 系統 時鐘頻率   STC12C5A60S2單片機兼容80C51單片機,其串口波特率可以由定時器產生,也可以由獨立波特率發生器產生。其波特率模式可以是固定的,也可以是可變的。   固定波特率:當 模式0的通信速度設置

CAN波特率設定

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

STM32 -> DWT時間計算

基於ARM-M3核心的DWT 資料監測暫存器: dwt.c檔案 #include "dwt.h" #define DWT_CR *(uint32_t *)0xE0001000 #define DWT_CYCCNT *(uint32_t *)0xE0001004 #d

適合初學者的STM32 CAN協議理解總結( ISO11898 標準)

暑假學習的時候看到了CAN匯流排,幾個小夥伴好像看的都比較苦惱。是的,對於大量的說明難免有些不想看,看不懂為什麼要把TIM這些東西設為1,很多字元又代表什麼意思......但對知識的畏懼是無法向前的。靜下心來慢慢看就好了!我在這裡記錄一些我學習CAN協議過程中的理解總結,希望

stm32CAN波特率計算小程式(QT原始碼)

軟體:Qt Creator 開發環境:Window7 用qt做得一個計算波特率的小程式,在實際的應用中我們設定波特率的時候是通過以下引數來定的: CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStr

stm32 CAN過濾器組

在互聯型產品中, CAN1和CAN2分享28個過濾器組 其它STM32F103xx系列產品中有14個過濾器組 位寬設定 四種配置方式: 1個32位的遮蔽位模式 2個32位的識別符號列表模式,可以過濾2個識別符號id

STM32 CAN應用-過濾器設定

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

微控制器串列埠通訊波特率計算

在模式0和模式2下,串列埠波特率固定,模式0為Fosc/12。模式2為Fosc/32或Fosc/64,具體由PCON暫存器的SMOD位決定。 在模式1和模式3下,波特率是一個可變值,波特率可以由定時器1產生(8052可以由定時2產生),那麼波特率到底為多少呢?波特率由定

CAN波特率與負載率

https://wenku.baidu.com/view/1f3ebacbb9f67c1cfad6195f312b3169a451eaa8.html 1、背景說明: 1.1為了講清這個問題,需要先就兩個概念進行說明:波特率和位元率。 波特率:單位時間內,通訊通道傳輸碼元的速

STM32的CRC計算

 CRC計算  CRC校驗僅用於保證全雙工通訊的可靠性。資料傳送和資料接收分別使用單獨的CRC計算器。 通過對每一個接收位進行可程式設計的多項式運算來計算CRC。CRC的計算是在由SPI_CR1暫存器 中CPHA和CPOL位定義的取樣時鐘邊沿進行的。  注意:   該SPI

STM32 CAN匯流排識別符號過濾器難點解析

CAN匯流排是目前應用非常多的一種匯流排,在汽車電子,航空航天中應用廣泛,博主用的是戰艦的STM32開發板。CAN的介紹和功能特點就不講了,書本上網上都有,請大家在閱讀本文前瞭解CAN匯流排協議的特點

STM32 CAN 使用心得!

1.CAN最大的優點是可以實現多機通訊,適合工業控制組網的應用,有專門的PCI板卡可以將CAN連線的PC機上,對網路監控 2.CAN匯流排出了電源線之外就是CANH和CANL兩個線,CAN對總線上點評的解析靠這兩根線同時完成,即時 CAN總線上的電平分為隱形和現行

STM32微控制器的串列埠通訊波特率應該這樣計算~

1什麼是波特率不管是什麼微控制器,在使用串列埠通訊的時候,有一個非常重要的引數:波特率。什麼是波

STM32下調試CAN通信

mas 結構 bits source ant pen eset disable sca 基本流程: 1、初始化CAN模塊: 啟用CAN時鐘 配置CAN功能寄存器(包括位定時,分頻等等) 配置CAN過濾器 打開中斷 2、初始化I/O口

STM32定時器輸出PWM頻率和步進電機控制速度計算

內部 定時 .cn 但是 nbsp 返回 定時器 開發 r12 1、STM32F4系列定時器輸出PWM頻率計算 第一步,了解定時器的時鐘多少:   我們知道AHP總線是168Mhz的頻率,而APB1和APB2都是掛在AHP總線上的。 (1)高級定時器timer1, time