CANopen | 移植01 - STM32H743 + Canfestival的移植并让FDCAN1运行CANopen协议
文章目錄
- 一、前言
- 二、移植前的準(zhǔn)備
- 三、移植
- 3.0、移植的目的
- 3.1、工程的實(shí)際硬盤上添加文件夾
- 3.2、往bsp文件夾放入bsp代碼
- 3.3、往canfestival里放入源代碼
- 3.4、往obj_dir里放入代碼
- 3.5、在工程上添加文件canfestival,obj_dir,bsp三個文件夾
- 3.6、在工程里添加各個文件的代碼
- 3.7、添加include的路徑
- 四、定時器
- 4.1、TIM17
- 五、代碼
- 5.1、bsp_canopen_timer.h
- 5.2、main.c
- 5.3、bsp_fdcan.c
- 5.4、回到main.c
- 5.5、重定向printf
- 六、調(diào)試
- 6.1、Debug(printf)Viewer
- 6.1、CAN分析儀調(diào)試
- 七、細(xì)節(jié)補(bǔ)充
- 7.1、將CANopen從站的Node_ID改為0x05
一、前言
本博文的目的是用我弄好的BSP,直接往STM32工程里加入代碼就能簡單并快速地完成CANopen協(xié)議的移植。
剛開始研究“如何在STM32上實(shí)現(xiàn)CANopen協(xié)議”時注意到廣州硬石科技的教程。這個教程我建議同學(xué)們一定要學(xué)習(xí)一下,移植Canfestival的流程我記得是沒問題的。如下圖所示:
硬石教程給Canfestival設(shè)計的定時器的代碼在實(shí)現(xiàn)上有問題,說白了就是“定時不準(zhǔn)。先不說硬石實(shí)現(xiàn)方法復(fù)雜(使用定時器的比較中斷實(shí)現(xiàn)定時器中斷),而且從我測試報文的時間間隔看來是有誤差的(尤其在幾個ms的時候)。所以,移植可以從硬石教程上學(xué)習(xí),但是定時器的實(shí)現(xiàn)最好使用我這篇博文的方法。其實(shí),我也是參考別人的文章,并走了不少彎路后才總結(jié)出來的。經(jīng)過us級的定時器事件證明我的方法是可行的。
我使用的硬件:
工程代碼:
鏈接:https://pan.baidu.com/s/1sPBxyKjswpcro1TmEIIiKw
提取碼:i42i
二、移植前的準(zhǔn)備
STM32H743+CubeMX-雙路FDCAN同時工作的終極方案(裸機(jī))
這些文件的共享地址:
鏈接:https://pan.baidu.com/s/10c05VtPURW4YWGYWKX1pcA
提取碼:1uwt
三、移植
3.0、移植的目的
在開發(fā)板的FDCAN1接口上實(shí)現(xiàn)CANopen從站。當(dāng)然,我編寫的這個bsp已經(jīng)預(yù)留了FDCAN2也能實(shí)現(xiàn)CANopen從站或者主站。一般情況下,開發(fā)板只需一個FDCAN口實(shí)現(xiàn)CANopen。
3.1、工程的實(shí)際硬盤上添加文件夾
3.2、往bsp文件夾放入bsp代碼
3.3、往canfestival里放入源代碼
3.4、往obj_dir里放入代碼
3.5、在工程上添加文件canfestival,obj_dir,bsp三個文件夾
3.6、在工程里添加各個文件的代碼
特別注意一下的是,文件夾canfestival/Inc/STM32里的頭文件也必須添加,如下圖所示:
3.7、添加include的路徑
在Keil的工程上添加完工程后,需要繼續(xù)添加include Paths,不然會出現(xiàn)找不到”啥啥頭文件“的情況。
四、定時器
4.1、TIM17
選擇TIM17的原因是canfestival只需要一個簡單的定時器,會產(chǎn)生定時器溢出中斷即可,所以沒必要占用其他高級定時器。
配置240-1分頻的原因是TIM17掛載在APB2時鐘總線上,APB2的時鐘頻率是240M,所以需要將此定時器進(jìn)行1/240分頻,讓定時器的工作頻率為1M。
接著,生成并編譯代碼。出現(xiàn)4個Error(s),5個Warning(s),但先不用管它。
五、代碼
5.1、bsp_canopen_timer.h
在bsp_canopen_timer.h里告訴canfestival,我給它提供了TIM17定時器。
接著,編譯代碼后發(fā)現(xiàn)0 Error(s)里,還有5個Warning(s)。
其內(nèi)容如下,在sdo.c文件里,我是不管這個警告的,在實(shí)踐中也沒有發(fā)現(xiàn)SDO有問題,可能是編譯器原因吧。反正,不用管這5個警告,不會影響canfestival的使用。
再重新編譯一次,就會出現(xiàn)0 Error(s),0 Warning(s).
5.2、main.c
函數(shù)HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)是HAL庫的定時器中斷回調(diào)函數(shù),在main.c里調(diào)用。
TIM17是提供給Canfestival的,所以在TIM17的中斷回調(diào)里調(diào)用TIMx_DispatchFromISR()。
5.3、bsp_fdcan.c
首先包含兩個頭文件:
因為只在FDCAN1接口上實(shí)現(xiàn)CANopen協(xié)議,所以在FDCAN的RX FIFO0的中斷回調(diào)函數(shù)HAL_FDCAN_RxFifo0Callback()調(diào)用canfestival的接收函數(shù)canDispatch()。
5.4、回到main.c
接著,編譯代碼:
5.5、重定向printf
我的bsp代碼里面有很多printf,所以一定要實(shí)現(xiàn)printf,否則單片機(jī)系統(tǒng)會跑飛。實(shí)現(xiàn)printf有很多種方法。我使用Keil自帶的EventRecorder實(shí)現(xiàn)printf。
還是回到main.c
編譯代碼,下載代碼到開發(fā)板子上。
六、調(diào)試
6.1、Debug(printf)Viewer
在這里調(diào)試窗口,可以看到printf的信息。
6.1、CAN分析儀調(diào)試
至此,FDCAN1已經(jīng)運(yùn)行CANopen協(xié)議了!!!!
七、細(xì)節(jié)補(bǔ)充
7.1、將CANopen從站的Node_ID改為0x05
一般情況,CANopen從站的Node_ID不能設(shè)為0x01,0x01最好留給CANopen主站使用。
修改代碼,編譯與下載代碼后,從CAN分析儀觀察報文。
總結(jié)
以上是生活随笔為你收集整理的CANopen | 移植01 - STM32H743 + Canfestival的移植并让FDCAN1运行CANopen协议的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32H743+CubeMX-定时器
- 下一篇: 水晶报表设置二维码_随时随地数据分析?老