GD32F427移植-RT-Thread标准版
GD32 移植RT-Thread标准版
1 前言
这篇文档主要记录自己基于BSP移植RTT标准板到GD32的过程。
目标芯片:GD32F427V
使用工具:keil、env
2 参考资料
【GD32F427开发板试用】从0开始到RTthread移植
【国产MCU移植】手把手教你使用RT-Thread制作GD32系列
3 移植步骤
3.1 下载官方的BSP文件
从git仓库下载官方仓库
git clone https://github.com/RT-Thread/rt-thread.git
3.2 找到BSP基础工程
RT仓库中已有许多GD的BSP,选择一个与自己的最接近的,这里我以GD32F407的作为基础模板进行修改。
进入目录:
rt-thread\bsp\gd32\arm
复制一份BSP文件并根据需要重命名
3.3 下载官方库文件并更新驱动
下载官方的hal库,因为会不断更新,所以最好下载一下。
解压复制替换到以下路径
gd32\arm\libraries
3.4 修改BSP构建脚本
修改board文件下的两个bsp脚本文件:
1.修改SConscript文件代码第25行为对应芯片型号:
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 + '/GD32F4xx_Firmware_Library/CMSIS/GD/GD32F4xx/Source/GCC/startup_gd32f4xx.s']
elif rtconfig.PLATFORM in ['armcc', 'armclang']:
src += [startup_path_prefix + '/GD32F4xx_Firmware_Library/CMSIS/GD/GD32F4xx/Source/ARM/startup_gd32f4xx.s']
elif rtconfig.PLATFORM in ['iccarm']:
src += [startup_path_prefix + '/GD32F4xx_Firmware_Library/CMSIS/GD/GD32F4xx/Source/IAR/startup_gd32f4xx.s']
//修改为对应的芯片型号
CPPDEFINES = ['GD32F427']
group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES)
Return('group')
2 修改Kconfig文件
menu "Hardware Drivers Config"
config SOC_SERIES_GD32F4xx
bool
default y
config SOC_GD32427V //修改芯片型号
bool
select SOC_SERIES_GD32F4xx
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
default y
menu "Onboard Peripheral Drivers"
-
修改keil链接文件:
.icf文件为IAR编译脚本、.ld为GCC编译脚本、.sct为mdk编译脚本。
主要修改RAM和ROM的起始地址。
这里的起始地址主要根据芯片手册来。F427VET的rom和ram大小为:
因为RAM大小为192K,所以设置为0X00030000;Faslh大小为512K,所以设置为:0x00080000;
; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00080000 { ; load region size_region ER_IROM1 0x08000000 0x00080000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00030000 { ; RW data .ANY (+RW +ZI) } }
3.5 修改工程模板
修改template工程,这样后续生成的时候可以根据这个生成
修改部分包括:芯片型号、DEBUG工具、FLASH和ROM地址。
这里的ROM和RAM地址设置方法和前面的一样。
3.6 映射串口的修改
rtt的rt_printf会选择对应的串口,所以确认自己使用的串口是不是driver.c定义的:
static const struct gd32_uart uart_obj[] = {
#ifdef BSP_USING_UART0
{
USART0, // uart peripheral index
USART0_IRQn, // uart iqrn
RCU_USART0, RCU_GPIOA, RCU_GPIOA, // periph clock, tx gpio clock, rt gpio clock
#if defined SOC_SERIES_GD32F4xx
GPIOA, GPIO_AF_7, GPIO_PIN_9, // tx port, tx alternate, tx pin
GPIOA, GPIO_AF_7, GPIO_PIN_10, // rx port, rx alternate, rx pin
#else
GPIOA, GPIO_PIN_9, // tx port, tx pin
GPIOA, GPIO_PIN_10, // rx port, rx pin
#endif
&serial0,
"uart0",
},
#endif
3.7 ENV工具配置串口
主要的配置BSP已经做了修改,精力放在外设的操作上即可。
ENV 的使用和配置参见官方
配置完成后编译:
scons
编译后生成keil工程:
scons --target=mdk5
3.8 下载验证
出现以下则代表移植成功。
个人意见:如果不需要RTT的软件生态,使用nano版本就足够了,但是秉持着不畏难的原则,还是把学着去接触标准版本。Nano的移植在我其他的文章里有提及。