3. 开发环境搭建:Keil MDK / IAR 安装与配置、工程模板建立、J-Link/Segger调试器配置

好,咱们直接进入正题。做嵌入式开发,工具链就是你的枪。枪不顺手,仗就没法打。这一章,我带你把 Keil MDK 和 IAR 这两个主流 IDE 装好、配好,再把工程模板搭起来,最后把 J-Link 调试器搞定。

我个人习惯是两套环境都备着。为什么?因为有些芯片厂商的 SDK 只支持某一家 IDE,你临时换工具,那叫一个手忙脚乱。我在项目中就吃过这个亏,所以现在都是双保险。

3.1 Keil MDK 安装与配置

Keil MDK,说白了就是 ARM 单片机开发的老牌工具。尤其是搞 STM32 的,几乎人手一套。

3.1.1 安装步骤

  1. 下载安装包:去 Keil 官网下载 MDK-ARM 最新版本。注意,别下成 C51 了,那个是给 51 单片机用的。
  2. 运行安装:一路 Next,路径我建议别带中文和空格。比如 D:\Keil_v5,清爽。
  3. 激活 License:安装完会弹出一个 License Management 窗口。你需要一个合法的 License ID。如果没有,可以去官网申请一个免费的评估版,能用一段时间。
  4. 安装器件包:这是关键一步。打开 Keil,点击 Pack Installer,找到你用的芯片型号。比如我们用的 STM32F407,勾上对应的 Pack,它会自动下载安装。
注意: 我曾经遇到过 Pack 版本不匹配导致编译报一堆奇怪错误的情况。建议所有项目成员统一 Pack 版本,不然你调好的代码,同事一编译就挂。

3.1.2 工程模板建立

每次新建项目都从头配置?太累了。我习惯做一个干净的模板工程,以后直接复制。

// 模板工程目录结构示例
Project_Template/
├── User/           // 用户代码
│   ├── main.c
│   ├── stm32f4xx_it.c
│   └── ...
├── Drivers/        // 外设驱动
│   ├── CMSIS/
│   └── STM32F4xx_HAL_Driver/
├── Middlewares/    // 中间件(如 FreeRTOS)
├── Output/        // 编译输出
└── Project.uvprojx // Keil 工程文件

配置要点:

  • Target 选项:在 Options for Target 里,把 Xtal 设为你板子的实际晶振频率。我一般用 8MHz 外部晶振。
  • Output 选项卡:勾选 Create HEX File,方便烧录。把输出目录指向 Output\ 文件夹。
  • C/C++ 选项卡:在 Define 里加上 USE_HAL_DRIVER, STM32F407xx。这是告诉编译器,我们用的是 HAL 库,芯片型号是 F407。
小技巧:Optimization 先设为 Level 0 (-O0)。调试阶段别开优化,不然变量值都优化没了,你查 bug 查到怀疑人生。

3.2 IAR Embedded Workbench 安装与配置

IAR 的编译器优化能力很强,生成的代码密度比 Keil 高。做产品量产时,我更喜欢用 IAR。

3.2.1 安装步骤

  1. 下载 IAR:去 IAR 官网下载对应版本。注意,IAR 是按芯片架构分版本的,比如 ARM 版、RISC-V 版。别下错了。
  2. 安装过程:同样,路径不要有中文。安装时会让你选择 License,你可以用注册机生成一个(仅供学习),或者买正版。
  3. 配置工具链:安装完后,打开 IAR,在 Tools -> Options 里检查一下编译器路径是否正确。

3.2.2 工程模板建立

IAR 的工程文件是 .ewp 格式。模板结构和 Keil 类似,但配置方式略有不同。

// IAR 工程配置关键点
// 1. 在 General Options -> Target 里选择芯片型号
// 2. 在 C/C++ Compiler -> Preprocessor 里添加宏定义
// 3. 在 Linker -> Output 里勾选 "Allow C-SPY debugging"

我个人觉得 IAR 的界面不如 Keil 直观,但它的代码提示和跳转功能很强大。你想想看,一个大型项目几千个文件,没有好的跳转,找函数定义找到手抽筋。

3.3 J-Link / Segger 调试器配置

调试器是连接 IDE 和硬件的桥梁。J-Link 是 Segger 公司的产品,稳定、速度快,是业界标杆。

3.3.1 驱动安装

去 Segger 官网下载 J-Link Software and Documentation Pack。安装后,你的电脑上就有了 J-Link 驱动和 GDB Server。

验证安装: 插上 J-Link,打开设备管理器,应该能看到 "J-Link driver" 设备。如果没有,手动更新驱动,指向安装目录下的 JLinkARM.dll

3.3.2 Keil 中配置 J-Link

  1. 点击 Options for Target -> Debug
  2. Use 下拉框里选择 J-LINK / J-TRACE Cortex
  3. 点击 Settings,在 Debug 选项卡里,确认 PortSW(SWD 模式),Max Clock 可以设到 4MHz 或更高。
  4. Flash Download 选项卡里,添加对应的芯片算法。比如 STM32F407 的算法是 STM32F4xx Flash

3.3.3 IAR 中配置 J-Link

  1. 打开 Project -> Options -> Debugger
  2. Setup 选项卡里,DriverJ-Link/J-Trace
  3. 点击 OK 后,再进入 Project -> Options -> J-Link/J-Trace
  4. Connection 选项卡里,同样选 SWD 模式,速度可以设到 Auto 或手动设高一些。
避坑指南: 我曾经遇到过 J-Link 连接不上目标板的情况。排查下来,是目标板的 SWD 接口电压和 J-Link 不匹配。J-Link V9 以上版本支持自适应电压,但老版本需要手动跳线。另外,SWD 的时钟线(SWCLK)上不要接太大的电容,否则信号会畸变。

3.4 验证环境是否搭建成功

环境搭好了,得跑个灯试试。写一个最简单的点灯程序,编译、下载、运行。

// main.c - 点灯测试程序
#include "stm32f4xx_hal.h"

void SystemClock_Config(void);
static void GPIO_Init(void);

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    GPIO_Init();

    while (1)
    {
        HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_13); // 假设 LED 在 PG13
        HAL_Delay(500); // 延时 500ms
    }
}

static void GPIO_Init(void)
{
    __HAL_RCC_GPIOG_CLK_ENABLE();
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_13;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
}

编译通过后,点击 DownloadDebug。如果看到 LED 在闪烁,恭喜你,环境搭建成功了!

我的习惯: 我会在模板工程里预置好点灯代码、串口打印代码和 FreeRTOS 的启动代码。这样每次新项目,只需要改业务逻辑,不用重复造轮子。

嗯,到这里,开发环境就全搞定了。下一章,我们开始真正移植 FreeRTOS 到 STM32 上。到时候你会看到,有了这个模板,移植工作会变得非常顺畅。