3. J-Link命令行工具自动化基础
当烧录动作需要被 CI 流水线、批量产测脚本或无人值守的回归测试反复调用时,图形界面的 J-Flash 就不再合适。SEGGER 提供的 JLink.exe(Windows 下为 JLink.exe,Linux/macOS 下为 JLinkExe)是一个纯命令行、可脚本化的调试与烧录工具,它通过读取命令文件(Command File)按顺序执行连接、下载、复位、校验等动作,是构建自动化烧录工程的最小可用单元。本节的目标是理解它的脚本模式与命令文件语法,并写出第一个可复用的自动化烧录脚本。
一、JLink.exe 的两种运行模式
JLink.exe 有两种典型用法。第一种是交互模式:直接执行 JLink.exe,工具进入一个类似 shell 的提示符 J-Link>,用户逐条输入命令,例如 connect、erase、loadfile、r、g、qc。这种方式适合手工调试,但无法被自动化系统稳定驱动。
第二种是脚本模式,也是自动化测试真正使用的模式:通过 -CommandFile 参数指定一个文本文件,JLink.exe 启动后自动逐行执行文件中的命令,执行完毕后退出,并把过程输出到标准输出或日志文件。典型调用形式如下:
JLink.exe -CommandFile flash.jlink -ExitOnError 1 -Log flash.log
其中 -ExitOnError 1 表示任一命令失败即终止并返回非零退出码,这一点对 CI 判断成败至关重要;-Log 把完整会话写入日志,便于失败复盘。Linux 下把可执行文件换成 JLinkExe,参数完全一致。
二、命令文件语法与连接参数
命令文件是纯文本,一行一条命令,// 开头为注释,空行被忽略。命令本身不区分大小写,但设备名、文件名建议保持原样。一个完整的烧录命令文件通常包含四类内容:设备与接口选择、连接速度、下载与复位动作、退出。
连接参数是脚本能否成功的第一步。核心参数有三个:
- Device:目标芯片型号,必须与 J-Link 支持列表中的名称一致,例如
STM32F407IG、nRF52840_xxAA。写错会导致 J-Link 无法识别 Flash 算法。 - Interface:调试接口类型,常见为
SWD或JTAG。现代 Cortex-M 芯片绝大多数使用 SWD,只需两根信号线加地线。 - Speed:接口时钟频率,单位 kHz,例如
4000表示 4 MHz。速度过高在长排线或干扰环境下会连接失败,可先降到 1000 再逐步提高。
这三项通过 si(Select Interface)、speed、device 命令设置,或者用 connect 进入交互式选择。在脚本中推荐显式写出,避免依赖默认值。
三、下载、复位与校验命令
连接成功后即可执行烧录动作。常用命令包括:
erase:整片擦除,适合首次烧录或需要清除旧数据的场景;也可用erase 0x08000000 0x0800FFFF做扇区范围擦除。loadfile <文件> [地址]:把 hex/bin 文件写入目标 Flash。hex 文件自带地址信息,bin 文件必须显式给出起始地址,例如loadfile app.bin 0x08000000。verifybin <文件> <地址>:把目标 Flash 内容与文件比对,是自动化流程中判断烧录是否真正成功的依据。r:复位并停止在复位向量处;g:复位后直接运行;h:停机。qc:关闭连接并退出 JLink.exe,等价于 Quit + Close。
需要特别注意的是,loadfile 成功只代表数据写入过程没有报错,并不保证 Flash 内容与源文件完全一致。因此在自动化脚本中,下载后必须紧跟一次校验,把校验结果作为流水线的判定条件。
四、首个自动化烧录脚本
下面给出一个可直接使用的命令文件示例,目标是一块 STM32F407 开发板,通过 SWD 烧录 app.hex 并复位运行。参数均为教学示例值,实际使用时请按自己的芯片与文件替换。
// flash.jlink - 首个自动化烧录脚本
si SWD // 选择 SWD 接口
speed 4000 // 接口时钟 4 MHz
device STM32F407IG // 目标芯片型号
connect // 建立连接
erase // 整片擦除
loadfile app.hex // 下载固件
verifybin app.hex 0x08000000 // 校验写入内容
r // 复位并停止
g // 运行
qc // 关闭连接并退出
执行命令为:
JLink.exe -CommandFile flash.jlink -ExitOnError 1 -Log flash.log
判断烧录是否成功,不能只看窗口有没有报错,而应检查三处:一是进程退出码是否为 0;二是日志中是否出现 O.K. 且没有 ERROR、Failed 字样;三是 verifybin 是否返回校验通过。三者同时满足,才可认为这次烧录在自动化意义上成功。
五、脚本执行流程与判定关系
下图把上述命令文件的执行顺序、关键参数与成功判定条件放在一起,便于对照理解每一步的作用与失败点。
从图中可以看到,脚本的每一步都对应一个明确的失败点:接口或速度设置错误会在 connect 阶段失败;设备型号不匹配会导致 Flash 算法加载失败;loadfile 失败通常意味着文件路径或地址错误;而 verifybin 失败则说明写入内容与源文件不一致,必须重新烧录。把这些失败点与日志关键字对应起来,就能在自动化环境中快速定位问题。