本文由RT-Thread论坛用户@爱玩的小赵 原创发布:https://club.rt-thread.org/ask/article/ee67f1b59306ada8.html
【国产MCU移植】手把手教你使用RT-Thread制作GD32系列BSP
熟悉RT-Thread的朋友都知道,RT-Thread提供了许多BSP,但不是所有的板子都能找到相应的BSP,这时就需要移植新的BSP。RT-Thread的所有BSP中,最完善的BSP就是STM32系列,但从2020年下半年开始,国内出现史无前例的芯片缺货潮,我们参考STM32F103系列进行GD32F103系列的BSP制作。
我使用的是GD32F103VET6芯片进行移植,在文章的末尾附上本人gitee库。
**
1 BSP 框架制作
**
在具体移植GD32407V-START的BSP之前,先做好GD32的BSP架构。BSP 框架结构如下图所示:
在这里插入图片描述
GD32的BSP架构主要分为三个部分:libraries、tools和具体的Boards,其中libraries包含了GD32的通用库,包括每个系列的HAL以及适配RT-Thread的drivers;tools是生成工程的Python脚本工具;另外就是Boards文件,当然这里的Boards有很多,我这里值列举了GD32103C-eval。
这里先谈谈libraries和tools的构建,然后在后文单独讨论具体板级BSP的制作。
1.1 Libraries构建
Libraries文件夹包含兆易创新提供的HAL库,这个直接在兆易创新的官网就可以下载。
http://www.gd32mcu.com/cn/download/0?kw=GD32F1
然后将HAL库(GD32F10x_Firmware_Library)复制到libraries目录下,重命名为GD32F10x_Firmware_Library,其他的系列类似
GD32F10x_Firmware_Library就是官方的文件,基本是不用动的,只是在文件夹中需要添加构建工程的脚本文件SConscript,其实也就是Python脚本。
SConscript文件的内容如下:
import rtconfig
from building import *
# get current directory
cwd = GetCurrentDir()
# The set of source files associated with this SConscript file.
src = Split('''
CMSIS/GD/GD32F10x/Source/system_gd32f10x.c
GD32F10x_standard_peripheral/Source/gd32f10x_gpio.c
GD32F10x_standard_peripheral/Source/gd32f10x_rcu.c
GD32F10x_standard_peripheral/Source/gd32f10x_exti.c
GD32F10x_standard_peripheral/Source/gd32f10x_misc.c
''')
if GetDepend(['RT_USING_SERIAL']):
src += ['GD32F10x_standard_peripheral/Source/gd32f10x_usart.c']
if GetDepend(['RT_USING_I2C']):
src += ['GD32F10x_standard_peripheral/Source/gd32f10x_i2c.c']
if GetDepend(['RT_USING_SPI']):
src += ['GD32F10x_standard_peripheral/Source/gd32f10x_spi.c']
if GetDepend(['RT_USING_CAN']):
src += ['GD32F10x_standard_peripheral/Source/gd32f10x_can.c']
if GetDepend(['BSP_USING_ETH']):
src += ['GD32F10x_standard_peripheral/Source/gd32f10x_enet.c']
if GetDepend(['RT_USING_ADC']):
src += ['GD32F10x_standard_peripheral/Source/gd32f10x_adc.c']
if GetDepend(['RT_USING_DAC']):
src += ['GD32F10x_standard_peripheral/Source/gd32f10x_dac.c']
if GetDepend(['RT_USING_HWTIMER']):
src += ['GD32F10x_standard_peripheral/Source/gd32f10x_timer.c']
if GetDepend(['RT_USING_RTC']):
src += ['GD32F10x_standard_peripheral/Source/gd32f10x_rtc.c']
src += ['GD32F10x_standard_peripheral/Source/gd32f10x_pmu.c']
if GetDepend(['RT_USING_WDT']):
src += ['GD32F10x_standard_peripheral/Source/gd32f10x_wwdgt.c']
src += ['GD32F10x_standard_peripheral/Source/gd32f10x_fwdgt.c']
if GetDepend(['RT_USING_SDIO']):
src += ['GD32F10x_standard_peripheral/Source/gd32f10x_sdio.c']
path = [
cwd + '/CMSIS/GD/GD32F10x/Include',
cwd + '/CMSIS',
cwd + '/GD32F10x_standard_peripheral/Include',]
CPPDEFINES = ['USE_STDPERIPH_DRIVER']
group = DefineGroup('Libraries', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES)
Return('group')
该文件主要的作用就是添加库文件和头文件路径,一部分文件是属于基础文件,因此直接调用Python库的Split包含,另外一部分文件是根据实际的应用需求添加的。
接下来说说Kconfig文件,这里是对内核和组件的功能进行配置,对RT-Thread的组件进行自由裁剪。
如果使用RT-Thread studio,则通过RT-Thread Setting可以体现Kconfig文件的作用。
如果使用ENV环境,则在使用 menuconfig配置和裁剪 RT-Thread时体现。
后面所有的Kconfig文件都是一样的逻辑。下表列举一些常用的Kconfig句法规则。
Kconfig的语法规则网上资料很多,自行去学习吧。
bsp/gd32/Kconfig内容如下:
config SOC_FAMILY_GD32
bool
config SOC_SERIES_GD32F1
bool
select ARCH_ARM_CORTEX_M3
select SOC_FAMILY_GD32
config SOC_SERIES_GD32F2
bool
select ARCH_ARM_CORTEX_M3
select SOC_FAMILY_GD32
config SOC_SERIES_GD32F3
bool
select ARCH_ARM_CORTEX_M4
select SOC_FAMILY_GD32
config SOC_SERIES_GD32F4
bool
select ARCH_ARM_CORTEX_M4
select SOC_FAMILY_GD32
最后谈谈HAL_Drivers,这个文件夹就是GD32的外设驱动文件夹,为上层应用提供调用接口。
好了,先看E:\RT_Thread\GD32_BSP\rt_thread_code\bsp\gd32f103\libraries\gd32_drivers/SConscript文件。
Import('RTT_ROOT')
Import('rtconfig')
from building import *
cwd = GetCurrentDir()
# add the general drivers.
src = Split("""
""")
# add pin drivers.
if GetDepend('RT_USING_PIN'):
src += ['drv_gpio.c']
# add usart drivers.
if GetDepend(['RT_USING_SERIAL']):
src += ['drv_usart.c']
# add i2c drivers.
if GetDepend(['RT_USING_I2C', 'RT_USING_I2C_BITOPS']):
if GetDepend('BSP_USING_I2C0') or GetDepend('BSP_USING_I2C1') or GetDepend('BSP_USING_I2C2') or GetDepend('BSP_USING_I2C3'):
src += ['drv_soft_i2c.c']
# add spi drivers.
if GetDepend('RT_USING_SPI'):
src += ['drv_spi.c']
# add spi flash drivers.
if GetDepend('RT_USING_SFUD'):
src += ['drv_spi_flash.c', 'drv_spi.c']
if GetDepend('RT_USING_WDT'):
src += ['drv_wdt.c']
if GetDepend('RT_USING_RTC'):
src += ['drv_rtc.c']
if GetDepend('RT_USING_HWTIMER'):
src += ['