Hello_Main · 2022年04月01日

【GD32F310开发板试用】rtthread移植及BSP制作(保姆级)

一、开发环境

桌面操作系统: Win10
开发软件: Keil MDKV5.36
RTOS平台: rt-thread 4.1.0
项目地址:https://gitee.com/lsslny/rt-thread/tree/gitee_master/bsp/gd32

二、任务计划

1、rt-thread 系统移植;(完成评测任务)
2、AT组件加4G或WiFi模组使用;
3、MQTT组件使用;
4、SENSOR设备驱动加DHT11温湿度传感器信息采集;

三、移植过程

1、先从rt-thread官方库,把代码Fork到自己的库,然后拉取到本地;

https://gitee.com/rtthread

先Fork:

image-20220401175706833.png

再拉取:

image-20220401175800225.png

2、进入rt-thread的BSP目录(rt-thread\bsp\gd32):

image.png

将gd32305r-start复制然后粘贴,并且将其改名为:gd32310k-start

使用这份的原因是,同为F3系列的,同样都是Cortex-m4核,搞起来更容易些;

3、解压 GD32F3x0\_Firmware\_Library\_V2.2.0.rar 并且将Firmware文件夹放到rt-thread\bsp\gd32\libraries下

image.png

然后将Firmware改名为GD32F3x0\_Firmware\_Library:

image.png

然后将附近的GD32F30x\_Firmware\_Library文件夹下SConscript文件拷贝到本目录下:

image.png

4、将刚才两步所添加的所有文件先add和commit一下:

image.png

这样子的话,后续改动如果有问题可直接恢复,提高效率;

5、默认工程文件更改

5.1、解压GD32F3x0\_Demo\_Suites\_V2.2.0.rar,运行GigaDevice.GD32F3x0\_DFP.3.0.0.pack将MDK需要的库添加进软件

image.png

5.2、打开template.uvprojx更改默认工程文件;

image.png

image.png

image.png

然后保存并且退出软件;

5.3、打开GD32310K\_START\_Demo\_Suites\Projects\01\_GPIO\_Running\_LED例程,将gd32f3x0\_libopt.h文件复制到rt-thread\bsp\gd32\gd32310k-start\board目录下,并且将其下的gd32f30x\_libopt.h文件删除,然后将gd32f3x0\_libopt.h文件add到git中

image.png

6、构建文件更改

6.1、打开gd32\gd32310k-start\SConstruct文件做如下修改:

image.png

将gd32\_library改成GD32F3x0的固件库GD32F3x0\_Firmware\_Library;

6.2、打开rt-thread\bsp\gd32\gd32310k-start\board\SConscript文件做如下更改:

image.png

更改后如下:

if rtconfig.CROSS_TOOL == 'gcc':
    src += [startup_path_prefix + '/GD32F3x0_Firmware_Library/CMSIS/GD/GD32F3x0/Source/GCC/startup_gd32f3x0.s']
elif rtconfig.CROSS_TOOL == 'keil':
    src += [startup_path_prefix + '/GD32F3x0_Firmware_Library/CMSIS/GD/GD32F3x0/Source/ARM/startup_gd32f3x0.s']
elif rtconfig.CROSS_TOOL == 'iar':
    src += [startup_path_prefix + '/GD32F3x0_Firmware_Library/CMSIS/GD/GD32F3x0/Source/IAR/startup_gd32f3x0.s']
    
CPPDEFINES = ['GD32F310']

6.3、打开rt-thread\bsp\gd32\libraries\GD32F3x0\_Firmware\_Library\SConscript改成以下内容:

import rtconfig
from building import *

# get current directory

cwd = GetCurrentDir()

# The set of source files associated with this SConscript file.

src = Glob('GD32F3x0_standard_peripheral/Source/*.c')
src += [cwd + '/CMSIS/GD/GD32F3x0/Source/system_gd32f3x0.c']

path = [
    cwd + '/CMSIS/GD/GD32F3x0/Include',
    cwd + '/CMSIS',
    cwd + '/GD32F3x0_standard_peripheral/Include',]

if GetDepend(['RT_USING_BSP_USB']):
    path += [cwd + '/GD32F3x0_usbfs_library/driver/Include']
    src  += [cwd + '/GD32F3x0_usbfs_library/driver/Source']

CPPDEFINES = ['USE_STDPERIPH_DRIVER']

group = DefineGroup('Libraries', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES)

Return('group')

7、kconfig文件更改:

7.1、主目录下的kconfig不用管它,我们直接更改rt-thread\bsp\gd32\gd32310k-start\board目录下的kconfig

image.png

然后将多余的串口删掉(GD32F310K8芯片只有两个串口)

8、board文件夹下链接脚本更改

从GD32F310xx\_Datasheet\_Rev1.0.pdf文档里面可以看到:

image.png

我们这颗GD32F310K8T6芯片,有FLASH 64K(0x10000)和SRAM 8K(0x2000);

8.1、打开rt-thread\bsp\gd32\gd32310k-start\board\linker\_scripts目录下link.icf文件:

image.png

define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
define symbol __ICFEDIT_region_ROM_end__   = 0x0800FFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__   = 0x20007FFF;

8.2、打开rt-thread\bsp\gd32\gd32310k-start\board\linker\_scripts目录下link.ld文件:

image.png

8.3、打开rt-thread\bsp\gd32\gd32310k-start\board\linker\_scripts目录下link.icf文件:

image.png

LR_IROM1 0x08000000 0x00010000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00010000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00002000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

8.4、打开rt-thread\bsp\gd32\gd32310k-start\board目录下board.h文件

image.png

9、更改main.c文件

因为我们板子用的是PA8点灯,所以将点灯的IO口改成PA8就好了;

image.png

至此,我们gd32310k-start项目目测的部分已经改完了,现在需要使用scon工具进行配置了;

10、打开scon工具,输入menuconfig命令,进入配置页面;

将控制的输出口改成uart0(根据自己的需求,也可以不改,当是改了的话,对应硬件驱动也要改过来)

image.png

image.png

由于我们这颗芯片SRAM太小,我们需要关闭一些用不到的

image.png

image.png

这里关闭workqueue,占用空间大,容易导致运行挂了。

image.png

image.png

配置完之后,保存退出;

执行命令: scons --target=mdk5 生成mdk5工程文件

11、解决驱动的BUG,目前这里仅出来drv\_gpio和drv\_uart两个

11.1、打开生成的mdk5文件,编译。。。

image.png

发现drv\_gpio.c报错

打开drv\_gpio.h发现,没有包含gd32f31x\_gpio.h的头文件

image.png

那么,包含一下:

image.png

编译,继续报错,而且还是刚才的错误。。。

image.png

那么,查找下GPIO\_PORT\_SOURCE\_GPIOA,真没有,那就查找下EXTI\_SOURCE\_GPIOA,

image.png

有了,那就好办了,说明只要选择上面一部分就好了,不要下面部分。代码处理如下:

image.png

继续编译,发现中断编译不通过。。。

image.png

这个就简单了,一般跑去看下gd32f3x0.h头文件就好了。那就打开gd32f3x0.h。。。

image.png

然后将代码修改一下:

image.png

继续编译。。。

image.png

从头文件drv\_gpio.h来看,它应该是跟GD32F4xx一个样的

image.png

那么。。。凡是遇到SOC\_SERIES\_GD32F4xx改成defined (SOC\_SERIES\_GD32F4xx) || defined (SOC\_SERIES\_GD32F3x0)即可

image.png

继续编译,嗯???

image.png

找到rcu\_periph\_clock\_enable这个函数,发现并没有RCU\_SYSCFG这个,那么用RCU\_CFGCMP(系统配置和比较器)吧

image.png

修改如下:

image.png

继续编译。。。drv\_gpio.c无报错,说明这个文件的BUG已经解决完毕;

11.2、接下来解决drv\_uart.c的BUG,编译有如下错误:

image.png

发现有 SOC\_SERIES\_GD32F4xx这个,,,那就好办了,在本文件和drv\_uart.h中发现它就统统改成(SOC\_SERIES\_GD32F4xx) || defined (SOC\_SERIES\_GD32F3x0),然后继续编译。。。

image.png

好激动,无警告,无错误。。。结束了吧???且慢,查看GD32F3x0\_shiyongzhinan\_Rev1.2.pdf手册发现

image.png

那么。。。

image.png

这里需要改成GPIO\_AF\_1 。
下载程序。。。复位重启。。。漂亮。。。
至此,移植rtthread操作系统完毕;
最后来一张运行图:
image.png
咦?发现剩余空间不是很多了。。。

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