日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

CANopen | 移植01 - STM32H743 + Canfestival的移植并让FDCAN1运行CANopen协议

發布時間:2025/3/15 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

二、移植前的準備


  • 移植CANopen協議之前,需要準備一個已經完成CAN底層驅動的工程。我是基于之前分享的工程上進行CANopen協議的移植的,所以需要下載該工程的代碼:
    STM32H743+CubeMX-雙路FDCAN同時工作的終極方案(裸機)
  • 下載我的提供的代碼。里面含我編寫的BSP與Canfestival的源碼與對象字典的文件,如下圖所示:

    這些文件的共享地址:
    鏈接: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协议的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。