第二章:搭建开发环境——从零开始点亮第一颗LED
说实话,很多初学者在学RTOS之前,都卡在了环境搭建这一步。我见过太多人,买了开发板,装了软件,结果点个灯都点不亮,然后就放弃了。挺可惜的。
这一章,我带你一步步把环境搭好。咱们的目标很简单:让板子上的LED亮起来。这是嵌入式世界的"Hello World",也是你后续所有RTOS实验的基础。
2.1 硬件平台选择:为什么是STM32F4?
选STM32F4系列,我有我的理由。你想想看,市面上ARM Cortex-M内核的芯片那么多,为什么我偏偏推荐F4?
- 性能够用:带FPU(浮点运算单元),主频168MHz,跑个RTOS绰绰有余。我在项目中用F4做过无人机飞控,实时性完全没问题。
- 资料丰富:中文手册、例程、论坛帖子,一搜一大把。你遇到问题,基本都能找到答案。
- 调试方便:ST-Link/V2调试器,便宜又好用。我当年用J-Link,一个就要上千块,现在几十块钱的ST-Link就能搞定。
具体型号,我建议用STM32F407VGT6或者STM32F429IGT6。前者性价比高,后者带LCD控制器,适合做图形界面。当然,如果你手头有别的F4板子,比如正点原子的探索者、野火的指南者,也都行。
核心提示:选板子时,注意看有没有板载ST-Link。有的话,一根USB线就能调试,省去额外买调试器的麻烦。
2.2 工具链选择:Keil MDK vs GCC
工具链这块,我两种都用过。简单说说区别:
| 对比项 | Keil MDK | GCC + Makefile |
|---|---|---|
| 上手难度 | 低,IDE集成,点几下就行 | 高,需要自己写链接脚本、Makefile |
| 编译效率 | ARMCC编译器,优化好 | GCC免费,但优化稍弱 |
| 调试体验 | 自带调试器,断点、变量观察方便 | 需要配合OpenOCD或pyOCD |
| 成本 | 商用收费(社区版有代码限制) | 完全免费 |
| 适用场景 | 快速原型、公司项目 | 开源项目、个人学习 |
我个人习惯是:学习阶段用Keil MDK,省心。等你对整个流程熟悉了,再切换到GCC也不迟。毕竟,我们的目标是学RTOS,不是学怎么配工具链。
小技巧:Keil MDK的社区版(MDK-ARM Community)可以免费使用,但代码大小限制在32KB以内。对于点灯和基础RTOS实验,完全够用。
2.3 安装Keil MDK与ST-Link驱动
安装过程我就不截图了,说几个关键点:
- 下载Keil MDK:去ARM官网(arm.com)下载MDK-ARM最新版。注意选对版本,别下成MDK-View了。
- 安装器件包:安装完MDK后,打开Pack Installer,找到STM32F4系列的支持包(Keil.STM32F4xx_DFP),下载安装。这一步容易忘,我刚开始就吃过亏——装完MDK发现找不到芯片型号,折腾了半天才发现没装器件包。
- 安装ST-Link驱动:去ST官网下载ST-Link/V2的驱动。或者,你插上开发板,Windows会自动安装。如果没装成功,手动更新一下驱动。
注意:Keil MDK的安装路径不要有中文!不要有空格!我见过有人装在"Program Files (x86)"里,结果编译报错,排查了半天才发现是路径问题。
2.4 创建第一个裸机点灯工程
好,环境搭好了,咱们开始写代码。这一步,我带你从新建工程开始,到下载运行,完整走一遍。
2.4.1 新建工程
打开Keil MDK,点击 Project → New μVision Project。选择你的芯片型号,比如STM32F407VG。然后会弹出一个对话框,问你要不要添加启动文件。选"是"。
嗯,这里要注意:Keil会自动帮你添加启动文件(startup_stm32f407xx.s)和系统初始化文件(system_stm32f4xx.c)。这两个文件是芯片上电后最先执行的代码,负责设置堆栈、时钟等。咱们先不动它。
2.4.2 编写主函数
在工程里新建一个main.c文件,写入以下代码:
#include "stm32f4xx.h"
// 延时函数,简单粗暴
void delay(volatile uint32_t count) {
while (count--) {
__NOP(); // 空操作,防止编译器优化掉
}
}
int main(void) {
// 使能GPIOG时钟(LED通常接在PG13或PG14)
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOGEN;
// 配置PG13为推挽输出模式
GPIOG->MODER |= GPIO_MODER_MODER13_0; // 设置为输出模式
GPIOG->OTYPER &= ~GPIO_OTYPER_OT_13; // 推挽输出
GPIOG->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR13; // 高速
while (1) {
GPIOG->BSRR = GPIO_BSRR_BS_13; // 置位PG13,LED亮
delay(1000000);
GPIOG->BSRR = GPIO_BSRR_BR_13; // 复位PG13,LED灭
delay(1000000);
}
}
这段代码做了什么?说白了就是三步:
- 开时钟:GPIOG挂在AHB1总线上,得先让它的时钟工作起来。
- 配模式:把PG13引脚设为输出模式,推挽输出,高速。
- 循环翻转:置位→延时→复位→延时,LED就一闪一闪了。
注意:不同开发板的LED引脚可能不一样。正点原子的探索者LED0接在PG13,野火的指南者接在PB0。你得查一下原理图,别照抄我的代码。
2.4.3 配置调试器
写完了代码,怎么下载到板子上?
点击 Project → Options for Target,在Debug选项卡里选择"ST-Link Debugger"。然后点旁边的"Settings",确认一下SWD模式是否勾选,速度选个1MHz就行,别太高,容易不稳定。
我记得有一次,我把速度设成了10MHz,结果死活连不上芯片。后来降回1MHz,一次成功。嗯,有时候慢就是快。
2.4.4 编译下载
按F7编译,如果没报错,再按F8下载。这时候,你应该能看到板子上的LED开始闪烁了。
如果没亮,别慌。检查以下几点:
- 板子供电了吗?USB线是不是只供电不传数据?
- 调试器驱动装了吗?设备管理器里能看到ST-Link吗?
- 引脚对不对?是不是焊错了?
避坑指南:我曾经遇到过一个问题——代码下载成功,但LED死活不亮。折腾了半天,发现是板子上的跳线帽没插对,把LED的电源断开了。所以,拿到新板子,先看看原理图,确认跳线设置。
2.5 进阶:用GCC工具链点灯
如果你对Keil的"黑盒"感到不放心,或者想更深入地理解编译过程,可以试试GCC。这里我简单提一下流程:
- 安装ARM GCC工具链(gcc-arm-none-eabi)
- 编写链接脚本(.ld文件)和Makefile
- 用OpenOCD配合ST-Link下载
不过,对于初学者,我建议先别碰GCC。等你在Keil上跑通了RTOS,再回头研究GCC,会轻松很多。
2.6 本章小结
这一章,我们做了三件事:选了硬件、装了工具、点了灯。看起来简单,但这是你嵌入式开发的第一步。后面的RTOS课程,都会基于这个环境。
下一章,我们会深入RTOS的核心——任务调度。你会看到,一个LED闪烁的背后,操作系统是怎么管理多个任务的。
好,先到这。去把灯点亮,然后我们继续。