前言
我日常的工作环境使用的是windows系统,但是公司对正版有要求,故开发环境用的是vscode,这是一个基于GCC的开发环境,在此环境下开发的程序在LINUX环境下可以直接用。
GD32官方提供了Keil和IAR支持,但是没有提供对ARM-GCC的支持配置文件。
所以要想在GCC模式下开发,就要自己进行造轮子,并进行移植,把官方要做的事情,我们自己做了。把官方要猜的坑,我们来踩了。
说明
我这篇文章可能写的有点繁琐,大家可以看做如何教大家拿到一块陌生的开发板后,如何从零到一的在vscode上进行开发移植。
本来我是打算写一篇在vscode下开发GD32的裸机程序的,但是论坛已有相同的功能了。我想了想自己最近正在vscode上做GD32F103芯片的RT Thread的移植,在经过漫长的数周开发踩坑,心态爆炸后,终于在12.5号完成了GD32F103芯片的RT Thread移植开发。然后,今天用了一个上午,完成了GD32F427开发板的RT-thread Nano 3.03移植开发。
踩坑结束,作文报告给大家。
准备工作
- 到官方网站下载datasheet等各项数据手册。
- 准备一台电脑,下载vscode,ARM-GCC 交叉编译器gcc-arm-none-eabi-10-2020-q4-major。具体安装方法可在论坛搜索,我这里就不讲了。
- 把官方的所有数据手册大致浏览一遍。
过程
建立一个工程文件,我这里直接拿来野火的工程结构来创建。
- .vscode:系统自动创建
- build:makefile编译来的
- Doc:自己创建,放置说明。
Libraries:GD32底层固件
* CMSIS:CM4等文件,把官方的CMSIS文件拷贝过来,并在此文件夹下新建startup文件夹。 * FWlib:GD32F427底层外设驱动文件。
- rtthread:RT-thread Nano 3.03文件。
- User:main函数等文件。需要自己编写,改写。
- gd32f407_427_flash.ld:LinkerScript文件,需要自己改写,默认大家都会移植,不会参考论坛其他人的。
- Makefile:编译连接文件,需要自己编写,默认大家都会,不会可以参考论坛其他人的。
移植修改
在cpuport.c文件111行增加如下代码
#define SCB_AIRCR (*(volatile unsigned long *)0xE000ED0C) /* Reset control Address Register */ #define SCB_RESET_VALUE 0x05FA0004 /* Reset value, write to SCB_AIRCR can reset cpu */
在cpuport.c文件354行增加如下代码
/** * reset CPU */ RT_WEAK void rt_hw_cpu_reset(void) { SCB_AIRCR = SCB_RESET_VALUE; }
- 修改context_gcc.S为context_gcc.s
在.ld中添加如下代码
/* The program code and other data goes into FLASH */ .text : { . = ALIGN(4); *(.text) /* .text sections (code) */ *(.text*) /* .text* sections (code) */ *(.glue_7) /* glue arm to thumb code */ *(.glue_7t) /* glue thumb to arm code */ *(.eh_frame) KEEP (*(.init)) KEEP (*(.fini)) /*RT-thread GCC Add start*/ /* section information for finsh shell */ . = ALIGN(4); __fsymtab_start = .; KEEP(*(FSymTab)) __fsymtab_end = .; . = ALIGN(4); __vsymtab_start = .; KEEP(*(VSymTab)) __vsymtab_end = .; . = ALIGN(4); /* section information for initial. */ . = ALIGN(4); __rt_init_start = .; KEEP(*(SORT(.rti_fn*))) __rt_init_end = .; . = ALIGN(4); /* RT-thread GCC Add end */ . = ALIGN(4); _etext = .; /* define a global symbols at end of code */ } >FLASH
在.s文件修改101行启动函数main为entry。
以上基本是在RT-thread Nano 3.03移植时必做的修改,修改完这些,编译才能大致无错。移植RT-thread Nano 3.03以上的系统时,有一部分改进了,需要大家具体问题具体分析。
- Makefile中修改.c.h文件路径,修改.s.ld文件路径。
- 在Libraries/CMSIS/GD/GD32F4xx/Include文件夹下新建gd32f4xx_libopt.h,
- 在Libraries/CMSIS/GD/GD32F4xx/Include文件夹下新建RTE_Components.h文件。
- 删除gd32f4xx_it.c中所有的函数。
在gd32f4xx.h中预定义 GD32F427
以上完成后就可以make了。make中的问题。
- MAKE中遇到提示note: previous declaration of ‘fd_mask’ was here,在Makefile中预定义-DRT_USING_NEWLIB
Make中遇到error: redefinition of 'union sigval',
1. 解决方法:https://github.com/RT-Thread/rt-thread/issues/2060 2. 解决方法:在Makefile中预定义-DHAVE_SYS_SIGNALS。
在这里提一句,移植RT-thread操作系统 ,大家一定要去github上看lssues,很多问题的答案都在里面,我们碰到的问题很多前辈都碰到过,如果实在没有,恭喜你,你可以用自己的名字来给他留名了。
结果
基本上到这里移植就结束了,因为make到这里基本上就没有问题了。接下来就是写一个测试程序,来测试我们的程序。
在user文件夹下新建bsp文件夹,在bsp文件夹下新建LED文件夹,在文件夹下新建bsp_led.c,bsp_led.h文件,在里面写入程序。
- 在这里额外提一句,我不太喜欢RT的驱动框架,因为虽然方便,但是要想看懂,有点困难,对于我这种强迫症患者来说,实在不太友好。每次都要脑子里绕一下才能理解,有点费脑,无脑使用还是可以的。
- 公司标准审核的话,给其他人看和维护不太友好,因为每次都要我给他们讲解,即便加上注释也不行。
在main文件中,创建线程,并make编译。
大小如下。板载GD-Link下载
- 打开GD-Link Programmer.exe
- 送的USB线链接GD-LINK mini USB插头,点击target->connet,自动建立链接。
链接成功,在屏幕下面如上图显示,在屏幕左侧会显示。 - 点击file->open文件,加载bin或hex文件。
点击target->program烧录文件,烧录成功如下。
26.4k烧录时间2.516S,还凑合,差不多10k/s。
做测试是够用了。实验现象
就是灯一闪一闪的,大家可以自己下载我提供的文件去烧录,我没有上传到B站之类的外站进行外置链接,只是手机拍摄了一下视频,目前极术还不能直接上传视频,可能会对服务器有压力。
总结
GD32F427评测
先说GD32F427的评测,这个芯片资源尚可,频率不错,就是IO比较少,但是ram之类的是真大,非常适合移植操作系统,用作物联网方面,如果是IO资源需求较多的项目可能不是太适合。
裸机VSCODE开发难度,对于我来说,难度是容易。
在VSCODE下开发,makefile需要懂,GCC与keil开发也不一样,.LD.S文件要会移植改写。
说起来.s文件,大家可以在官方提供的固件包里找到keil与iar下的.s文件,然后参照里面的字段进行移植到GCC下,难度不难,主要就是一个细心的活计。
.ld文件可以自己写,但是要参考官方datasheet,设定好堆栈大小与RAM大小即可,难度一般。也可以在keil文件中安装好GD32F4的pack包之后去提取。
makefile文件可以自己写,也可以用py生成,具体可以参考论坛其他人的。.ld文件有一个地方要重点提一下,我看到有部分坛友的.ld文件直接照搬其他人的,在分配RAM时,直接就写了256K,虽然GD32F427这个芯片RAM确实是256K,但是不知道大家有没有去看官方的datasheet。
GD32F427的256K组成是112k+16k+64K,这一部分是地址相互连接在一起的,但是这一部分也才192k,剩下的64k在0x10000000,与192K不在一个地址。还有4k在sram的备份域中。
这一点大家要注意,在RAM中存储的数据不要超过192K。小型项目基本用不到,大型项目一定要注意。
此外,关于这块板子设计上实在有一点让人吐槽,那就是没有焊接TTL转USB,232,485等芯片,你都上3300了,还不能上个ch340之类的通讯芯片来让测试吗?
我们工程师手上没有那么多通讯芯片模块啊。
实在不行CN3你引出TTL串口测试点啊,这里也没有引出,是生怕我们复用还是怎么着?实在让人不知道说什么好。RT Thread的移植评测
这个操作系统最初是因为国内开源我才使用的,但是官方文档上面关于VSCODE的移植并不多,就算有,也没有具体国产芯片的移植方案。
大部分都是ENV活着keil的移植,因为keil移植确实方便。
我最开始移植使用的RT Thread的全面版,但是在vscode上的移植实在太困难,我就开始移植nano版,用的4的版本,但是移植也不顺利,老是有莫名其妙的问题出来。
最后我都准备放弃了,自己写一个操作系统来玩,突然想起来以前玩过野火的nano 3.0.3,于是最后尝试了一下移植,OK了,我都不知道说什么好。只能说版本低还是有好处的。高版本碰到的问题很可能你就是唯一。低版本的问题出现的早,很可能早就有人解决了。此外建议大家在移植RT Thread的时候一定要把GCC更新到最新的10版本,
我的还是8.1.0,最新的RT Thread nano编译移植都通不多,根据github上的lssues说法,最新版本的RT Thread nano也只有最新的gcc 10才能够编译通过。
话说怎么添加压缩文件,我还没搞懂,先传上去,等我把代码传到百度云或者gitee之类的地方,然后放链接给大家。