第1章 开发环境搭建:从零开始点亮第一颗LED

做嵌入式开发,第一件事就是把家伙事儿备齐。我见过不少新手,上来就急着写代码,结果编译报错半天找不到原因——最后发现是工具链没装对。咱们这一章,就把Keil、CubeMX、ST-Link驱动这些基础环境捋一遍,然后跑通第一个LED工程。

本章目标: 装好三样工具 → 生成初始化代码 → 编译下载 → 看到LED闪烁。

1.1 工具链全景图

先看看咱们要装哪些东西,它们之间是什么关系。我画了张图,你一看就明白。

STM32开发环境工具链 用户编写代码 Keil MDK 编译/调试IDE STM32CubeMX 图形化配置/代码生成 ST-Link驱动 调试器驱动 .hex / .axf 可执行文件 STM32开发板 通过ST-Link下载 Keil负责编译,CubeMX负责配置,ST-Link负责下载,三者缺一不可

说白了,CubeMX帮你生成初始化代码,Keil负责编译成机器码,ST-Link把固件烧进芯片。我刚开始学的时候,总以为装一个Keil就够了,结果折腾半天连不上板子——后来才发现ST-Link驱动没装。

1.2 Keil MDK安装与配置

Keil MDK是ARM内核MCU最主流的IDE,没有之一。虽然也有IAR、GCC这些选择,但做STM32项目,Keil的生态最成熟。

安装步骤

  1. 下载安装包:去Keil官网(www.keil.com)下载MDK-Arm版本。注意版本号,我个人习惯用5.38或更新的稳定版。
  2. 运行安装程序:一路Next,安装路径建议不要有中文和空格。我见过有人装在“C:\程序文件\Keil_v5”下面,结果编译报路径错误——嗯,这里要注意。
  3. 安装器件包:安装完成后打开Keil,点击 Pack Installer,找到STM32F1系列(或者你手头板子的型号),点击Install。
  4. 注册License:如果不注册,代码限制在32KB以内。做个小LED没问题,但后面Bootloader肯定超了。建议购买正版或使用评估版。
小技巧: 安装完成后,在Keil里点击 Project → Manage → Component, Environment, Books,检查一下 Software Packs 选项卡里有没有你需要的器件包。没有的话手动添加。

常用配置项

配置项 推荐值 说明
Output → Select Folder for Objects .\Objects 编译中间文件单独存放,方便清理
Listing → Select Folder for Listings .\Listings 列表文件,调试时偶尔用到
C/C++ → Optimize Level 0 (-O0) 调试阶段用O0,发布时再开优化
Debug → Use Simulator / Use ST-Link ST-Link 选对调试器,否则下载不了

1.3 STM32CubeMX安装

CubeMX是ST官方出的图形化配置工具。你想想看,以前配置时钟树、GPIO、外设全靠手写寄存器,一个不小心就配错了。有了CubeMX,点几下鼠标就能生成初始化代码。

安装要点

  • Java环境:CubeMX基于Java,需要先装JRE。我建议装Java 11或17,太老的版本会报兼容性问题。
  • 安装路径:同样不要有中文。安装完成后第一次启动会提示下载固件包,选你需要的系列(比如STM32F1),下载时间取决于网速。
  • 固件包管理:在 Help → Manage embedded software packages 里可以查看已安装的固件版本。我曾经因为固件版本太旧,生成的HAL库代码和Keil不兼容,折腾了一下午。
避坑: CubeMX生成的代码默认使用HAL库。如果你习惯用标准外设库(SPL),需要手动切换。不过现在ST已经停止维护SPL了,建议直接上HAL。

1.4 ST-Link驱动安装

ST-Link是ST官方的调试下载器,大部分开发板都集成在板上了。驱动装不好,Keil就识别不到硬件。

驱动安装步骤

  1. 把开发板通过USB连到电脑。
  2. 打开设备管理器,如果看到黄色感叹号,说明驱动没装。
  3. 去ST官网下载 ST-Link USB driver,或者直接用Keil安装目录下的驱动:C:\Keil_v5\ARM\STLink\USBDriver。
  4. 运行 dpinst_amd64.exe(64位系统),一路Next。
  5. 安装完成后,设备管理器里应该出现 STMicroelectronics STLink dongle。
检查方法: 打开Keil,点击 Flash → Configure Flash Tools → Debug,在 Use 下拉框里选择 ST-Link Debugger,然后点 Settings。如果能识别到SWD设备,说明驱动OK。

1.5 第一个LED工程:从CubeMX到Keil

理论说完了,咱们动手。我以STM32F103C8T6(蓝色pill板)为例,带你走一遍完整流程。

步骤1:CubeMX新建工程

  • 打开CubeMX,点击 New Project。
  • 在 Part Number Search 里输入 STM32F103C8,双击选中。
  • 在 Pinout & Configuration 界面,找到PC13引脚(板载LED通常接这个脚),右键选择 GPIO_Output。
  • 时钟配置:在 Clock Configuration 里,把HCLK设为72MHz(F103最高主频)。
  • 工程设置:Project Name 填 LED_Blink,Toolchain / IDE 选 MDK-ARM V5。
  • 点击 GENERATE CODE,生成代码。

步骤2:Keil打开工程

  • 找到生成目录下的 MDK-ARM 文件夹,双击 LED_Blink.uvprojx。
  • 在左侧Project窗口,展开 Application/User,找到 main.c。

步骤3:编写LED闪烁逻辑

在 main() 函数的 while(1) 循环里,添加以下代码:

/* 用户代码开始 */
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
HAL_Delay(500);  // 延时500ms
/* 用户代码结束 */

注意:CubeMX生成的代码有 /* USER CODE BEGIN */ 和 /* USER CODE END */ 标记。一定要把代码写在这两个标记之间,否则下次重新生成代码时会被覆盖。我刚开始就吃过这个亏——写在外面的代码全没了。

步骤4:编译与下载

  1. 点击Keil工具栏的 Build 按钮(或者按F7),编译工程。如果没报错,底部Output窗口会显示 0 Error(s), 0 Warning(s)。
  2. 把开发板通过ST-Link连到电脑。
  3. 点击 Download 按钮(或者按F8),固件就会烧进芯片。
  4. 如果一切顺利,板子上的LED应该以500ms的间隔闪烁。
常见问题:
  • 编译报错“找不到头文件”:检查CubeMX生成的工程路径是否包含中文,或者Keil的C/C++ Include Paths是否配置正确。
  • 下载报错“No ST-Link detected”:检查驱动是否装好,或者ST-Link的接线是否正确(SWDIO、SWCLK、GND三根线必须连)。
  • LED不亮:检查GPIO引脚是否正确。有些板子的LED是低电平点亮,需要把 HAL_GPIO_TogglePin 换成 HAL_GPIO_WritePin 并设置低电平。

1.6 开发环境验证清单

为了确保后续章节不出幺蛾子,我建议你对照这个清单检查一遍:

检查项 状态 备注
Keil MDK安装完成 ☐ 能正常打开,无报错
STM32CubeMX安装完成 ☐ 能生成工程,固件包已下载
ST-Link驱动安装完成 ☐ 设备管理器无感叹号
LED工程编译通过 ☐ 0 Error, 0 Warning
LED工程下载成功 ☐ 板载LED闪烁

全部打勾?恭喜你,开发环境已经搭好了。后面咱们就要开始深入GPIO、定时器、串口这些外设了。嗯,路还长,但第一步走稳了,后面就顺了。