【国产MCU移植】手把手教你使用RT-Thread制作GD32F103系列BSP

本文详细介绍了如何使用RT-Thread制作GD32F103系列的BSP,包括BSP框架制作、HAL库的构建、Python脚本工具的创建以及具体的BSP移植步骤,如Keil环境配置、工程制作等。适合嵌入式硬件开发者参考。
摘要由CSDN通过智能技术生成

本文由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 框架结构如下图所示:
在这里插入图片描述
9f7e6ccb3bdd46e7878f6a700dd44997.png

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,其他的系列类似
bc9f564d7557f4724a83a04ecadb1663.png
GD32F10x_Firmware_Library就是官方的文件,基本是不用动的,只是在文件夹中需要添加构建工程的脚本文件SConscript,其实也就是Python脚本。
7a588809191cf6065e2caf4dd1234c2e.png
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文件的作用。
760eb2bc867748bc93a170686136d35e.png
如果使用ENV环境,则在使用 menuconfig配置和裁剪 RT-Thread时体现。
8aa44fe3a4f94fe783d57482011ed376.png
后面所有的Kconfig文件都是一样的逻辑。下表列举一些常用的Kconfig句法规则。aeed50adcc294b71aeb6fe6ecc6e6947.png
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的外设驱动文件夹,为上层应用提供调用接口。
65f7b0e02708474f889d10f933066857.png.webp
好了,先看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 += ['
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值