Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
BSP
智能小车_平衡车
无刷电机小车开发记录01——制作RTT内GD32E503器件的BSP
发布于 2023-06-16 14:48:54 浏览:1397
订阅该版
[tocm] # 前情提要 最近计划开始做一个无刷电机的小车玩玩,不用网上的现有方案,一切从零开始自己做方案。硬件方案打算用GD32E503和EG2134栅极驱动IC等一系列国产器件去做,这样就面临一个问题,不太好用Arduino跑SimpleFOC快速出原型。所以软件方案想基于RTT开发,这样只需移植一些硬件驱动和FOC以及卡尔曼滤波等算法,其它的很多功能还是可以用RThread组件实现的,总不能所有轮子都自己造😅,毕竟玩这个小车的目的也只是想深入玩玩这些控制算法。这个小车的整个开发周期可能会很长,至少是以年为度量单位的,第一是因为工作比较忙,只能用一些零散时间搞,第二是因为计划用到什么学什么,有意思的地方都深入的研究研究,不以速成为目的。整个开发过程也都记录一下,图文形式的记录可能会在RTThread论坛进行记录,视频形式的记录就发布在B站上,希望有兴趣的小伙伴也可以一起玩一玩哈。 # 前期工作 前段时间,大概花了一周的时间已经把第一版测试用的硬件电路和机械结构设计完毕,如下是硬件电路的3D视图。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230617/1b17bca434a12305c01d6ace888f5502.png.webp) 如下是三轮小车形态的车底盘3D渲染图: ![screenshot_无刷电机小车底盘 v4.png](https://oss-club.rt-thread.org/uploads/20230617/d946cc430085c77102dfd0b9618a4745.png.webp) 下图是平衡车形态的车底盘3D渲染图: ![screenshot_无刷电机平衡车 v16_1.png](https://oss-club.rt-thread.org/uploads/20230617/4492160cd9298abef514efaaf6431767.png.webp) 下图为二阶平衡车形态的车底盘3D渲染图: ![screenshot_无刷电机平衡车 v16_2.png](https://oss-club.rt-thread.org/uploads/20230617/da751978eca1017e450dc8b3023c72b7.png.webp) 目前第一版的硬件测试电路已焊接完毕,第一版测试小车也完成了组装,下图是刚组装起来的平衡车形态的无刷电机小车,就计划先拿它开刀了,其它形态后面再慢慢玩。小车还算小巧,等测试通过后计划再做一版集成度更高更小巧的玩玩。 ![screenshot_da0d01c186c968ce82142e827e43f22.jpg](https://oss-club.rt-thread.org/uploads/20230615/b9a61b44848c04e474015a01b2c6eecc.jpg.webp) # 千里之行始于创建BSP 一切就绪,准备开始撸程序了,那遇到的第一个问题就是目前RTthread的BSP内并没有我想用的这款GD32E503的处理器(用这款处理器是想玩一玩它的三角函数加速器,有硬件计算电路,就不用查询法去计算三角函数了,感觉跑FOC会舒服很多)。所以第一步就是要学习一下添加自己的BSP了。 ## 下载GD32E503固件库和RTT源码包 做BSP的第一步,自然是下载RTThread源码和GD32E503的固件库了。目前RTThread的稳定发行版应该是4.1.0,但我这里只是玩玩,对稳定度要求不高,果断去码云上下载了最新的master版本,目前的版本是5.0.1: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230615/da45d8629b5249751217dd5654bc183c.png.webp) ```c /* RT-Thread version information */ #define RT_VERSION_MAJOR 5 /**< Major version number (X.x.x) */ #define RT_VERSION_MINOR 0 /**< Minor version number (x.X.x) */ #define RT_VERSION_PATCH 1 /**< Patch version number (x.x.X) */ ``` GD32E503的固件库包含在开发板Demo资料里,最新版本是V1.2.2: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230615/a2266e67a3ccba79694a8769a98e430d.png.webp) ## 添加GD32E503器件到MDK GD32E50x的AddOn资源包,目前最新版本是1.3.3,如果还没有安装MDK需要先安装一下MDK,这里不做过多表述,然后再安装AddOn资源包内的两个".pack"文件(也可以只安装E50x版本的): ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230615/4a9210ab4ba9759905f3d51cf0a51458.png.webp) 如下图所示,MDK内的DeviceDatabase内能找到GD32E50x系列的器件列表,证明资源包安装成功。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230616/1344cbee7789761bd16d41952499adec.png) ## 添加libraries ### 拷贝固件库到BSP的libraries目录内 解压RTT源码包和固件库压缩包,先拷贝固件库的"GD32E50x_Firmware_Library"文件夹到RTT源码包的"bsp/gd32/arm/libraries/"路径下: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230615/1ba53c064d27b7f12386da14053689fc.png.webp) ### 修改libraries目录内的配置文件 这里可以看到libraries目录下还有两个配置文件“Kconfig”和“.ignore_format.yml”,Kconfig文件后面用menuconfig或RTthreadStudio IDE去配置肯定会用到,另外一个文件暂时不知道什么用途,但不妨一起修改了,Kconfig文件修改如下(文档末尾添加GD32E5的配置信息): ``` config SOC_FAMILY_GD32 bool config SOC_SERIES_GD32F1 bool select ARCH_ARM_CORTEX_M3 select SOC_FAMILY_GD32 config SOC_SERIES_GD32F2 bool select ARCH_ARM_CORTEX_M3 select SOC_FAMILY_GD32 config SOC_SERIES_GD32F3 bool select ARCH_ARM_CORTEX_M4 select SOC_FAMILY_GD32 config SOC_SERIES_GD32F4 bool select ARCH_ARM_CORTEX_M4 select SOC_FAMILY_GD32 config SOC_SERIES_GD32E5 #add by cjl bool select ARCH_ARM_CORTEX_M33 select SOC_FAMILY_GD32 ``` ".yml"文件把GD32E50x的固件库路径名添加到数组末尾: ```xml dir_path: - GD32F10x_Firmware_Library - GD32F20x_Firmware_Library - GD32F30x_Firmware_Library - GD32F4xx_Firmware_Library - GD32E50x_Firmware_Library ``` ### 给固件库添加SConscript构建配置文件 从其它固件库文件内(我用的F4xx)拷贝一份"SConscript"文件到新加入的固件库路径内: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230615/61fdc8821b5d7ff12d01ac600ba9a75c.png) 修改其内容(F4xx替换为E50x): ```python import rtconfig from building import * # get current directory cwd = GetCurrentDir() # The set of source files associated with this SConscript file. src = Split(''' CMSIS/GD/GD32E50x/Source/system_gd32e50x.c GD32E50x_standard_peripheral/Source/gd32e50x_gpio.c GD32E50x_standard_peripheral/Source/gd32e50x_rcu.c GD32E50x_standard_peripheral/Source/gd32e50x_exti.c GD32E50x_standard_peripheral/Source/gd32e50x_misc.c ''') # remove: GD32E50x_standard_peripheral/Source/gd32e50x_syscfg.c if GetDepend(['RT_USING_SERIAL']): src += ['GD32E50x_standard_peripheral/Source/gd32e50x_usart.c'] if GetDepend(['RT_USING_I2C']): src += ['GD32E50x_standard_peripheral/Source/gd32e50x_i2c.c'] if GetDepend(['RT_USING_SPI']): src += ['GD32E50x_standard_peripheral/Source/gd32e50x_spi.c'] if GetDepend(['RT_USING_CAN']): src += ['GD32E50x_standard_peripheral/Source/gd32e50x_can.c'] if GetDepend(['BSP_USING_ETH']): src += ['GD32E50x_standard_peripheral/Source/gd32e50x_enet.c'] if GetDepend(['RT_USING_ADC']): src += ['GD32E50x_standard_peripheral/Source/gd32e50x_adc.c'] if GetDepend(['RT_USING_DAC']): src += ['GD32E50x_standard_peripheral/Source/gd32e50x_dac.c'] if GetDepend(['RT_USING_RTC']): src += ['GD32E50x_standard_peripheral/Source/gd32e50x_rtc.c'] src += ['GD32E50x_standard_peripheral/Source/gd32e50x_pmu.c'] if GetDepend(['RT_USING_WDT']): src += ['GD32E50x_standard_peripheral/Source/gd32e50x_wwdgt.c'] src += ['GD32E50x_standard_peripheral/Source/gd32e50x_fwdgt.c'] if GetDepend(['RT_USING_SDIO']): src += ['GD32E50x_standard_peripheral/Source/gd32e50x_sdio.c'] src += ['GD32E50x_standard_peripheral/Source/gd32e50x_dma.c'] path = [ cwd + '/CMSIS/GD/GD32E50x/Include', cwd + '/CMSIS', cwd + '/GD32E50x_standard_peripheral/Include',] CPPDEFINES = ['USE_STDPERIPH_DRIVER'] group = DefineGroup('Libraries', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) Return('group') ``` ## 创建BSP ### 拷贝BSP模板 任意拷贝一份BSP文件夹(我同样也是用的407)重命名为E503: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230615/bd941a9b0f0440d62ec76146d98ac817.png.webp) ### 修改board.h头文件 其中主要需要修改的内容都在board路径下。先看board.h文件,我这里没有做外部SDRAM,所以注释掉相关定义,我板子实际焊的是GD32E503RCT6,所以SRAM大小改为96KB,再把相关头文件名修改一下: ```c #ifndef __BOARD_H__ #define __BOARD_H__ #include "gd32e50x.h" #include "drv_usart.h" #include "drv_gpio.h" #include "gd32e50x_exti.h" //#define EXT_SDRAM_BEGIN (0xC0000000U) /* the begining address of external SDRAM */ //#define EXT_SDRAM_END (EXT_SDRAM_BEGIN + (32U * 1024 * 1024)) /* the end address of external SDRAM */ //
Internal SRAM memory size[Kbytes] <8-64> //
Default: 64 #ifdef __ICCARM__ // Use *.icf ram symbal, to avoid hardcode. extern char __ICFEDIT_region_RAM_end__; #define GD32_SRAM_END &__ICFEDIT_region_RAM_end__ #else #define GD32_SRAM_SIZE 96 //96 for GD32E503xC 128 for GD32E503xE ... #define GD32_SRAM_END (0x20000000 + GD32_SRAM_SIZE * 1024) #endif #ifdef __ARMCC_VERSION extern int Image$$RW_IRAM1$$ZI$$Limit; #define HEAP_BEGIN (&Image$$RW_IRAM1$$ZI$$Limit) #elif __ICCARM__ #pragma section="HEAP" #define HEAP_BEGIN (__segment_end("HEAP")) #else extern int __bss_end; #define HEAP_BEGIN (&__bss_end) #endif #define HEAP_END GD32_SRAM_END #endif ``` ### 添加gd32e50x_libopt.h 在固件库内的随便一个例程路径内拷贝一份"gd32e50x_libopt.h"到当前bsp的board路径内,替换掉原有的“gd32f4xx_libopt.h” ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230615/f98ade9c25d51a3465a9f1ac3a5c202a.png) ### 修改board目录下的Kconfig和SConscript配置文件 而对于board目录下的“Kconfig”和“SConscript”配置文件也要稍作修改,基本都是把F4xx的字符串改成E50x的。稍需注意的是“SConscript”文件内对于启动文件相关的配置,E50x有高密度(hd)和互联(cl)两个版本。我这里用的E503RC或者是RE都是高密度版本,所以选择hd的汇编启动文件。而且还需要说明的是,虽然我这里没有注释掉gcc编译器下的启动文件,但其实E503的固件库内并没有提供gcc版本的启动文件,也就是说后面不能用RTT的IDE去开发了。等什么时候有了再加进来吧。或者后面看需要,不行就自己改一版gcc编译器的启动文件。目前这两个文件就暂且修改这么多,后面再看情况,如有问题再进行修改。 “SConscript”文件修改如下: ```python import os import rtconfig from building import * Import('SDK_LIB') cwd = GetCurrentDir() # add general drivers src = Split(''' board.c ''') path = [cwd] startup_path_prefix = SDK_LIB if rtconfig.PLATFORM in ['gcc']: src += [startup_path_prefix + '/GD32E50x_Firmware_Library/CMSIS/GD/GD32E50x/Source/GCC/startup_gd32e50x_hd.s'] elif rtconfig.PLATFORM in ['armcc', 'armclang']: src += [startup_path_prefix + '/GD32E50x_Firmware_Library/CMSIS/GD/GD32E50x/Source/ARM/startup_gd32e50x_hd.s'] elif rtconfig.PLATFORM in ['iccarm']: src += [startup_path_prefix + '/GD32E50x_Firmware_Library/CMSIS/GD/GD32E50x/Source/IAR/startup_gd32e50x_hd.s'] CPPDEFINES = ['GD32E50X','GD32E50X_HD'] group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) Return('group') ``` ### 修改三种编译器用的链接脚本 修改"board/linker_scripts"目录下的连接文件,如无特殊要求可不对连接脚本做太多修改,只需要修改RAM和ROM地址和大小即可,以“link.sct”为例: ``` LR_IROM1 0x08000000 0x00040000 { ; load region size_region 256KB ER_IROM1 0x08000000 0x00040000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00018000 { ; RW data 96KB .ANY (+RW +ZI) } } ``` ### 修改BSP顶层SConstruct和rtconfig.py文件 修改新建bsp目录下的SConstruct文件和rtconfig.py文件: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230616/bcc859ed748a57d0d07a73c05bed64ed.png) SConstruct文件只需要修改“gd32_library”的值: ```python gd32_library = 'GD32E50x_Firmware_Library' ``` ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230616/c4831f9a942b5865752ecd1653b29fe6.png) ### 修改工程模板 接下来修改工程模板文件,我这边只修改MDK5版本的工程模板: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230616/944db85407faf063765829887b750b1b.png) 修改Device为实际使用的GD32E503RC: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230616/def1edffd632b7eb6716c70bc991a79d.png) 调试工具改成DAP: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230616/eb719b5a52b7d8e7a429b554540525e7.png) ### 利用env工具配置RTthread并生成MDK工程 在新键的bsp目录下运行env工具(env工具的安装与使用请参考RTT官方文档),对RTT做初步配置: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230616/065c629794de92b0a247c2d198fa6197.png) 最后根据提示,输入命令生成mdk5的工程,**(如果想要提交自己制作的BSP,请参照官方BSP制作规范)**: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230616/2160d944d704d9c0f64457895b0c7556.png) ## 下载验证 最后打开工程,稍微修改一下main.c内的内容,加一条调试语句,修改对应的LED引脚。编译一下,如果能编译通过说明上面修改的内容没问题,如果有错误请仔细检查上面格配置文件修改的内容是否正确或者自行根据错误提示进行修改。烧录程序就可以看到运行效果了。 ```c #include
#include
#include
#include
/* defined the LED2 pin: PC6 */ #define LED_PIN GET_PIN(B, 11) #define BUZZER_PIN GET_PIN(B, 12) int main(void) { int count = 1; /* set LED2 pin mode to output */ rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); rt_pin_write(BUZZER_PIN, PIN_LOW); rt_pin_mode(BUZZER_PIN, PIN_MODE_OUTPUT); rt_kprintf("无刷电机小车测试程序!\n"); while (count++) { rt_pin_write(LED_PIN, PIN_HIGH); rt_thread_mdelay(500); rt_pin_write(LED_PIN, PIN_LOW); rt_thread_mdelay(500); } return RT_EOK; } ``` ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230616/c516381ec82d0b8f235756210bc36882.png.webp) 今天就先玩到这里,后面再使用一段时间这个BSP,需要优化的地方优化一下,然后再往码云上提交一份。 # 其它链接 视频方面目前只有一个前期的开题视频,简单讲了一下想做一些什么,过了一遍硬件电路的设计方案,想了解详情的可以观看下面的视频哦!更多的阶段性功能展示以及调试视频后续再慢慢更新。 [【无刷电机小车——搞起来!-哔哩哔哩】 https://b23.tv/ZmvhBS7](https://b23.tv/ZmvhBS7 "【无刷电机小车——搞起来!-哔哩哔哩】 https://b23.tv/ZmvhBS7") [无刷电机小车开发记录02——BSP导入RTThreadStudio:https://club.rt-thread.org/ask/article/4c90d45831ce0722.html](https://club.rt-thread.org/ask/article/4c90d45831ce0722.html "无刷电机小车开发记录02——BSP导入RTThreadStudio:https://club.rt-thread.org/ask/article/4c90d45831ce0722.html") [无刷电机小车开发记录03——PWM信号输入捕获驱动:https://club.rt-thread.org/ask/article/dc39eb608f1eba75.html](https://club.rt-thread.org/ask/article/dc39eb608f1eba75.html "无刷电机小车开发记录03——PWM信号输入捕获驱动:https://club.rt-thread.org/ask/article/dc39eb608f1eba75.html") [无刷电机小车开发记录04——互补PWM驱动移植:https://club.rt-thread.org/ask/article/004229252f06d18d.html](https://club.rt-thread.org/ask/article/004229252f06d18d.html "无刷电机小车开发记录04——互补PWM驱动移植") [无刷电机小车开发记录05——移植SimpleFOC:https://club.rt-thread.org/ask/article/5de0ee015b102873.html](https://club.rt-thread.org/ask/article/5de0ee015b102873.html "无刷电机小车开发记录05——移植SimpleFOC:https://club.rt-thread.org/ask/article/5de0ee015b102873.html") 截至更新完05篇文章,小车的无刷电机轮子可以正常驱动了,也就是说已经验证了这版全国产化的无刷电机的驱动方案可行。所以暂时先把当前阶段的软硬件资源开源出来,但其它方面的硬件还没有验证,软件也处于开发测试阶段,有需要参考的小伙伴请自行斟酌使用,我这边后续再慢慢完善更新。 **目前已知的硬件问题:**MCU使用的三脚晶振的封装偏小。我这边直接使用的AD自带的云器件库,可以也自己按照实际器件选用自己的器件封装。 [无刷电机小车驱动板V1.0_share.zip](https://club.rt-thread.org/file_download/777035cd1e49ea4c) [Gitee代码开源地址:https://gitee.com/chengjili/brushless-motor-trolley](https://gitee.com/chengjili/brushless-motor-trolley "Gitee代码开源地址:https://gitee.com/chengjili/brushless-motor-trolley")
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
吉利咕噜2022
国防科大-军品研发
文章
18
回答
3
被采纳
2
关注TA
发私信
相关文章
1
STM32 407 串口接收数据 系统卡死
2
RTT nrf24l01 设备驱动程序
3
stm32f10x串口只能发送数据,无法接收
4
第一次尝试移植rt-thread 到stm32F103系列问题
5
有人把stm32L07xx的bsp移到rtt上来了吗?求一个
6
rt-thread线程调度异常在stm32f103芯片上
7
RTT是否支持STM32F429
8
请问谁有 STM32F40x HAL + RT-THREAD 模板
9
rt-thread在stm32f411下的移植问题
10
针对STM32F7系列平台的MPU,Cache特性,需要注意哪些问题?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
国产MCU移植系列教程汇总,欢迎查看!
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
文件系统
DMA
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
ota在线升级
WIZnet_W5500
UART
flash
packages_软件包
cubemx
PWM
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
中断
flashDB
socket
Debug
GD32
编译报错
msh
keil_MDK
at_device
rt_mq_消息队列_msg_queue
ulog
C++_cpp
SFUD
本月问答贡献
出出啊
1512
个答案
341
次被采纳
小小李sunny
1437
个答案
289
次被采纳
张世争
774
个答案
167
次被采纳
crystal266
546
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部