本文由RT-Thread论坛用户@BruceOu原创公布:https://club.rt-thread.org/ask/article/3043.html
相熟RT-Thread的敌人都晓得,RT-Thread提供了许多BSP,但不是所有的板子都能找到相应的BSP,这时就须要移植新的BSP。RT-Thread的所有BSP中,最欠缺的BSP就是STM32系列,但从2020年下半年开始,国内呈现前所未有的芯片缺货潮,芯片的交期和价格一直拉升,STM32的价格也是水涨船高,很多敌人也在思考应用国产代替,笔者应用的兆易翻新的GD32系列,我看了下RT-Thread中GD系列BSP,都是玩家各自为政,每个人都是提交本人应用的板子的BSP,充斥着大量冗余的代码,对于有强迫症的我就十分不爽,就依据手头的板子,参看STM32的BSP架构,构建了GD32的BSP架构。
笔者应用的开发板是兆易翻新设计的GD32407V-START开发板。其主控芯片为GD32F407VKT6,主频168MHz,外部3072K Flash,192KB SRAM,资源相当丰盛。
1 BSP 框架制作在具体移植GD32407V-START的BSP之前,先做好GD32的BSP架构。BSP 框架结构如下图所示:
GD32的BSP架构次要分为三个局部:libraries、tools和具体的Boards,其中libraries蕴含了GD32的通用库,包含每个系列的HAL以及适配RT-Thread的drivers;tools是生成工程的Python脚本工具;另外就是Boards文件,当然这里的Boards有很多,我这里值列举了GD32407V-START。
这里先谈谈libraries和tools的构建,而后在后文独自探讨具体板级BSP的制作。
1.1 Libraries构建Libraries文件夹蕴含兆易翻新提供的HAL库,这个间接在兆易翻新的官网就能够下载。
下载地址
而后将HAL库复制到libraries目录下,重命名为GD32F4xx_HAL,其余的系列相似。
GD32F4xx_HAL就是官网的文件,根本是不必动的,只是在文件夹中须要增加构建工程的脚本文件SConscript,其实也就是Python脚本。
SConscript文件的内容如下:
import rtconfig #导包from building import *# get current directorycwd = GetCurrentDir() #获取当然门路# The set of source files associated with this SConscript file.src = Split('''CMSIS/GD/GD32F4xx/Source/system_gd32f4xx.cGD32F4xx_standard_peripheral/Source/gd32f4xx_gpio.cGD32F4xx_standard_peripheral/Source/gd32f4xx_rcu.cGD32F4xx_standard_peripheral/Source/gd32f4xx_exti.cGD32F4xx_standard_peripheral/Source/gd32f4xx_misc.cGD32F4xx_standard_peripheral/Source/gd32f4xx_syscfg.c''')#将括号中的字符串宰割后成列表(list),以便蕴含到工程中 if GetDepend(['RT_USING_SERIAL']):#如果关上了RT_USING_SERIAL的宏,则会蕴含以下源文件 src += ['GD32F4xx_standard_peripheral/Source/gd32f4xx_usart.c'] if GetDepend(['RT_USING_I2C']): src += ['GD32F4xx_standard_peripheral/Source/gd32f4xx_i2c.c']if GetDepend(['RT_USING_SPI']): src += ['GD32F4xx_standard_peripheral/Source/gd32f4xx_spi.c']if GetDepend(['RT_USING_CAN']): src += ['GD32F4xx_standard_peripheral/Source/gd32f4xx_can.c']if GetDepend(['BSP_USING_ETH']): src += ['GD32F4xx_standard_peripheral/Source/gd32f4xx_enet.c']if GetDepend(['RT_USING_ADC']): src += ['GD32F4xx_standard_peripheral/Source/gd32f4xx_adc.c']if GetDepend(['RT_USING_DAC']): src += ['GD32F4xx_standard_peripheral/Source/gd32f4xx_dac.c']if GetDepend(['RT_USING_RTC']): src += ['GD32F4xx_standard_peripheral/Source/gd32f4xx_rtc.c']if GetDepend(['RT_USING_WDT']): src += ['GD32F4xx_standard_peripheral/Source/gd32f4xx_wwdgt.c'] src += ['GD32F4xx_standard_peripheral/Source/gd32f4xx_fwdgt.c']if GetDepend(['RT_USING_SDIO']): src += ['GD32F4xx_standard_peripheral/Source/gd32f4xx_sdio.c']#头文件门路path = [ cwd + '/CMSIS/GD/GD32F4xx/Include', cwd + '/CMSIS', cwd + '/GD32F4xx_standard_peripheral/Include',]CPPDEFINES = ['USE_STDPERIPH_DRIVER']#定义一个组,组名为'Libraries', depend为空示意依赖任何一个其余宏,另外以后的头文件门路增加到工程中group = DefineGroup('Libraries', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES)Return('group')该文件次要的作用就是增加库文件和头文件门路,一部分文件是属于根底文件,因而间接调用Python库的Split蕴含,另外一部分文件是依据理论的利用需要增加的。
...