can通訊的除錯不單是軟體上的除錯,也需要對硬體進行檢查。
在調通之前一直有兩個疑惑干擾判斷:(結論在文末)
1.不同的can晶元是否存在不相容。
2.不同型號的stm32是否can通訊是否存在差異。
stm32f1與stm32f4之間can通訊的除錯過程(僅以stm32f1作介紹[標準庫]):
1.確定引腳與資源
這裡我們使用pb8、pb9來作為can通訊引腳,微控制器上使用can1,注意更改引腳對映。
gpio_pinremapconfig(gpio_remap1_can1,enable);2.確定波特率我們需要得到的波特率為1mbps,使用者手冊上波特率的計算方法如下:
這裡看起來比較複雜,展開後為:baudrate=1/((brp[9:0]+1)*(1+ts1[3:0]+1+ts2[2:0] + 1)*tpclk);
由於can1掛在在apb1上,tpclk1為apb1的外設週期,需要知道其頻率fpclk1。
a.求取頻率
如果使用標準庫可以採用在main函式加兩行**:
rcc_clockstypedef get_rcc_clock;並在除錯介面中檢視(右鍵去掉勾選即可檢視10進製數)rcc_getclocksfreq(&get_rcc_clock);
pclk1為36mhz即apb1外設頻率為36mhz。
如使用cubemx生成**,可以方便檢視時鐘樹配置(強烈建議入門stm32的新人嘗試cubemx,可以直觀地理解stm32的時鐘樹)
b.設定波特率
在標準庫中can通訊初始化中有:
can_initstructure.can_sjw=can_sjw_1tq;其中sjw、bs1、bs2分別對應(brp[9:0]+1)、(ts[3:0]+1)、(ts2[3:0]+1);can_initstructure.can_bs1=can_bs1_9tq;
can_initstructure.can_bs2=can_bs2_8tq;
can_initstructure.can_prescaler=2;
當我們設定brp[9:0]為0時公式可以簡化為,baudrate=1/((1+ts[3:0]+1+ts2[2:0] + 1)*tpclk)=1/(1+bs1+bs2)/tpclk;(這就是為何sjw通常取can_sjw_1tq)
考慮分頻係數pre=fpclk1/fpclk,fpclk為can1的頻率:
baudrate=fpclk1/((1+bs1+bs2)*pre);前提sjw取can_sjw_1tq;
例如:系統主頻72mhz、apb1外設時鐘頻率fpclk1=32mhz,當我取sjw=can_sjw_1tq,bs1=can_bs1_9tq,bs2=can_bs2_8tq時baudrate=32/((1+9+8)*2)=1mhz;
關於疑惑:
由於stm32f1的板子是自己設計並選了新的can晶元(便宜),所以一開始會懷疑是can晶元的問題。如果兩個can都晶元支援我們所需求的波特率,實際上都能夠通訊的,問題在於我的兩個裝置can晶元都是5v供電,而我在除錯時其中乙個裝置直接使用偵錯程式3.3v供電,導致其無法正常工作,所以一直不能收發資訊。當然後來發現這個問題之後,使用電源同時給兩個裝置供電can通訊就成功了。
另乙個關於不同型號stm32無法進行can通訊的疑惑主要**於網上的某帖子,僅僅依據晶元主頻不一致而得出這樣的結論,完全是無稽之談。一般多個stm32之間can通訊,只要硬體沒問題,同時保證波特率一致,通訊上不會有太大問題。
STM32F4與STM32F1的區別
作為cortex m3市場的最大佔有者,st公司在2011年又推出基於cortex m4核心的stm32f4系列產品,相對與stm32f1 f2等cortex m3產品,stm32f4最大的優勢,就是新增了硬體fpu單元以及dsp指令,同時,stm32f4的主頻也提高了很多,達到168mhz 可獲得...
基於stm32f407建立stm32F427工程
分為三個部分 1.啟動檔案 2.fwilib 包含兩個資料夾inc和src。src裡面是stm32資源的c檔案,inc則是32資源的h檔案 3.user這也是我不太理解的部分 ddbugconfig只包含了用於debug的初始化,則是f4的系統檔案。我是在f407的基礎上改的 總的來說 1.改了晶元...
stm32f4 定時捕獲
概述 1000hz 20 80 占空比現象 1000hz 51 58 占空比現象 關於本文的更多詳情請往下看。筆者針對於初學者提供的例程都是去掉了許多不必要的功能,精簡了官方的 對初學者一看就明白,以簡單明瞭的工程供大家學習。stm32f4 tim輸入波形捕獲 脈衝頻率 占空比 例項 訪問密碼 st...