☰
RT-Thread STM32H7 系列 BSP 模板全解析:从开发板快速上手到 ENV 进阶配置实战
2026/9/26 2:21:29 网站建设 项目流程
  • 操作系统
  • 嵌入式
  • 物联网
  • 嵌入式OS
  • RTOS

【免费下载链接】rt-thread

RT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/

项目地址:https://gitcode.com/gh_mirrors/rt/rt-thread
点击查看免费下载

本篇技术指南围绕 RT-Thread 开源仓库中面向 STM32H7 系列的 BSP 模板(bsp/stm32/libraries/templates/stm32h7xx/README.md)展开,系统讲解该模板所对应的开发板资源、外设支持现状、MDK/IAR/GCC 多环境下的快速上手流程,以及基于 ENV 工具与 menuconfig 的进阶配置方法。读者学完后,既能在一小时内把 RT-Thread 跑上 STM32H7 开发板并看到 LED 闪烁与 msh 终端输出,也能掌握 BSP 外设使能的完整工程链路,为后续移植与驱动开发打下基础。

模板文档定位:什么是 STM32H7 的 BSP README 模板

在 RT-Thread 仓库中,bsp/stm32/libraries/templates/stm32h7xx/ 目录存放的是面向 STM32H7 系列芯片的 BSP(Board Support Package,板级支持包)标准模板。该目录下的 README.md 是一份"模板说明文档":它既是 STM32H743 系列开发板 BSP 的完整使用说明,也为后续基于同一芯片系列新建开发板 BSP 提供了可直接套用的文档骨架。

模板文档的主体结构清晰,分为三大模块:

  • 开发板介绍:梳理板载资源(MCU、外部存储、常用外设、接口与调试方式);
  • 外设支持:以表格形式逐项列出板载外设与片上外设的驱动支持状态;
  • 使用说明:拆分为"快速上手"与"进阶使用"两个章节,分别面向初次接触 RT-Thread 的新手和需要驱动更多板载资源的中高级开发者。

从仓库目录结构看,该模板并非孤立存在:同目录下还包含applications/main.c(用户主程序)、board/board.c(时钟与板级初始化)、board/board.h(内存布局与堆区定义)、board/Kconfig(片上外设菜单配置)、project.uvprojx(MDK5 工程)以及project.ewp/project.eww(IAR 工程)等配套文件,模板文档中的每个操作步骤都能在这些源码与工程文件中找到对应实现。

开发板资源介绍:以 STM32H743 为核心的板载配置

模板文档以一款典型的 STM32H7 开发板为例展开介绍,其核心参数如下:

  • MCU:STM32H743,主频 400MHz,2MB FLASH,1MB RAM;
  • 外部 SDRAM:W9825G6KH,32MB;
  • 外部 NAND FLASH:H27U4G8F2,512MB;
  • 外部 FLASH:W25Q256,32MB;
  • 常用外设:LED 2 个(DS0 红色接 PB1,DS1 绿色接 PB0);按键 4 个(KEY_UP 兼具唤醒功能接 PA0,K0 接 PH3,K1 接 PH2,K2 接 PC13);
  • 常用接口:USB 转串口、SD 卡接口、以太网接口、LCD 接口等;
  • 调试接口:标准 JTAG/SWD。

开发板外观如下:

上述资源描述与模板工程中的源码相互印证。例如 applications/main.c 中通过#define LED0_PIN GET_PIN(B, 1)定义 LED0 引脚,与文档所述"DS0 红色 LED 接 PB1"完全一致;rtconfig.h 中的#define SOC_STM32H743II则对应 STM32H743II 型号(II 后缀表示 176 引脚、2MB Flash 的封装)。模板文档要求维护者在"开发板介绍"一节补全自己开发板的具体照片与资源清单,最终产出的文档即为该 BSP 面向用户的使用手册。

外设支持状态:模板 BSP 的默认驱动边界

模板文档用一张双分区表格明确标注了外设的支持现状,这是评估 BSP 成熟度、决定后续配置方向的关键依据:

板载外设支持情况备注
USB 转串口支持
QSPI Flash暂不支持
以太网暂不支持
SD 卡暂不支持
CAN暂不支持
SDRAM暂不支持
MPU9250 六轴传感器暂不支持
片上外设支持情况备注
GPIO支持PA0, PA1... PK15 ---> PIN: 0, 1...176
UART支持
SPI暂不支持
I2C暂不支持
SDIO暂不支持即将支持
RTC暂不支持即将支持
PWM暂不支持即将支持
USB Device暂不支持即将支持
USB Host暂不支持即将支持
IWG暂不支持即将支持

这张表在源码中有直接的对应关系:查看 board/Kconfig 可以发现,默认使能的片上外设仅有 GPIO 与 UART(BSP_USING_GPIO、BSP_USING_UART、BSP_USING_UART1均为默认开启),其余外设对应的驱动配置项虽已通过source "$(BSP_DIR)/../libraries/HAL_Drivers/drivers/Kconfig"引入菜单体系,但默认处于关闭状态,这正与"暂不支持"的表格标注吻合。GPIO 引脚编号说明(PA0, PA1...PK15 对应 PIN: 0, 1...176)则揭示了 RT-Thread PIN 设备框架的编号规则:片上引脚被顺序映射为统一的逻辑编号,供rt_pin_write、rt_pin_read等统一 API 使用。

快速上手:MDK5 环境下把 RT-Thread 跑起来

"快速上手"章节面向刚接触 RT-Thread 的新手,模板 BSP 同时提供 MDK4、MDK5、IAR 工程并支持 GCC 开发环境,下面以 MDK5 为例介绍完整流程。

硬件连接

使用数据线将开发板连接至 PC,并打开电源开关。

编译下载

双击 project.uvprojx 打开 MDK5 工程,编译并下载程序到开发板。

工程默认配置使用 ST_LINK 仿真器下载程序,在通过 ST_LINK 连接开发板的基础上,点击下载按钮即可将程序下载到开发板。

运行结果与验证

下载程序成功后,系统会自动运行,板载 LED 开始闪烁。这一现象背后的实现位于 applications/main.c:

#include <rtthread.h> #include <rtdevice.h> #include <board.h> /* defined the LED0 pin: PB1 */ #define LED0_PIN GET_PIN(B, 1) int main(void) { int count = 1; /* set LED0 pin mode to output */ rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); while (count++) { rt_pin_write(LED0_PIN, PIN_HIGH); rt_thread_mdelay(500); rt_pin_write(LED0_PIN, PIN_LOW); rt_thread_mdelay(500); } return RT_EOK; }

可以看到,程序先通过rt_pin_mode将 PB1 配置为输出模式,随后在主循环中交替置高/置低该引脚,每次状态翻转间调用rt_thread_mdelay(500)延时 500ms——这正是 LED 以 1 秒为周期闪烁的原因。rt_thread_mdelay会主动让出 CPU,体现 RTOS 下"延时即让出调度"的典型写法,而非裸机式的忙等待。

接着连接开发板对应串口到 PC,在终端工具中打开相应串口(参数 115200-8-1-N),复位设备后即可看到 RT-Thread 的启动输出信息:

\ | / - RT - Thread Operating System / | \ 4.0.1 build Mar 5 2019 2006 - 2019 Copyright by rt-thread team msh >

出现msh >提示符即代表系统内核、串口驱动与 FinSH 组件均已正常启动。这里的msh(Module Shell)是 RT-Thread 提供的命令行交互环境,可用于执行系统命令与调试操作;串口号 uart1 的默认配置可在 rtconfig.h 中看到:#define RT_CONSOLE_DEVICE_NAME "uart1"将控制台绑定到串口 1。模板 BSP 默认开启了 GPIO、UART 与 FinSH/msh(见 rtconfig.h 中RT_USING_MSH、FINSH_USING_MSH、RT_USING_SERIAL、RT_USING_PIN等宏定义),因此这一"开箱即用"的效果是模板工程默认配置的直接体现。

进阶使用:用 ENV 工具开启更多板载资源

模板 BSP 默认只开启了 GPIO 和串口 1 的功能。如果需要使用 SD 卡、Flash 等更多高级功能,需要利用 ENV 工具对 BSP 进行配置。ENV 是 RT-Thread 官方的开发辅助工具(仓库 tools/ 目录下的 sconsui.py、building.py、package.py 等脚本即为工程构建与软件包管理的底层实现),其核心工作流如下:

  1. 进入 BSP 目录打开 ENV 工具:在 bsp 目录下打开 env 工具(其命令行入口已切换到当前 BSP 根目录)。

  2. 执行menuconfig配置工程:输入menuconfig命令进入图形化配置界面,按需开启外设与组件,配置完成后保存退出。该命令读取 Kconfig 定义的菜单树:顶层文件通过source "$(RTT_DIR)/Kconfig"引入内核配置、osource "$PKGS_DIR/Kconfig"引入软件包配置、rsource "../libraries/Kconfig"引入 STM32 系列公共库配置,而片上外设的开关则集中在 board/Kconfig 的 "On-chip Peripheral Drivers" 菜单中。开发者只需在菜单中勾选目标外设(例如开启 SPI、SDIO、RTC 等),即可获得对应的BSP_USING_XXX宏。

  3. 执行pkgs --update更新软件包:STM32 HAL/CMSIS 驱动由软件包提供,首次从模板创建 BSP 或修改配置后,需要先执行该命令下载依赖;如果没有拉取到软件包,请先执行pkgs --upgrade更新软件包索引,再重新执行pkgs --update。这一点可在 rtconfig.h 中印证:默认配置已声明PKG_USING_STM32H7_HAL_DRIVER与PKG_USING_STM32H7_CMSIS_DRIVER,即 STM32H7 的 HAL 库与 CMSIS 驱动均以软件包形式管理,必须通过网络拉取后才能完成编译。

  4. 执行scons --target=mdk4/mdk5/iar重新生成工程:配置变更后需重新生成 MDK/IAR 工程文件,使新使能的外设驱动源码被纳入构建。若使用 GCC 工具链,直接执行scons即可编译整个工程。

menuconfig生成的配置会写回 rtconfig.h,该文件是整个 BSP 编译期的"配置中枢":内核选项(RT_TICK_PER_SECOND、RT_NAME_MAX等)、组件选项(RT_USING_MSH、RT_USING_SERIAL等)以及外设选项(BSP_USING_GPIO、BSP_USING_UART1)全部以宏定义形式集中于此,SConscript 则通过env.Append(CPPDEFINES = ['STM32H743xx'])为编译过程注入芯片型号宏,保证 HAL 库与驱动代码按 STM32H743 的寄存器定义展开。

关于各类外设驱动的更详细使用教程(如具体外设驱动的使能方法、API 调用示例、常见问题排查),请参考 STM32 系列 BSP 外设驱动使用教程,该文档位于 bsp/stm32/docs 目录,是 STM32 全系列 BSP 外设开发的核心参考。

从模板到源码:BSP 底层的板级初始化链路

进阶配置之外,理解模板 BSP 的底层初始化逻辑,有助于开发者从零开始裁剪或新建自己的 STM32H7 板级支持包。模板 BSP 的板级初始化主要分布在 board/board.c 与 board/board.h 中。

时钟配置:SystemClock_Config()完成系统时钟树的初始化——启用 HSE 外部高速晶振作为 PLL 输入源,通过 PLLM=5、PLLN=160、PLLP=2 的分频倍频组合得到系统时钟,并将 SYSCLK、HCLK、APB1/APB2/APB3/APB4 各总线时钟域配置为对应分频,最后为 USART1 选择 D2PCLK2 作为外设时钟源。这套配置直接支撑了 400MHz 主频目标下的稳定运行,也是串口能够以 115200 波特率正常输出的前提。

内存布局与堆区:由于 RT-Thread 的堆内存管理需要知道可用 RAM 的边界,board/board.h 中定义了:

#define STM32_FLASH_START_ADRESS ((uint32_t)0x08000000) #define STM32_FLASH_SIZE (2048 * 1024) #define STM32_FLASH_END_ADDRESS ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE)) #define STM32_SRAM_SIZE (512) #define STM32_SRAM_END (0x24000000 + STM32_SRAM_SIZE * 1024) #if defined(__ARMCC_VERSION) extern int Image$$RW_IRAM1$$ZI$$Limit; #define HEAP_BEGIN (&Image$$RW_IRAM1$$ZI$$Limit) #elif __ICCARM__ #pragma section="CSTACK" #define HEAP_BEGIN (__segment_end("CSTACK")) #else extern int __bss_end; #define HEAP_BEGIN (&__bss_end) #endif #define HEAP_END STM32_SRAM_END

其中HEAP_BEGIN根据编译工具链的不同而不同:MDK(ARMCC)下取自链接器生成的Image$$RW_IRAM1$$ZI$$Limit,IAR 下取自 CSTACK 段末尾,GCC 下取自__bss_end;HEAP_END指向 0x24000000 起始的 512KB SRAM 末尾。这种"编译器无关"的写法正是模板 BSP 能同时支持 MDK、IAR、GCC 三种开发环境的关键设计之一。

注意事项与模板填写约定

模板文档末尾预留了"注意事项"与"联系人信息"两节,作为 BSP 维护者完善文档的固定占位:注意事项用于记录已知问题、硬件勘误或特殊使用限制;联系人信息则填写 BSP 维护人姓名、主页与邮箱,便于使用者反馈问题。此外,模板中xxx占位符与开发板照片、资源清单等内容都需要维护者按实际硬件替换——这也是"模板"这一目录定位的体现:它同时服务于"最终用户的 BSP 使用手册"与"新 BSP 开发者的文档起点"两个角色。

总结:一份文档贯通的上手链路

综合来看,这份 STM32H7 系列 BSP 模板 README 虽篇幅精简,却完整覆盖了 BSP 使用的三条主线:资源认知(开发板硬件与外设支持矩阵)、快速验证(MDK5 编译下载 → LED 闪烁 → 串口 msh 输出)、能力扩展(ENV 工具 + menuconfig + 软件包更新 + scons 重新生成工程)。配合 board/Kconfig、board/board.c、applications/main.c 等源码,开发者可以清晰地看到"配置宏 → 驱动编译 → 设备注册 → 用户程序调用"的完整链路。对于需要驱动 SD 卡、Flash、网络等更多资源的场景,直接进入 STM32 系列 BSP 外设驱动使用教程 按需查阅即可。

  • 操作系统
  • 嵌入式
  • 物联网
  • 嵌入式OS
  • RTOS

【免费下载链接】rt-thread

RT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/

项目地址:https://gitcode.com/gh_mirrors/rt/rt-thread
点击查看免费下载

相关推荐

上一篇:OpenDesign kami(紙/纸)设计系统实战指南:从包契约到打印级排版的完整落地
下一篇:MOSS-Audio-8B-Thinking环境配置指南:从零开始搭建完整音频AI开发环境

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询