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