[APM32F4] APM32系列的RT-Thread外设驱动适配教程(一)—— BSP包的制作教程

📅 发布时间:2026/7/9 18:46:16 👁️ 浏览次数:
[APM32F4] APM32系列的RT-Thread外设驱动适配教程(一)—— BSP包的制作教程
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程序进行编译工程。修改后的内容如下复制importosimport sysimport rtconfigifos.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)ifrtconfig.PLATFORMin[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(./)ifos.path.exists(SDK_ROOT /libraries):libraries_path_prefix SDK_ROOT /librarieselse:libraries_path_prefix os.path.dirname(SDK_ROOT) /librariesSDK_LIB libraries_path_prefixExport(SDK_LIB)# prepare building environmentobjs PrepareBuilding(env, RTT_ROOT, has_libcpuFalse)apm32_library APM32E10x_Libraryrtconfig.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大小为512KBram大小为128KB具体内容如下复制#ifndef __BOARD_H__#define __BOARD_H__#includertthread.h#includeapm32e10x.h#includeapm32e10x_gpio.h#includeapm32e10x_rcm.h#includeapm32e10x_misc.h#includeapm32e10x_rcm.h#includeapm32e10x_eint.h#includeapm32e10x_usart.h#includeapm32e10x_dma.h#if defined(RT_USING_ADC)#includeapm32e10x_adc.h#endif#if defined(RT_USING_DAC)#includeapm32e10x_dac.h#endif#if defined(RT_USING_RTC)#includeapm32e10x_rtc.h#includeapm32e10x_pmu.h#endif#if defined(RT_USING_SPI)#includeapm32e10x_spi.h#endif#if defined(RT_USING_HWTIMER) || defined(RT_USING_PWM)#includeapm32e10x_tmr.h#endif#if defined(RT_USING_WDT)#includeapm32e10x_iwdt.h#includeapm32e10x_wwdt.h#endif#if defined(BSP_USING_SDCARD)#includeapm32e10x_sdio.h#endif#if defined(BSP_USING_ON_CHIP_FLASH)#includeapm32e10x_fmc.h#endif#if defined(RT_USING_CAN)#includeapm32e10x_can.h#endif#if defined(BSP_USING_SDRAM)#includeapm32e10x_dmc.h#endif#includedrv_common.h#includedrv_gpio.h#ifdef __cplusplusexternC{#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)externintImage$$RW_IRAM1$$ZI$$Limit;#define HEAP_BEGIN ((void *)Image$$RW_IRAM1$$ZI$$Limit)#elif __ICCARM__#pragma sectionCSTACK#define HEAP_BEGIN (__segment_end(CSTACK))#elseexternint__bss_end;#define HEAP_BEGIN ((void *)__bss_end)#endif#define HEAP_END APM32_SRAM_ENDvoidSystemClock_Config(void);voidapm32_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 --targetmdk5 重新生成工程如下图所示到这一步为止新的 BSP 就可以使用了。如果想要生成IAR平台的还可以使用scons --targetiar 命令来生成 IAR 平台的工程。---------------------作者luobeihai链接https://bbs.21ic.com/icview-3501389-1-1.html来源21ic.com此文章已获得原创/原创奖标签著作权归21ic所有任何人未经允许禁止转载。