GD32F427移植-RT-Thread标准版

发布时间 2023-09-25 20:02:09作者: Phoenix-Tree

GD32 移植RT-Thread标准版

1 前言

这篇文档主要记录自己基于BSP移植RTT标准板到GD32的过程。

目标芯片:GD32F427V

使用工具:keil、env

2 参考资料

【GD32F427开发板试用】从0开始到RTthread移植

教你动手移植RT-Thread到国产MCU

【国产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固件库

解压复制替换到以下路径

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"

  1. 修改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的移植在我其他的文章里有提及。