1 RT_Thread的BSP框架介绍
BSP 框架结构如下图所示:

每一个 APM32 BSP 主要由两部分组成,分别是通用驱动库、特定开发板 BSP,下面的表格以 APM32F1 系列为例介绍这几个部分:

2 知识储备
制作一个 BSP 的过程就是构建一个新系统的过程,因此想要制作出好用的 BSP,要对 RT-Thread 系统的构建过程有一定了解,需要的知识准备如下所示:
-
掌握 APM32 系列 BSP 的使用方法了解 BSP 的使用方法,可以阅读 BSP 说明文档 中使用教程表格内的文档。
-
了解 Scons 工程构建方法RT-Thread 使用 Scons 作为系统的构建工具,因此了解 Scons 的常用命令对制作新 BSP 是基本要求。
-
了解设备驱动框架在 RT-Thread 系统中,应用程序通过设备驱动框架来操作硬件,因此了解设备驱动框架,对添加 BSP 驱动是很重要的。
-
了解 Kconfig 语法RT-Thread 系统通过 menuconfig 的方式进行配置,而 menuconfig 中的选项是由 Kconfig 文件决定的,因此想要对 RT-Thread 系统进行配置,需要对 kconfig 语法有一定了解。
3 BSP制作方法
下面以制作 APM32E103ZE-EVAL 开发板 BSP 为例,讲解如何为一个新的开发板添加 BSP。
BSP 的制作过程分为如下步骤:
-
复制基础工程
-
配置工程模板
-
修改BSP根目录下的SConstruct构建脚本
-
修改Kconfig选项
-
修改board目录下的工程构建和配置文件
-
重新生成工程
3.1 复制基础工程
我们制作一个新的BSP包,不用从零开始一点点的把文件添加进来。我们可以先找到一份和你要制作的MCU BSP内核相似的现有APM32 BSP,然后复制一份即可。比如,我要制作APM32E103-EVAL 板的BSP包,那么我只要复制一份和 APM32E103 内核相近的现有APM32 BSP,如复制一份现有的 apm32f103xe-minibroard 这个BSP包,然后重命名为自己要制作的BSP包,然后再次基础上进行修改即可。
3.2 配置工程模板
BSP 根目录下的 template 文件就是生成 MDK/IAR 平台的工程模板,我们制作一个BSP时需要修改这些工程模板,比如使用的芯片型号、下载方式等。

下面介绍 MDK5 工程模板的修改:
-
双击 template.uvprojx 打开工程模板。

-
修改芯片型号,根据自己的目标板子的芯片型号进行选择。

-
Output选项配置:修改输出的可执行文件名为 rtthread 。

-
Debug选项配置:修改调试工具为 J-Link.

-
修改下载算法:

3.3 修改BSP根目录下的SConstruct构建脚本
BSP根目录下的 SConstruct 脚本文件,是链接整个工程需要依赖的文件的,并且调用make程序进行编译工程。修改后的内容如下:
复制
import osimport sysimport rtconfigif os.getenv('RTT_ROOT'):RTT_ROOT = os.getenv('RTT_ROOT')else:RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..')sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]try:from building import *except:print('Cannot found RT-Thread root directory, please check RTT_ROOT')print(RTT_ROOT)exit(-1)TARGET = 'rtthread.' + rtconfig.TARGET_EXTDefaultEnvironment(tools=[])env = Environment(tools = ['mingw'],AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,CC = rtconfig.CC, CFLAGS = rtconfig.CFLAGS,AR = rtconfig.AR, ARFLAGS = '-rc',CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)env.PrependENVPath('PATH', rtconfig.EXEC_PATH)if rtconfig.PLATFORM in ['iccarm']:env.Replace(CCCOM = ['$CC $CFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])env.Replace(ARFLAGS = [''])env.Replace(LINKCOM = env["LINKCOM"] + ' --map rtthread.map')Export('RTT_ROOT')Export('rtconfig')SDK_ROOT = os.path.abspath('./')if os.path.exists(SDK_ROOT + '/libraries'):libraries_path_prefix = SDK_ROOT + '/libraries'else:libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries'SDK_LIB = libraries_path_prefixExport('SDK_LIB')# prepare building environmentobjs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)apm32_library = 'APM32E10x_Library'rtconfig.BSP_LIBRARY_TYPE = apm32_library# include librariesobjs.extend(SConscript(os.path.join(libraries_path_prefix, apm32_library, 'SConscript')))# include driversobjs.extend(SConscript(os.path.join(libraries_path_prefix, 'Drivers', 'SConscript')))# make a buildingDoBuilding(TARGET, objs)
我们只要修改 apm32_library 这个变量的文件名称即可,也就是该BSP依赖的是哪个固件库。
3.4 修改Kconfig选项
在本小节中修改 board/Kconfig 和 libraries/Kconfig 文件的内容有如下两点:
-
芯片型号和系列
-
BSP 上的外设支持选项
芯片系列的定义在apm32\libraries\Kconfig 中,修改前先确认是否存在添加的芯片系列定义,如果是一个未添加的系列,需要先添加该芯片系列的定义。芯片型号和系列的命名格式如下表所示。

1.添加芯片系列:

2.添加 BSP 上的外设支持选项
关于 BSP 上的外设支持选项,一个初次提交的 BSP 仅仅需要支持 GPIO 驱动和串口驱动即可,因此在配置选项中只需保留这两个驱动配置项,如下图所示:

3.5 修改board目录下的工程构建和配置文件
1.修改board/SConscript脚本文件。
board/SConscript 脚本决定 MDK/IAR 工程的生成以及编译过程中要添加文件。
该文件主要添加board文件夹的.c文件和头文件路径,还有需要修改芯片型号以及芯片启动文件路径,修改内容如下图所示:

2.修改board.h文件。
apm32 的 board/board.h 文件,主要是包含了整个工程要用到的固件库头文件,我们要把用到的固件库头文件都写在board.h文件中,还有需要根据BSP所使用的芯片型号修改 FALSH 和 RAM 的大小。
比如本次制作的 BSP 包用的芯片型号是 APM32E103ZE ,那么就要用到的该型号的基本的固件库头文件包含进来,而且还要修改flash大小为512KB,ram大小为128KB,具体内容如下:
复制
#ifndef __BOARD_H__#define __BOARD_H__#include <rtthread.h>#include <apm32e10x.h>#include "apm32e10x_gpio.h"#include "apm32e10x_rcm.h"#include "apm32e10x_misc.h"#include "apm32e10x_rcm.h"#include "apm32e10x_eint.h"#include "apm32e10x_usart.h"#include "apm32e10x_dma.h"#if defined(RT_USING_ADC)#include "apm32e10x_adc.h"#endif#if defined(RT_USING_DAC)#include "apm32e10x_dac.h"#endif#if defined(RT_USING_RTC)#include "apm32e10x_rtc.h"#include "apm32e10x_pmu.h"#endif#if defined(RT_USING_SPI)#include "apm32e10x_spi.h"#endif#if defined(RT_USING_HWTIMER) || defined(RT_USING_PWM)#include "apm32e10x_tmr.h"#endif#if defined(RT_USING_WDT)#include "apm32e10x_iwdt.h"#include "apm32e10x_wwdt.h"#endif#if defined(BSP_USING_SDCARD)#include "apm32e10x_sdio.h"#endif#if defined(BSP_USING_ON_CHIP_FLASH)#include "apm32e10x_fmc.h"#endif#if defined(RT_USING_CAN)#include "apm32e10x_can.h"#endif#if defined(BSP_USING_SDRAM)#include "apm32e10x_dmc.h"#endif#include "drv_common.h"#include "drv_gpio.h"#ifdef __cplusplusextern "C" {#endif#define APM32_FLASH_START_ADRESS ((uint32_t)0x08000000)#define APM32_FLASH_SIZE (512 * 1024)#define APM32_FLASH_END_ADDRESS ((uint32_t)(APM32_FLASH_START_ADRESS + APM32_FLASH_SIZE))/* Internal SRAM memory size[Kbytes] <6-128>, Default: 128 */#define APM32_SRAM_SIZE 128#define APM32_SRAM_END (0x20000000 + APM32_SRAM_SIZE * 1024)#if defined(__ARMCC_VERSION)extern int Image$$RW_IRAM1$$ZI$$Limit;#define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit)#elif __ICCARM__#pragma section="CSTACK"#define HEAP_BEGIN (__segment_end("CSTACK"))#elseextern int __bss_end;#define HEAP_BEGIN ((void *)&__bss_end)#endif#define HEAP_END APM32_SRAM_ENDvoid SystemClock_Config(void);void apm32_usart_init(void);#ifdef __cplusplus}#endif#endif /* __BOARD_H__ */
3.修改链接脚本。
链接脚本文件存放在 board/linker_scripts 目录下,包含了3个平台的链接脚本文件:

-
link.sct 文件该文件是Keil平台的链接文件,修改如下:

-
link.icf 文件该文件是 IAR 平台的链接文件,修改如下:

-
link.lds该文件是 GCC 平台的链接文件,修改如下:

3.6 重新生成工程
重新生成工程需要使用 Env 工具。
1.重新生成 rtconfig.h 文件。
在 Env 界面输入命令 menuconfig 对工程进行配置,并生成新的 rtconfig.h 文件。如下图所示:

然后打开一个工程所必须的 GPIO 和 UART 外设驱动:

然后保存退出即可。
2.重新生成MDK/IAR工程。
下面以重新生成 MDK 工程为例,介绍如何重新生成 BSP 工程。
使用 env 工具输入命令 scons --target=mdk5 重新生成工程,如下图所示:

到这一步为止,新的 BSP 就可以使用了。
如果想要生成IAR平台的还可以使用scons --target=iar 命令来生成 IAR 平台的工程。



















---------------------
作者:luobeihai
链接:https://bbs.21ic.com/icview-3501389-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。
—— BSP包的制作教程&spm=1001.2101.3001.5002&articleId=162211852&d=1&t=3&u=5e6f9bdb19cc443e8d3805866ae1cd1b)
1890

被折叠的 条评论
为什么被折叠?



