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 为例:

  1. 下载并安装 MDK-ARM(建议 5.38 以上版本)
  2. 打开 Pack Installer,搜索 STM32F4xx_DFP
  3. 点击 Install,等待下载完成
  4. 安装 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 本章知识体系

下面这张图展示了本章的知识结构,帮你理清思路:

第一章:课程导学与环境搭建 RT-Thread + STM32 RT-Thread 简介 STM32 与 RT-Thread 关系 开发环境搭建 第一个点灯工程 内核层 组件层 设备驱动层 Keil MDK IAR RT-Thread Studio 创建工程 编写代码 编译下载 本章核心:理解 RT-Thread 架构,搭建开发环境,跑通第一个程序 为后续外设驱动移植打下基础

1.6 本章小结

这一章咱们做了几件事:

  • 了解了 RT-Thread 是什么,它的三层架构
  • 明白了 STM32 和 RT-Thread 的配合关系
  • 搭建了开发环境(Keil / IAR / RT-Thread Studio)
  • 跑通了第一个点灯工程

环境搭好了,灯也亮了,接下来咱们就可以正式开始外设驱动的移植配置了。记住,点灯只是开始,真正的挑战在后面。不过别担心,跟着我的节奏走,一步步来,你也能成为 RT-Thread 驱动移植的高手。

最后提醒一句:如果你在搭建环境时遇到问题,先检查是不是路径有中文、驱动没装好、或者 Pack 没装全。这三个问题占了新手报错的 80%。剩下的 20%,欢迎在课程评论区留言,我会尽量回复。