2. 开发环境搭建:Keil MDK / ESP-IDF 安装与配置、串口驱动安装、调试工具(J-Link/ST-Link)配置、版本控制(Git)入门

说实话,做医疗嵌入式开发,环境搭建这一步最容易被轻视。我见过不少新手,急着写代码,结果卡在编译报错、下载器连不上、串口乱码这些基础问题上,一折腾就是半天。这一章,咱们就把这些坑提前填上。

我会带你走一遍 Keil MDK 和 ESP-IDF 的安装流程,搞定串口驱动,配好 J-Link 和 ST-Link,最后再聊聊 Git 的基本用法。这些东西,说白了就是你的工具箱。工具顺手,活儿才能干得快。

本章核心脉络:开发环境 = IDE + 编译器 + 调试器 + 版本控制。四者缺一不可,顺序也别搞反。
开发环境搭建知识体系 嵌入式开发环境 IDE + 编译器 调试器 (J-Link/ST-Link) 串口驱动 版本控制 (Git) Keil MDK ESP-IDF CH340/CP210x PL2303 💡 建议安装顺序 串口驱动 → IDE/编译器 → 调试器驱动 → Git

2.1 Keil MDK 安装与配置

Keil MDK 是 ARM Cortex-M 系列芯片的主流 IDE,尤其在 STM32 生态里,几乎是标配。我个人习惯用 MDK 5.38 版本,稳定,对 CMSIS 包的支持也最全。

安装步骤

  1. 下载安装包:从 ARM 官网或 Keil 官网获取 MDK-ARM 安装程序。注意区分版本,别下成 C51 了。
  2. 运行安装:一路 Next,路径建议不要有中文和空格。我一般放在 C:\Keil_v5。
  3. 安装器件包:打开 Pack Installer,找到你的芯片型号(比如 STM32F103C8),点击 Install。这一步很多人会忘,结果编译时找不到头文件。
  4. 注册 License:如果你有正版 License,在 File → License Management 里添加。没有的话,评估版也能用,就是代码限制 32KB。
我的习惯:装完 Keil 后,我会立刻装一个 ARM Compiler 6(AC6)。AC6 的编译速度比 AC5 快不少,而且对 C99/C11 支持更好。在项目选项的 Target 页里切换即可。

项目配置要点

配置项 推荐值 说明
Target → ARM Compiler Use default compiler version 6 AC6 编译更快,优化更好
Output → Select Folder for Objects .\Objects 把中间文件单独放,保持项目根目录干净
Debug → Use Simulator / Use J-Link 根据调试器选择 仿真器用于无硬件调试,J-Link 用于实际硬件
C/C++ → Optimize Level 0 (-O0) 调试阶段 发布时再改到 Level 2 (-O2)
我曾经踩过的坑:有一次项目里用了 printf 重定向,结果 Keil 编译报错说找不到 __FILE 结构体。查了半天,发现是 MicroLIB 没勾上。在 Target 页勾选 "Use MicroLIB" 就解决了。做串口打印时,这个选项几乎必开。

2.2 ESP-IDF 安装与配置

如果你用乐鑫的 ESP32 系列做医疗设备的前端采集或无线传输,那 ESP-IDF 是绕不开的。它不像 Keil 那样一键安装,需要走命令行,但熟悉之后会发现它很灵活。

安装方式对比

方式 适用场景 难度
ESP-IDF 离线安装器 Windows 用户,新手推荐 低
VS Code + ESP-IDF 插件 习惯 VS Code 的开发者 中
手动安装(pip + git clone) Linux/Mac 用户,或需要定制版本 高

我个人推荐用 VS Code 插件方式。原因很简单:代码补全、调试、串口监视器都集成在一起,不用来回切窗口。

快速安装步骤(VS Code 插件版)

  1. 安装 VS Code,然后搜索并安装 ESP-IDF Extension。
  2. 按 Ctrl+Shift+P,输入 ESP-IDF: Configure ESP-IDF Extension。
  3. 选择 Express 模式,插件会自动下载 ESP-IDF 工具链和 Python 环境。
  4. 等待下载完成。这个过程大概 10-20 分钟,取决于网速。
  5. 完成后,打开命令面板,运行 ESP-IDF: Show Examples Projects,随便选一个 hello_world 编译试试。
避坑指南:ESP-IDF 对 Python 版本有要求,目前推荐 Python 3.8-3.11。如果你电脑上装了多个 Python 版本,记得在插件设置里指定正确的路径。我曾经因为 Python 3.12 不兼容,折腾了半小时才找到原因。

2.3 串口驱动安装

串口是嵌入式开发最常用的通信接口。调试信息打印、AT 指令交互、固件下载,都离不开它。但串口驱动装不好,设备管理器里就只会显示一个黄色感叹号。

常见 USB 转串口芯片及驱动

芯片型号 常见设备 驱动下载
CH340/CH341 国产开发板、USB 转串口模块 沁恒官网
CP2102/CP2104 Silicon Labs 方案,很多商用板在用 Silicon Labs 官网
FT232 FTDI 经典芯片,稳定但贵 FTDI 官网
PL2303 早期设备常见,兼容性一般 Prolific 官网

安装步骤

  1. 插上 USB 转串口模块或开发板。
  2. 打开设备管理器(Win + X → 设备管理器)。
  3. 找到带黄色感叹号的 "未知设备" 或 "Ports" 下的设备。
  4. 右键 → 更新驱动程序 → 浏览我的电脑 → 选择驱动文件夹。
  5. 安装完成后,在 "端口 (COM 和 LPT)" 下会看到对应的 COM 口编号。
我曾经遇到的怪问题:有一次 CH340 驱动装好了,但串口工具就是打不开。后来发现是 Windows 的 "快速启动" 功能导致驱动加载不完全。关掉快速启动,重启电脑,问题解决。另外,如果 COM 口编号大于 10,有些老软件可能识别不到,可以在设备管理器里手动改成 COM1-COM4。

2.4 调试工具配置(J-Link / ST-Link)

调试器是嵌入式开发的"听诊器"。没有它,你只能靠 printf 猜问题。有了它,你可以看寄存器、设断点、单步执行,效率完全不一样。

J-Link 配置

J-Link 是 SEGGER 公司的产品,支持几乎所有 ARM Cortex 内核芯片。我手头常备一个 J-Link EDU,性价比很高。

  1. 安装驱动:从 SEGGER 官网下载 J-Link Software and Documentation Pack。安装后会自动包含驱动。
  2. 连接硬件:J-Link 的 20-pin JTAG/SWD 接口,一般接 SWDIO、SWCLK、GND、VCC(3.3V)四根线就行。
  3. 验证连接:打开 J-Link Commander(JLink.exe),输入 connect,选择设备型号,如果显示 "Connected successfully",就说明通了。
  4. 在 Keil 中配置:项目选项 → Debug → Use J-Link/J-Trace → Settings,确认 SWD 模式,速度建议先设 1MHz,稳定后再往上调。

ST-Link 配置

ST-Link 是 ST 官方调试器,买 STM32 开发板基本都自带。它的配置比 J-Link 简单,但功能也少一些。

  1. 安装驱动:ST-Link 驱动集成在 STM32CubeProgrammer 或 Keil 的安装包里。如果设备管理器不识别,单独装一下 ST-Link 驱动即可。
  2. 连接硬件:同样用 SWD 接口,注意 ST-Link 的 VCC 输出是 3.3V,别接到 5V 上。
  3. 在 Keil 中配置:项目选项 → Debug → Use ST-Link Debugger → Settings,确认 SWD 连接正常。
我的经验:调试医疗设备时,我习惯在代码里加一个 "调试断言" 宏。比如 ASSERT(adc_value < 4096),如果条件不满足,直接停在断点处。这样比看日志快得多。J-Link 的 RTT 功能也很好用,可以在不占用串口的情况下输出日志,推荐试试。

2.5 版本控制(Git)入门

做医疗嵌入式项目,代码版本管理不是可选项,是必需品。FDA 审核、CE 认证,都要求你提供完整的代码变更记录。Git 就是干这个的。

Git 基础概念

概念 说明 类比
仓库 (Repository) 存放项目代码和版本历史的地方 一个项目的文件夹
提交 (Commit) 一次代码快照,包含变更说明 拍照存档
分支 (Branch) 独立的开发线,互不干扰 平行宇宙
合并 (Merge) 把两个分支的改动合到一起 汇合两条河流
远程仓库 (Remote) 托管在服务器上的仓库,比如 GitHub 云盘备份

嵌入式项目 Git 工作流

我推荐一个简单的流程,适合 1-3 人的小团队:

  1. 主分支 (main):只放经过测试的稳定版本。每次发布前,打一个 tag,比如 v1.0.0。
  2. 开发分支 (develop):日常开发在这里进行。功能完成后,合并到 main。
  3. 功能分支 (feature/xxx):每个新功能开一个分支,比如 feature/adc-calibration。开发完合并到 develop 后删除。
  4. 修复分支 (fix/xxx):紧急 bug 修复,直接从 main 拉分支,修完合并回 main 和 develop。

常用 Git 命令

# 初始化仓库
git init

# 添加文件到暂存区
git add main.c
git add .   # 添加所有文件

# 提交代码
git commit -m "feat: 添加 ADC 初始化代码"

# 查看状态
git status

# 创建并切换分支
git checkout -b feature/temperature-sensor

# 合并分支
git checkout develop
git merge feature/temperature-sensor

# 推送到远程仓库
git push origin develop

# 拉取最新代码
git pull origin develop
提交信息规范:我习惯用 Conventional Commits 格式。比如 feat: 添加心率算法、fix: 修复 SPI 时钟极性错误、docs: 更新 API 文档。这样后期看日志,一目了然。
我曾经犯过的错:有一次在 main 分支上直接改代码,改到一半发现思路不对,想回退。但因为没提交,改动的文件没法恢复。从那以后,我养成了一个习惯:改代码前先 git status 确认当前分支,再 git checkout -b 新建分支。永远不要在 main 上直接改。