第二章:搭建开发环境——从零开始点亮第一颗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驱动

安装过程我就不截图了,说几个关键点:

  1. 下载Keil MDK:去ARM官网(arm.com)下载MDK-ARM最新版。注意选对版本,别下成MDK-View了。
  2. 安装器件包:安装完MDK后,打开Pack Installer,找到STM32F4系列的支持包(Keil.STM32F4xx_DFP),下载安装。这一步容易忘,我刚开始就吃过亏——装完MDK发现找不到芯片型号,折腾了半天才发现没装器件包。
  3. 安装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。这里我简单提一下流程:

  1. 安装ARM GCC工具链(gcc-arm-none-eabi)
  2. 编写链接脚本(.ld文件)和Makefile
  3. 用OpenOCD配合ST-Link下载

不过,对于初学者,我建议先别碰GCC。等你在Keil上跑通了RTOS,再回头研究GCC,会轻松很多。

2.6 本章小结

这一章,我们做了三件事:选了硬件、装了工具、点了灯。看起来简单,但这是你嵌入式开发的第一步。后面的RTOS课程,都会基于这个环境。

下一章,我们会深入RTOS的核心——任务调度。你会看到,一个LED闪烁的背后,操作系统是怎么管理多个任务的。

好,先到这。去把灯点亮,然后我们继续。