1. 调试环境搭建:从零开始,让工具链跑起来

做嵌入式开发,第一件事就是把环境搭好。这事听起来简单,但我见过太多人在这一步卡上半天——装完Keil发现破解失败,连上J-Link驱动不识别,点灯程序死活下不进去。说白了,调试环境就像你手里的螺丝刀,工具没备好,后面再牛的技术也使不出来。

这一章,我带你从头走一遍。每一步我都会告诉你:哪些坑我踩过,哪些地方可以偷懒。

1.1 Keil MDK 安装与配置

Keil MDK,咱们圈里人常叫它“MDK”或者“Keil”。它是ARM Cortex-M系列芯片最主流的IDE,没有之一。STM32的开发,绝大多数人都是从它入门的。

1.1.1 下载与安装

去ARM官网或者Keil官网下载MDK-Arm版本。目前主流版本是5.36到5.38,我个人建议用5.36或5.37,稳定,坑少。5.38我也试过,有些旧工程打开会报一堆警告,折腾。

安装步骤很简单,一路Next就行。但有两点要注意:

  • 安装路径不要有中文。我见过有人装在“D:\软件\Keil_v5”这种路径,结果编译时莫名其妙报错。老老实实用英文路径。
  • 安装完成后先别急着破解。先打开一次Keil,让它自动生成一些配置文件,关掉,再以管理员身份运行注册机。
我曾经遇到过:装完Keil直接破解,结果License死活写不进去。后来发现是没以管理员身份运行。记住:注册机、Keil本身,都要右键“以管理员身份运行”。

1.1.2 安装器件包(Pack)

Keil本身不带STM32的芯片支持包。你需要单独安装。打开Keil,点击菜单栏的 Pack Installer,搜索你的芯片型号。比如STM32F103C8T6,找到对应的DFP(Device Family Pack),点击Install。

如果你网络不好,也可以去Keil官网手动下载.pack文件,然后双击安装。嗯,这个方法更靠谱,我一般都用它。

1.1.3 配置编译器与输出路径

安装完Pack,新建一个工程,你会看到编译器默认是ARM Compiler 6。我个人习惯用 ARM Compiler 5,因为它的优化行为更可预测,调试时不容易出现“优化掉变量”这种让人抓狂的情况。

配置方法:

  1. 点击 Project → Options for Target → Target
  2. 在 ARM Compiler 下拉框中选择 Use default compiler version 5
  3. 切换到 Output 标签,勾选 Create HEX File(烧录时经常需要hex文件)
  4. 切换到 Listing 标签,把 Browse Information 勾上(调试时能看变量值)
小技巧: 输出路径我习惯单独建一个“Output”文件夹,和工程文件分开。这样清理编译产物时,直接删文件夹就行,不会误删源码。

1.2 J-Link / Segger 驱动安装

J-Link是Segger公司出品的调试器,稳定、速度快,是STM32调试的首选。市面上有很多盗版J-Link,说实话也能用,但驱动版本要注意。

1.2.1 下载驱动

去Segger官网下载 J-Link Software and Documentation Pack。别下错了,是那个几百兆的完整包,不是单独的DLL。

安装时一路默认即可。安装完成后,插上J-Link,打开设备管理器,你应该能看到 J-Link driver 出现在“通用串行总线控制器”或“Segger”分类下。

1.2.2 驱动验证

打开命令行,输入:

JLink.exe

如果弹出J-Link Commander的窗口,并且显示 Connected to target 或者 DLL version 信息,说明驱动安装成功。

如果提示 No J-Link found,别慌。先检查USB线——我遇到过好几次,线是坏的,只能充电不能传数据。换根线试试。

我曾经被一个盗版J-Link折磨了一下午:驱动装好,设备管理器也识别了,但Keil就是连不上。后来发现是J-Link固件版本太老,Segger在驱动里加了反盗版检测。解决办法:用J-Link Commander的固件更新功能,刷一个旧版固件(比如V6.x)。嗯,盗版用户懂的都懂。

1.3 调试器连接与验证

驱动装好了,接下来把J-Link和STM32开发板连起来。接线很简单,但接错一根就可能烧东西。

1.3.1 接线方式

标准SWD接口只需要4根线:

J-Link 引脚 信号 STM32 引脚 备注
1 VCC 3.3V 目标板供电(可选)
7 SWDIO PA13 数据线
9 SWCLK PA14 时钟线
4 GND GND 地线

我个人习惯把VCC也接上,这样J-Link可以给目标板供电,省去一根USB线。但要注意:如果目标板本身已经上电,千万别接VCC,否则两个电源打架,轻则烧J-Link,重则烧板子。

1.3.2 在Keil中配置调试器

打开Keil工程,点击 Project → Options for Target → Debug:

  1. 在右侧下拉框选择 J-Link / J-Trace Cortex
  2. 点击 Settings,在Debug标签页确认 Port 为 SW,Max Clock 建议先设成 1MHz(稳定第一,后面再调高)
  3. 切换到 Flash Download 标签,点击 Add,选择你的芯片对应的Flash算法(比如 STM32F10x Med-density Flash)
  4. 勾选 Reset and Run(下载完自动复位运行)
关键点: 如果点击Settings后,Keil提示“No J-Link found”,先检查驱动,再检查接线。如果接线和驱动都没问题,试试把J-Link拔了重插——有时候就是接触不良。

1.4 第一个点灯工程的编译与下载

环境搭好了,来跑个点灯程序验证一下。这是嵌入式界的“Hello World”,虽然简单,但能验证整个工具链是否通畅。

1.4.1 新建工程

打开Keil,点击 Project → New uVision Project,选择你的芯片型号(比如STM32F103C8)。Keil会弹出一个对话框问你是否要添加启动文件,选 Yes。

然后新建一个main.c文件,写入以下代码:

#include "stm32f10x.h"

void delay(void)
{
    volatile uint32_t i;
    for(i = 0; i < 500000; i++);
}

int main(void)
{
    // 使能GPIOC时钟
    RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
    
    // 配置PC13为推挽输出,最大速度2MHz
    GPIOC->CRH &= ~(0xF << 20);
    GPIOC->CRH |= (0x2 << 20);
    
    while(1)
    {
        GPIOC->BSRR = GPIO_BSRR_BS13;  // 点亮LED
        delay();
        GPIOC->BSRR = GPIO_BSRR_BR13;  // 熄灭LED
        delay();
    }
}

这段代码很简单:配置PC13为输出,然后循环点亮、熄灭。为什么用PC13?因为大部分STM32最小系统板上的LED都接在这个引脚上,低电平点亮。

1.4.2 编译与下载

点击 Build 按钮(或者按F7),看编译输出窗口。如果显示 0 Error(s), 0 Warning(s),恭喜,编译通过。

然后点击 Download 按钮(或者按F8),把程序烧进芯片。下载完成后,如果一切正常,板子上的LED应该开始闪烁。

如果LED不亮:
  • 检查接线:SWDIO、SWCLK、GND是否接对?
  • 检查Flash Download配置:算法选对了吗?
  • 检查Reset and Run是否勾选?没勾的话,下载完需要手动按复位键
  • 检查LED引脚:你的板子LED真的在PC13吗?有些板子在PA0或PB12

1.5 本章知识体系

下面这张图,把本章的核心流程串起来了。你跟着它走一遍,环境搭建就不会漏步骤。

调试环境搭建核心流程 Keil MDK安装 下载 → 安装 → 破解 器件包安装 Pack Installer / 手动 J-Link驱动安装 Segger Pack → 验证 Keil调试配置 编译器 → 输出 → 调试器 硬件连接 SWDIO / SWCLK / GND 点灯验证 编译 → 下载 → 运行 环境就绪 可以开始调试了 💡 关键提醒: 每一步完成后都要验证,不要等到最后才发现驱动没装好。点灯不亮,先查硬件连接,再查软件配置。

1.6 常见问题速查

最后,我把环境搭建中最常见的几个问题列出来。你遇到问题时,先对照这张表排查,大概率能自己解决。

问题现象 可能原因 解决办法
Keil破解失败 未以管理员身份运行 右键 → 以管理员身份运行
J-Link无法识别 驱动未安装 / USB线损坏 重装驱动 / 换线
下载时报错“Flash Timeout” Flash算法未配置 / 接线不良 检查Flash Download配置 / 重新插拔
下载后LED不亮 未勾选Reset and Run / 引脚不对 勾选Reset and Run / 核对原理图
编译报错“找不到头文件” Pack未安装 / 路径配置错误 安装对应Pack / 检查Include Paths

环境搭建这一步,说白了就是“磨刀不误砍柴工”。你花半小时把环境配好,后面30章的学习会顺畅很多。我见过太多人急着写代码,结果调试器连不上,折腾一上午,最后发现是驱动没装对。嗯,别做那种人。