一、开发环境
桌面操作系统: 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到自己的库,然后拉取到本地;
先Fork:
再拉取:
2、进入rt-thread的BSP目录(rt-thread\bsp\gd32):
将gd32305r-start复制然后粘贴,并且将其改名为:gd32310k-start
使用这份的原因是,同为F3系列的,同样都是Cortex-m4核,搞起来更容易些;
3、解压 GD32F3x0\_Firmware\_Library\_V2.2.0.rar 并且将Firmware文件夹放到rt-thread\bsp\gd32\libraries下
然后将Firmware改名为GD32F3x0\_Firmware\_Library:
然后将附近的GD32F30x\_Firmware\_Library文件夹下SConscript文件拷贝到本目录下:
4、将刚才两步所添加的所有文件先add和commit一下:
这样子的话,后续改动如果有问题可直接恢复,提高效率;
5、默认工程文件更改
5.1、解压GD32F3x0\_Demo\_Suites\_V2.2.0.rar,运行GigaDevice.GD32F3x0\_DFP.3.0.0.pack将MDK需要的库添加进软件
5.2、打开template.uvprojx更改默认工程文件;
然后保存并且退出软件;
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中
6、构建文件更改
6.1、打开gd32\gd32310k-start\SConstruct文件做如下修改:
将gd32\_library改成GD32F3x0的固件库GD32F3x0\_Firmware\_Library;
6.2、打开rt-thread\bsp\gd32\gd32310k-start\board\SConscript文件做如下更改:
更改后如下:
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
然后将多余的串口删掉(GD32F310K8芯片只有两个串口)
8、board文件夹下链接脚本更改
从GD32F310xx\_Datasheet\_Rev1.0.pdf文档里面可以看到:
我们这颗GD32F310K8T6芯片,有FLASH 64K(0x10000)和SRAM 8K(0x2000);
8.1、打开rt-thread\bsp\gd32\gd32310k-start\board\linker\_scripts目录下link.icf文件:
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文件:
8.3、打开rt-thread\bsp\gd32\gd32310k-start\board\linker\_scripts目录下link.icf文件:
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文件
9、更改main.c文件
因为我们板子用的是PA8点灯,所以将点灯的IO口改成PA8就好了;
至此,我们gd32310k-start项目目测的部分已经改完了,现在需要使用scon工具进行配置了;
10、打开scon工具,输入menuconfig命令,进入配置页面;
将控制的输出口改成uart0(根据自己的需求,也可以不改,当是改了的话,对应硬件驱动也要改过来)
由于我们这颗芯片SRAM太小,我们需要关闭一些用不到的
这里关闭workqueue,占用空间大,容易导致运行挂了。
配置完之后,保存退出;
执行命令: scons --target=mdk5 生成mdk5工程文件
11、解决驱动的BUG,目前这里仅出来drv\_gpio和drv\_uart两个
11.1、打开生成的mdk5文件,编译。。。
发现drv\_gpio.c报错
打开drv\_gpio.h发现,没有包含gd32f31x\_gpio.h的头文件
那么,包含一下:
编译,继续报错,而且还是刚才的错误。。。
那么,查找下GPIO\_PORT\_SOURCE\_GPIOA,真没有,那就查找下EXTI\_SOURCE\_GPIOA,
有了,那就好办了,说明只要选择上面一部分就好了,不要下面部分。代码处理如下:
继续编译,发现中断编译不通过。。。
这个就简单了,一般跑去看下gd32f3x0.h头文件就好了。那就打开gd32f3x0.h。。。
然后将代码修改一下:
继续编译。。。
从头文件drv\_gpio.h来看,它应该是跟GD32F4xx一个样的
那么。。。凡是遇到SOC\_SERIES\_GD32F4xx改成defined (SOC\_SERIES\_GD32F4xx) || defined (SOC\_SERIES\_GD32F3x0)即可
继续编译,嗯???
找到rcu\_periph\_clock\_enable这个函数,发现并没有RCU\_SYSCFG这个,那么用RCU\_CFGCMP(系统配置和比较器)吧
修改如下:
继续编译。。。drv\_gpio.c无报错,说明这个文件的BUG已经解决完毕;
11.2、接下来解决drv\_uart.c的BUG,编译有如下错误:
发现有 SOC\_SERIES\_GD32F4xx这个,,,那就好办了,在本文件和drv\_uart.h中发现它就统统改成(SOC\_SERIES\_GD32F4xx) || defined (SOC\_SERIES\_GD32F3x0),然后继续编译。。。
好激动,无警告,无错误。。。结束了吧???且慢,查看GD32F3x0\_shiyongzhinan\_Rev1.2.pdf手册发现
那么。。。
这里需要改成GPIO\_AF\_1 。
下载程序。。。复位重启。。。漂亮。。。
至此,移植rtthread操作系统完毕;
最后来一张运行图:
咦?发现剩余空间不是很多了。。。