日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2025/3/15 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CANopen | 移植01 - STM32H743 + Canfestival的移植并让FDCAN1运行CANopen协议 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 一、前言
  • 二、移植前的準(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)備


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

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。