易水 · 2022年12月06日 · 上海市

【GD32F427开发板试用】+VSCODE下基于RT-thread Nano 3.03的移植

前言

我日常的工作环境使用的是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移植开发。
踩坑结束,作文报告给大家。

准备工作

  1. 到官方网站下载datasheet等各项数据手册。
  2. 准备一台电脑,下载vscode,ARM-GCC 交叉编译器gcc-arm-none-eabi-10-2020-q4-major。具体安装方法可在论坛搜索,我这里就不讲了。
  3. 把官方的所有数据手册大致浏览一遍。

过程

建立一个工程文件,我这里直接拿来野火的工程结构来创建。

11.png

  • .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:编译连接文件,需要自己编写,默认大家都会,不会可以参考论坛其他人的。
    12.png
    13.png
    14.png
    15.png
    16.png

移植修改

  1. 在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 */
  2. 在cpuport.c文件354行增加如下代码

     /**
     * reset CPU
     */
     RT_WEAK void rt_hw_cpu_reset(void)
     {
         SCB_AIRCR = SCB_RESET_VALUE;
     }
  3. 修改context_gcc.S为context_gcc.s
  4. 在.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
  5. 在.s文件修改101行启动函数main为entry。

    以上基本是在RT-thread Nano 3.03移植时必做的修改,修改完这些,编译才能大致无错。移植RT-thread Nano 3.03以上的系统时,有一部分改进了,需要大家具体问题具体分析。

  6. Makefile中修改.c.h文件路径,修改.s.ld文件路径。
  7. 在Libraries/CMSIS/GD/GD32F4xx/Include文件夹下新建gd32f4xx_libopt.h,
  8. 在Libraries/CMSIS/GD/GD32F4xx/Include文件夹下新建RTE_Components.h文件。
  9. 删除gd32f4xx_it.c中所有的函数。
    6.png
  10. 在gd32f4xx.h中预定义 GD32F427
    1.png
    以上完成后就可以make了。

    make中的问题。

  11. MAKE中遇到提示note: previous declaration of ‘fd_mask’ was here,在Makefile中预定义-DRT_USING_NEWLIB
  12. 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到这里基本上就没有问题了。接下来就是写一个测试程序,来测试我们的程序。

  13. 在user文件夹下新建bsp文件夹,在bsp文件夹下新建LED文件夹,在文件夹下新建bsp_led.c,bsp_led.h文件,在里面写入程序。

    1. 在这里额外提一句,我不太喜欢RT的驱动框架,因为虽然方便,但是要想看懂,有点困难,对于我这种强迫症患者来说,实在不太友好。每次都要脑子里绕一下才能理解,有点费脑,无脑使用还是可以的。
    2. 公司标准审核的话,给其他人看和维护不太友好,因为每次都要我给他们讲解,即便加上注释也不行。
  14. 在main文件中,创建线程,并make编译。
    17.png
    18.png
    大小如下。
    19.png

    板载GD-Link下载

  15. 打开GD-Link Programmer.exe
  16. 送的USB线链接GD-LINK mini USB插头,点击target->connet,自动建立链接。
    8.png
    链接成功,在屏幕下面如上图显示,在屏幕左侧会显示。
    9.png
  17. 点击file->open文件,加载bin或hex文件。
  18. 点击target->program烧录文件,烧录成功如下。
    20.png
    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。

    3.png
    4.png
    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版本,

    21.png
    我的还是8.1.0,最新的RT Thread nano编译移植都通不多,根据github上的lssues说法,最新版本的RT Thread nano也只有最新的gcc 10才能够编译通过。
    话说怎么添加压缩文件,我还没搞懂,先传上去,等我把代码传到百度云或者gitee之类的地方,然后放链接给大家。

推荐阅读
关注数
10708
内容数
187
中国高性能通用微控制器领域的领跑者兆易创新GD系列芯片技术专栏。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息