前情提要
最近計劃開始做一個無刷電機的小車玩玩,不用網上的現有方案,一切從零開始自己做方案。硬件方案打算用GD32E503和EG2134柵極驅動IC等一系列國產器件去做,這樣就面臨一個問題,不太好用Arduino跑SimpleFOC快速出原型。所以軟件方案想基于RTT開發,這樣只需移植一些硬件驅動和FOC以及卡爾曼濾波等算法,其它的很多功能還是可以用RThread組件實現的,總不能所有輪子都自己造,畢竟玩這個小車的目的也只是想深入玩玩這些控制算法。這個小車的整個開發周期可能會很長,至少是以年為度量單位的,第一是因為工作比較忙,只能用一些零散時間搞,第二是因為計劃用到什么學什么,有意思的地方都深入的研究研究,不以速成為目的。整個開發過程也都記錄一下,圖文形式的記錄可能會在RTThread論壇進行記錄,視頻形式的記錄就發布在B站上,希望有興趣的小伙伴也可以一起玩一玩哈。
前期工作
前段時間,大概花了一周的時間已經把第一版測試用的硬件電路和機械結構設計完畢,如下是硬件電路的3D視圖。
如下是三輪小車形態的車底盤3D渲染圖:
下圖是平衡車形態的車底盤3D渲染圖:
下圖為二階平衡車形態的車底盤3D渲染圖:
目前第一版的硬件測試電路已焊接完畢,第一版測試小車也完成了組裝,下圖是剛組裝起來的平衡車形態的無刷電機小車,就計劃先拿它開刀了,其它形態后面再慢慢玩。小車還算小巧,等測試通過后計劃再做一版集成度更高更小巧的玩玩。
千里之行始于創建BSP
一切就緒,準備開始擼程序了,那遇到的第一個問題就是目前RTThread的BSP內并沒有我想用的這款GD32E503的處理器(用這款處理器是想玩一玩它的三角函數加速器,有硬件計算電路,就不用查詢法去計算三角函數了,感覺跑FOC會舒服很多)。所以第一步就是要學習一下添加自己的BSP了。
下載GD32E503固件庫和RTT源碼包
做BSP的第一步,自然是下載RTThread源碼和GD32E503的固件庫了。目前RTThread的穩定發行版應該是4.1.0,但我這里只是玩玩,對穩定度要求不高,果斷去碼云上下載了最新的master版本,目前的版本是5.0.1:
1/*RT-Threadversioninformation*/ 2#defineRT_VERSION_MAJOR5/** 3#defineRT_VERSION_MINOR0/** 4#defineRT_VERSION_PATCH1/**
GD32E503的固件庫包含在開發板Demo資料里,最新版本是V1.2.2:
添加GD32E503器件到MDK
GD32E50x的AddOn資源包,目前最新版本是1.3.3,如果還沒有安裝MDK需要先安裝一下MDK,這里不做過多表述,然后再安裝AddOn資源包內的兩個”.pack”文件(也可以只安裝E50x版本的):
如下圖所示,MDK內的DeviceDatabase內能找到GD32E50x系列的器件列表,證明資源包安裝成功。
添加libraries
拷貝固件庫到BSP的libraries目錄內
解壓RTT源碼包和固件庫壓縮包,先拷貝固件庫的”GD32E50x_Firmware_Library”文件夾到RTT源碼包的”bsp/gd32/arm/libraries/“路徑下:
修改libraries目錄內的配置文件
這里可以看到libraries目錄下還有兩個配置文件“Kconfig”和“.ignore_format.yml”,Kconfig文件后面用menuconfig或RTthreadStudio IDE去配置肯定會用到,另外一個文件暫時不知道什么用途,但不妨一起修改了,Kconfig文件修改如下(文檔末尾添加GD32E5的配置信息):
1configSOC_FAMILY_GD32 2bool 3configSOC_SERIES_GD32F1 4bool 5selectARCH_ARM_CORTEX_M3 6selectSOC_FAMILY_GD32 7configSOC_SERIES_GD32F2 8bool 9selectARCH_ARM_CORTEX_M3 10selectSOC_FAMILY_GD32 11configSOC_SERIES_GD32F3 12bool 13selectARCH_ARM_CORTEX_M4 14selectSOC_FAMILY_GD32 15configSOC_SERIES_GD32F4 16bool 17selectARCH_ARM_CORTEX_M4 18selectSOC_FAMILY_GD32 19configSOC_SERIES_GD32E5#addbycjl 20bool 21selectARCH_ARM_CORTEX_M33 22selectSOC_FAMILY_GD32
“.yml”文件把GD32E50x的固件庫路徑名添加到數組末尾:
1dir_path: 2-GD32F10x_Firmware_Library 3-GD32F20x_Firmware_Library 4-GD32F30x_Firmware_Library 5-GD32F4xx_Firmware_Library 6-GD32E50x_Firmware_Library
給固件庫添加SConscript構建配置文件
從其它固件庫文件內(我用的F4xx)拷貝一份”SConscript”文件到新加入的固件庫路徑內:
1importrtconfig 2frombuildingimport* 3#getcurrentdirectory 4cwd=GetCurrentDir() 5#ThesetofsourcefilesassociatedwiththisSConscriptfile. 6src=Split(''' 7CMSIS/GD/GD32E50x/Source/system_gd32e50x.c 8GD32E50x_standard_peripheral/Source/gd32e50x_gpio.c 9GD32E50x_standard_peripheral/Source/gd32e50x_rcu.c 10GD32E50x_standard_peripheral/Source/gd32e50x_exti.c 11GD32E50x_standard_peripheral/Source/gd32e50x_misc.c 12''') 13#remove:GD32E50x_standard_peripheral/Source/gd32e50x_syscfg.c 14ifGetDepend(['RT_USING_SERIAL']): 15src+=['GD32E50x_standard_peripheral/Source/gd32e50x_usart.c'] 16ifGetDepend(['RT_USING_I2C']): 17src+=['GD32E50x_standard_peripheral/Source/gd32e50x_i2c.c'] 18ifGetDepend(['RT_USING_SPI']): 19src+=['GD32E50x_standard_peripheral/Source/gd32e50x_spi.c'] 20ifGetDepend(['RT_USING_CAN']): 21src+=['GD32E50x_standard_peripheral/Source/gd32e50x_can.c'] 22ifGetDepend(['BSP_USING_ETH']): 23src+=['GD32E50x_standard_peripheral/Source/gd32e50x_enet.c'] 24ifGetDepend(['RT_USING_ADC']): 25src+=['GD32E50x_standard_peripheral/Source/gd32e50x_adc.c'] 26ifGetDepend(['RT_USING_DAC']): 27src+=['GD32E50x_standard_peripheral/Source/gd32e50x_dac.c'] 28ifGetDepend(['RT_USING_RTC']): 29src+=['GD32E50x_standard_peripheral/Source/gd32e50x_rtc.c'] 30src+=['GD32E50x_standard_peripheral/Source/gd32e50x_pmu.c'] 31ifGetDepend(['RT_USING_WDT']): 32src+=['GD32E50x_standard_peripheral/Source/gd32e50x_wwdgt.c'] 33src+=['GD32E50x_standard_peripheral/Source/gd32e50x_fwdgt.c'] 34ifGetDepend(['RT_USING_SDIO']): 35src+=['GD32E50x_standard_peripheral/Source/gd32e50x_sdio.c'] 36src+=['GD32E50x_standard_peripheral/Source/gd32e50x_dma.c'] 37path=[ 38cwd+'/CMSIS/GD/GD32E50x/Include', 39cwd+'/CMSIS', 40cwd+'/GD32E50x_standard_peripheral/Include',] 41CPPDEFINES=['USE_STDPERIPH_DRIVER'] 42group=DefineGroup('Libraries',src,depend=[''],CPPPATH=path,CPPDEFINES=CPPDEFINES) 43Return('group')
創建BSP
拷貝BSP模板
任意拷貝一份BSP文件夾(我同樣也是用的407)重命名為E503:
修改board.h頭文件
其中主要需要修改的內容都在board路徑下。先看board.h文件,我這里沒有做外部SDRAM,所以注釋掉相關定義,我板子實際焊的是GD32E503RCT6,所以SRAM大小改為96KB,再把相關頭文件名修改一下:
1#ifndef__BOARD_H__ 2#define__BOARD_H__ 3#include"gd32e50x.h" 4#include"drv_usart.h" 5#include"drv_gpio.h" 6#include"gd32e50x_exti.h" 7//#defineEXT_SDRAM_BEGIN(0xC0000000U)/*thebeginingaddressofexternalSDRAM*/ 8//#defineEXT_SDRAM_END(EXT_SDRAM_BEGIN+(32U*1024*1024))/*theendaddressofexternalSDRAM*/ 9//
添加gd32e50x_libopt.h
在固件庫內的隨便一個例程路徑內拷貝一份”gd32e50x_libopt.h”到當前bsp的board路徑內,替換掉原有的“gd32f4xx_libopt.h”
修改board目錄下的Kconfig和SConscript配置文件
而對于board目錄下的“Kconfig”和“SConscript”配置文件也要稍作修改,基本都是把F4xx的字符串改成E50x的。稍需注意的是“SConscript”文件內對于啟動文件相關的配置,E50x有高密度(hd)和互聯(cl)兩個版本。我這里用的E503RC或者是RE都是高密度版本,所以選擇hd的匯編啟動文件。而且還需要說明的是,雖然我這里沒有注釋掉gcc編譯器下的啟動文件,但其實E503的固件庫內并沒有提供gcc版本的啟動文件,也就是說后面不能用RTT的IDE去開發了。等什么時候有了再加進來吧?;蛘吆竺婵葱枰?,不行就自己改一版gcc編譯器的啟動文件。目前這兩個文件就暫且修改這么多,后面再看情況,如有問題再進行修改。
“SConscript”文件修改如下:
1importos 2importrtconfig 3frombuildingimport* 4Import('SDK_LIB') 5cwd=GetCurrentDir() 6#addgeneraldrivers 7src=Split(''' 8board.c 9''') 10path=[cwd] 11startup_path_prefix=SDK_LIB 12ifrtconfig.PLATFORMin['gcc']: 13src+=[startup_path_prefix+'/GD32E50x_Firmware_Library/CMSIS/GD/GD32E50x/Source/GCC/startup_gd32e50x_hd.s'] 14elifrtconfig.PLATFORMin['armcc','armclang']: 15src+=[startup_path_prefix+'/GD32E50x_Firmware_Library/CMSIS/GD/GD32E50x/Source/ARM/startup_gd32e50x_hd.s'] 16elifrtconfig.PLATFORMin['iccarm']: 17src+=[startup_path_prefix+'/GD32E50x_Firmware_Library/CMSIS/GD/GD32E50x/Source/IAR/startup_gd32e50x_hd.s'] 18CPPDEFINES=['GD32E50X','GD32E50X_HD'] 19group=DefineGroup('Drivers',src,depend=[''],CPPPATH=path,CPPDEFINES=CPPDEFINES) 20Return('group')
修改三種編譯器用的鏈接腳本
修改”board/linker_scripts”目錄下的連接文件,如無特殊要求可不對連接腳本做太多修改,只需要修改RAM和ROM地址和大小即可,以“link.sct”為例:
1LR_IROM10x080000000x00040000{;loadregionsize_region256KB 2ER_IROM10x080000000x00040000{;loadaddress=executionaddress 3*.o(RESET,+First) 4*(InRoot$$Sections) 5.ANY(+RO) 6} 7RW_IRAM10x200000000x00018000{;RWdata96KB 8.ANY(+RW+ZI) 9} 10}
修改BSP頂層SConstruct和rtconfig.py文件
修改新建bsp目錄下的SConstruct文件和rtconfig.py文件:
SConstruct文件只需要修改“gd32_library”的值:
1gd32_library='GD32E50x_Firmware_Library'
修改工程模板
接下來修改工程模板文件,我這邊只修改MDK5版本的工程模板:
修改Device為實際使用的GD32E503RC:
調試工具改成DAP:
利用env工具配置RTthread并生成MDK工程
在新鍵的bsp目錄下運行env工具(env工具的安裝與使用請參考RTT官方文檔),對RTT做初步配置:
最后根據提示,輸入命令生成mdk5的工程,(如果想要提交自己制作的BSP,請參照官方BSP制作規范):
下載驗證
最后打開工程,稍微修改一下main.c內的內容,加一條調試語句,修改對應的LED引腳。編譯一下,如果能編譯通過說明上面修改的內容沒問題,如果有錯誤請仔細檢查上面格配置文件修改的內容是否正確或者自行根據錯誤提示進行修改。燒錄程序就可以看到運行效果了。
1#include
今天就先玩到這里,后面再使用一段時間這個BSP,需要優化的地方優化一下,然后再往碼云上提交一份。
其它鏈接
視頻方面目前只有一個前期的開題視頻,簡單講了一下想做一些什么,過了一遍硬件電路的設計方案,想了解詳情的可以觀看下面的視頻哦!更多的階段性功能展示以及調試視頻后續再慢慢更新。
【無刷電機小車——搞起來!-嗶哩嗶哩】 https://b23.tv/ZmvhBS7
無刷電機小車開發記錄02——BSP導入RTThreadStudio:https://club.rt-thread.org/ask/article/4c90d45831ce0722.html
無刷電機小車開發記錄03——PWM信號輸入捕獲驅動:https://club.rt-thread.org/ask/article/dc39eb608f1eba75.html
無刷電機小車開發記錄04——互補PWM驅動移植:https://club.rt-thread.org/ask/article/004229252f06d18d.html
———————End———————
點擊閱讀原文進入官網
-
RT-Thread
+關注
關注
31文章
1273瀏覽量
39933
原文標題:無刷電機小車開發記錄01——制作RTT內GD32E503器件的BSP
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論