1. 课程导学与环境搭建
各位同学好,我是老周。做嵌入式这些年,从裸机到 RTOS,从 FreeRTOS 到 RT-Thread,踩过的坑不少。今天咱们开始这门《STM32 上 RT-Thread 外设驱动移植配置实战》的第一章——课程导学与环境搭建。
说实话,我刚开始接触 RT-Thread 的时候,也觉得不就是个操作系统嘛,跟裸机没啥大区别。直到有一次做工业控制项目,需要同时处理多个传感器、LCD 显示和网络通信,裸机那套轮询加中断的写法让我改到崩溃。后来切到 RT-Thread,任务调度、信号量、消息队列一套下来,代码结构清晰多了。嗯,从那以后我就成了 RT-Thread 的忠实用户。
1.1 RT-Thread 是什么?
RT-Thread 是一个开源的实时操作系统,主要面向物联网和嵌入式设备。它不像 Linux 那么重,也不像裸机那么原始。说白了,它就是个中间层——帮你管理 CPU 时间、内存资源、设备驱动,让你能专注于业务逻辑。
我个人习惯把 RT-Thread 分成三个层次来看:
| 层次 | 包含内容 | 作用 |
|---|---|---|
| 内核层 | 线程管理、IPC、内存管理、定时器 | 提供实时多任务能力 |
| 组件层 | 文件系统、网络协议栈、Shell、DFS | 丰富功能,降低开发难度 |
| 设备驱动层 | PIN、UART、I2C、SPI、ADC 等驱动框架 | 统一外设接口,方便移植 |
你想想看,如果每个外设都要自己从头写驱动,那得花多少时间?RT-Thread 把驱动框架搭好了,你只需要根据芯片手册填参数就行。这就是咱们这门课的核心——教你怎么填这些参数。
1.2 STM32 与 RT-Thread 的关系
STM32 是意法半导体的 ARM Cortex-M 系列 MCU,市场占有率很高。RT-Thread 对 STM32 的支持非常完善,几乎覆盖了所有主流型号。为什么选 STM32 来讲?
- 生态成熟:STM32 的 HAL 库和 LL 库很完善,BSP 移植工作量小
- 文档丰富:参考手册、勘误表、应用笔记都很全
- 调试方便:J-Link、ST-Link 都支持,串口打印也简单
- 性价比高:从 F0 到 H7,总有一款适合你的项目
我在项目中用过 STM32F103、F407、H743 搭配 RT-Thread。F103 做简单的传感器采集,H743 跑复杂的音视频处理。RT-Thread 在这上面的表现都很稳定。说白了,STM32 是硬件基础,RT-Thread 是软件骨架,两者配合好了,项目就成功了一半。
核心观点:RT-Thread 的 BSP(板级支持包)就是连接 STM32 硬件和 RT-Thread 内核的桥梁。咱们这门课,就是教你如何搭建和定制这座桥。
1.3 开发环境搭建
工欲善其事,必先利其器。开发环境选哪个?我建议你根据项目需求和个人习惯来。下面是我常用的三种环境对比:
| 环境 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|
| Keil MDK | 调试方便,工程管理成熟 | 收费,代码量大了编译慢 | 中小型项目,团队协作 |
| IAR EWARM | 编译优化好,代码密度高 | 界面老旧,学习曲线陡 | 对代码大小有严格要求的项目 |
| RT-Thread Studio | 免费,集成 RT-Thread 生态 | 插件机制还不够完善 | 个人开发,快速原型验证 |
我个人习惯用 RT-Thread Studio 做快速原型,用 Keil 做正式项目。为什么?因为 Studio 里集成了 RT-Thread 的包管理器,点几下就能添加组件,省去手动配置的麻烦。但 Keil 的调试功能更强大,尤其是做外设驱动调试的时候。
1.3.1 安装 RT-Thread Studio
这个最简单,去官网下载安装包,一路 Next 就行。安装完成后,打开软件,它会自动检测你的开发环境。我第一次用的时候,它提示我缺少 ARM GCC 工具链,点一下自动下载就搞定了。
小提示:安装路径不要有中文和空格,否则编译可能会报一些莫名其妙的错误。我曾经因为这个折腾了半天,最后发现是路径问题。
1.3.2 安装 Keil MDK
Keil 的安装稍微复杂一点。你需要先安装 MDK 核心,再安装对应芯片的器件包。以 STM32F407 为例:
- 下载并安装 MDK-ARM(建议 5.38 以上版本)
- 打开 Pack Installer,搜索 STM32F4xx_DFP
- 点击 Install,等待下载完成
- 安装 J-Link 或 ST-Link 驱动
我记得有一次帮同事装环境,他装完 Keil 后死活找不到 STM32F407 的芯片选项。后来发现是 Pack 没装对。嗯,这个坑大家注意一下。
1.3.3 验证环境
环境装好了,怎么验证?最简单的办法——编译一个空工程。RT-Thread Studio 里新建一个基于 STM32F407 的工程,直接点编译。如果控制台输出 "Build Finished",说明环境没问题。
Keil 的话,新建一个空工程,选好芯片,写个空的 main 函数,编译通过就行。
注意:如果编译报错提示找不到头文件,检查一下工程设置里的 Include Paths 是否包含了 CMSIS 和 HAL 库的路径。这是新手最容易犯的错误。
1.4 第一个点灯工程
点灯是嵌入式界的 Hello World。咱们用 RT-Thread Studio 来创建第一个工程。
1.4.1 创建工程
打开 RT-Thread Studio,点击 "新建 RT-Thread 项目",选择 "基于芯片":
- 芯片型号:STM32F407ZGT6
- 项目名称:led_blink
- RT-Thread 版本:选择最新的稳定版(比如 5.0.2)
- 调试器:ST-Link 或 J-Link
点击完成,Studio 会自动生成一个完整的 RT-Thread 工程。你会看到 src 目录下有 main.c,board 目录下有 board.c 和 board.h。
1.4.2 编写点灯代码
打开 main.c,你会看到默认的代码。咱们把它改成点灯程序:
#include <rtthread.h>
#include <rtdevice.h>
#define LED_PIN GET_PIN(F, 9) // PF9 是 LED 引脚
int main(void)
{
rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
while (1)
{
rt_pin_write(LED_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED_PIN, PIN_LOW);
rt_thread_mdelay(500);
}
}
这段代码很简单:
GET_PIN(F, 9)是 RT-Thread 提供的宏,用来获取引脚编号rt_pin_mode设置引脚为输出模式rt_pin_write控制引脚高低电平rt_thread_mdelay是 RT-Thread 的延时函数,单位毫秒
注意:这里的 GET_PIN 宏定义在 drv_gpio.h 中。如果你用的是其他芯片,需要确认引脚编号是否正确。我曾经在 STM32F103 上用过 GET_PIN(B, 0),结果发现 PB0 被其他外设占用了,点灯没反应。后来查了原理图才找到问题。
1.4.3 编译与下载
点击编译按钮,等待编译完成。然后点击下载按钮,程序会自动烧录到开发板。如果一切顺利,你会看到开发板上的 LED 以 1 秒的频率闪烁。
如果下载失败,检查以下几点:
- 调试器是否连接正确
- 开发板是否上电
- 调试器驱动是否安装
- 工程设置里的调试器类型是否匹配
小技巧:如果下载失败,可以试试按住开发板的复位键,点击下载后再松开。这个方法我用了很多次,成功率很高。
1.5 本章知识体系
下面这张图展示了本章的知识结构,帮你理清思路:
1.6 本章小结
这一章咱们做了几件事:
- 了解了 RT-Thread 是什么,它的三层架构
- 明白了 STM32 和 RT-Thread 的配合关系
- 搭建了开发环境(Keil / IAR / RT-Thread Studio)
- 跑通了第一个点灯工程
环境搭好了,灯也亮了,接下来咱们就可以正式开始外设驱动的移植配置了。记住,点灯只是开始,真正的挑战在后面。不过别担心,跟着我的节奏走,一步步来,你也能成为 RT-Thread 驱动移植的高手。
最后提醒一句:如果你在搭建环境时遇到问题,先检查是不是路径有中文、驱动没装好、或者 Pack 没装全。这三个问题占了新手报错的 80%。剩下的 20%,欢迎在课程评论区留言,我会尽量回复。