STM32 命令行工具链手册:编译烧录调试自动化指南
这篇文章整理了 STM32F103C8T6 项目的命令行编译、烧录、调试工具链。有了命令行工具链,AI 可以自主完成"编译→读报错→修复→重试"的闭环,也是实现 Harness Engineering 的基础设施。
快速开始
如果你已经搭建好环境,以下是最小验证路径:
unify_builder.exe -p build/STM32F103C8/builder.params
JLink.exe -device STM32F103C8 -if SWD -speed 4000 -autoconnect 1 -CommandFile build/STM32F103C8/commands.jlink
python tools/serial_monitor.py COM8 115200
详细配置和参数说明见下文。
前置条件
| 条件 | 说明 |
|---|
| 硬件 | STM32F103 开发板 + J-Link 调试器(SWD 接口) |
| 软件 | VS Code + EIDE 扩展(会自动安装编译工具链) |
| 操作系统 | Windows(工具链依赖 Windows 路径格式) |
| Python | Python 3.x(串口监视器依赖 pyserial) |
一、工具链概述
1.1 组成
| 组件 | 工具 | 来源 | 功能 |
|---|
| 编译器 | ARM Compiler 5.06 (armcc) | EIDE 扩展 | 编译 C 代码 |
| 构建工具 | unify_builder.exe | EIDE 扩展 | 项目构建系统 |
| 烧录工具 | JLink.exe | EIDE 工具包 | J-Link 命令行烧录 |
| 调试服务器 | JLinkGDBServerCL.exe | EIDE 工具包 | GDB 调试服务 |
| 调试客户端 | arm-none-eabi-gdb.exe | EIDE 工具包 | GDB 调试器 |
1.2 工具路径
EIDE 扩展目录(用环境变量表示):
%USERPROFILE%\.vscode\extensions\cl.eide-<版本号>\res\tools\win32\unify_builder\
Bash 环境:
$USERPROFILE/.vscode/extensions/cl.eide-*/res/tools/win32/unify_builder/
EIDE 工具包目录:
~/.eide/tools/
├── gcc_arm/bin/ # ARM GCC 工具链
├── jlink/ # J-Link 工具
│ ├── JLink.exe
│ └── JLinkGDBServerCL.exe
└── openocd/ # OpenOCD (备选)
1.3 项目配置文件
| 文件 | 位置 | 说明 |
|---|
builder.params | build/STM32F103C8/ | 编译参数配置 |
commands.jlink | build/STM32F103C8/ | J-Link 烧录命令 |
eide.yml | .eide/ | 项目配置 |
二、编译系统
2.1 命令格式
unify_builder.exe -p <builder.params路径> [选项]
2.2 常用选项
| 选项 | 说明 |
|---|
-p <path> | 指定 builder.params 文件路径 |
--rebuild | 强制重新编译所有文件 |
--dry-run | 模拟运行,不实际编译 |
2.3 完整命令示例
"C:\Users\<用户名>\.vscode\extensions\cl.eide-<版本>\res\tools\win32\unify_builder\unify_builder.exe" -p "D:\EIDE-Project\build\STM32F103C8\builder.params"
./.claude/skills/eide-stm32-dev/scripts/build-flash.sh
2.4 编译输出解读
Program Size: Code=3000 RO-data=336 RW-data=52 ZI-data=1836
Total RO Size (Code + RO Data) 3336 ( 3.26kB) ← 只读段
Total RW Size (RW Data + ZI Data) 1888 ( 1.84kB) ← RAM 使用
Total ROM Size (Code + RO + RW) 3388 ( 3.31kB) ← Flash 使用
RAM: [## ] 9.2% 1.8KB/20.0KB
ROM: [# ] 5.2% 3.3KB/64.0KB
| 字段 | 含义 |
|---|
| Code | 代码段大小 |
| RO-data | 只读数据(常量、字符串) |
| RW-data | 已初始化全局变量 |
| ZI-data | 未初始化全局变量(BSS 段) |
2.5 常见编译错误
| 错误类型 | 示例 | 解决方法 |
|---|
| 语法错误 | Error: #65: expected a ";" | 检查行末分号 |
| 未定义标识符 | Error: #20: identifier "XXX" is undefined | 检查头文件包含或宏定义 |
| 类型不匹配 | Warning: #188-D: enumerated type mixed | 添加显式类型转换 |
三、烧录系统
3.1 J-Link 命令格式
JLink.exe -device STM32F103C8 -if SWD -speed 4000 -autoconnect 1 -CommandFile <命令文件>
3.2 参数说明
| 参数 | 值 | 说明 |
|---|
-device | STM32F103C8 | 目标芯片型号 |
-if | SWD | 调试接口 |
-speed | 4000 | 通信速度 (kHz) |
-autoconnect | 1 | 自动连接 |
-CommandFile | xxx.jlink | 命令脚本文件 |
3.3 命令文件格式
r # 复位目标
halt # 停止 CPU
loadfile xxx.hex # 加载 HEX 文件
r # 复位
go # 运行
exit # 退出
3.4 烧录输出解读
J-Link>loadfile "D:\EIDE-Project\build\STM32F103C8\EIDE-Project.hex"
Downloading file...
J-Link: Flash download: Bank 0 @ 0x08000000: 1 range affected (1024 bytes)
J-Link: Flash download: Total: 0.506s
O.K.
| 信息 | 含义 |
|---|
| Bank 0 @ 0x08000000 | Flash 起始地址 |
| 1 range affected | 影响的地址范围数 |
| 1024 bytes | 烧录数据大小 |
| O.K. | 烧录成功 |
四、调试系统
4.1 架构
┌─────────────────┐ TCP/IP ┌─────────────────┐ SWD ┌─────────────┐
│ GDB Client │ ◄─────────────► │ J-Link GDB │ ◄──────────► │ STM32F103 │
│ arm-none-eabi │ :3333 │ Server │ │ 目标板 │
│ -gdb │ │ │ │ │
└─────────────────┘ └─────────────────┘ └─────────────┘
4.2 启动 GDB Server
JLinkGDBServerCL.exe -if SWD -device STM32F103C8 -speed 4000 -port 3333
4.3 GDB 常用命令
| 命令 | 缩写 | 说明 |
|---|
target remote localhost:3333 | - | 连接 GDB Server |
monitor reset | - | 复位目标 |
monitor halt | - | 停止目标 |
load | - | 加载程序 |
break main | b main | 在 main 设置断点 |
break file.c:123 | b file.c:123 | 在指定行设置断点 |
continue | c | 继续运行 |
step | s | 单步进入 |
next | n | 单步跳过 |
finish | - | 运行到函数返回 |
info registers | i r | 查看寄存器 |
info breakpoints | i b | 查看断点 |
backtrace | bt | 查看调用栈 |
print var | p var | 打印变量值 |
x/10x 0x20000000 | - | 查看内存 |
quit | q | 退出 |
4.4 GDB 调试脚本示例
target remote localhost:3333
monitor reset
monitor halt
file build/STM32F103C8/EIDE-Project.axf
load
break main
continue
info registers
backtrace
五、辅助工具
5.1 串口监视器
串口监视器用于实时查看 MCU 的调试输出。这里使用的是自定义 Python 脚本(基于 pyserial),支持自动重连和日志保存。
python tools/serial_monitor.py
python tools/serial_monitor.py COM8 115200
python tools/serial_monitor.py COM8 115200 -r
依赖安装:
pip install pyserial
用途:AI 可以通过串口监视器读取 MCU 的调试打印,验证程序运行状态,定位运行时问题。
5.2 清理脚本
./.claude/skills/eide-stm32-dev/scripts/clean.sh
六、为什么用命令行
VS Code EIDE 扩展提供了图形界面(Ctrl+F9 编译、F7 烧录),为什么还要折腾命令行?
| 场景 | 图形界面 | 命令行 |
|---|
| AI 自主迭代 | 无法调用 | AI 可直接执行脚本 |
| CI/CD 集成 | 不支持 | 天然支持 |
| 批量操作 | 手动逐个 | 脚本循环 |
| 远程开发 | 依赖 IDE | SSH 即可 |
核心价值:命令行是 AI 与工具链之间的接口。没有命令行接口,AI 就无法自主完成编译→修复→验证的闭环。
七、快速参考
7.1 命令速查表
| 功能 | 命令 |
|---|
| 编译 | unify_builder.exe -p builder.params |
| 重新编译 | unify_builder.exe -p builder.params --rebuild |
| 烧录 | JLink.exe -device STM32F103C8 -if SWD -CommandFile xxx.jlink |
| 启动调试服务 | JLinkGDBServerCL.exe -if SWD -device STM32F103C8 -port 3333 |
| GDB 连接 | target remote localhost:3333 |
7.2 端口速查
| 端口 | 用途 |
|---|
| 3333 | GDB 连接端口 |
| 3334 | SWO 输出端口 |
| 3335 | Telnet 端口 |
7.3 常见问题
| 问题 | 解决方法 |
|---|
builder.params 不存在 | 在 VS Code 中按 Ctrl+F9 编译一次 |
| J-Link 连接失败 | 检查 SWD 接线、目标板供电 |
| 编译错误定位 | 查看输出中的 文件名:行号: Error |
八、环境兼容性
8.1 路径格式
| 环境 | 路径格式 | 说明 |
|---|
| Windows CMD | D:\path\to\file | 反斜杠 |
| Git Bash | /d/path/to/file | Unix 风格 |
| J-Link | D:\path\to\file | 只认 Windows 格式 |
8.2 路径转换(Bash)
WIN_PATH=$(echo "$UNIX_PATH" | sed 's|^/\([a-z]\)/|\U\1:/|' | sed 's|/|\\|g')
8.3 脚本类型选择
| 环境 | 推荐脚本类型 |
|---|
| Windows CMD | .bat / .ps1 |
| Git Bash | .sh |
| 跨平台 | Python |
文档版本:2026-05-04
相关文章
- [[00-Inbox/博客_从WS2812驱动到消消乐游戏-嵌入式开发实战复盘]] — 完整开发故事和问题排查过程
- [[00-Inbox/博客_AI驱动嵌入式开发-Harness-Engineering实践指南]] — 给 AI 配工具的方法论总结
所有评论(0)