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 是否返回校验通过。三者同时满足,才可认为这次烧录在自动化意义上成功。

五、脚本执行流程与判定关系

下图把上述命令文件的执行顺序、关键参数与成功判定条件放在一起,便于对照理解每一步的作用与失败点。

JLink.exe 脚本模式执行流程与判定 flash.jlink 命令文件 si SWD speed 4000 device STM32F407IG connect erase loadfile app.hex verifybin app.hex r / g qc JLink.exe -CommandFile -ExitOnError 1 -Log flash.log 逐行解析并执行 失败即中止 返回退出码 目标板 STM32F407 Flash SWDIO / SWCLK / GND 0x08000000 起始 复位后从向量表启动 成功判定三条件 ① 退出码 = 0 ② 日志含 O.K. 无 ERROR ③ verifybin 校验通过 失败:退出码非 0,流水线中断

从图中可以看到,脚本的每一步都对应一个明确的失败点:接口或速度设置错误会在 connect 阶段失败;设备型号不匹配会导致 Flash 算法加载失败;loadfile 失败通常意味着文件路径或地址错误;而 verifybin 失败则说明写入内容与源文件不一致,必须重新烧录。把这些失败点与日志关键字对应起来,就能在自动化环境中快速定位问题。

在 CI 中调用 JLink.exe 时,建议固定三件事:命令文件纳入版本管理、日志文件按构建号命名归档、退出码作为流水线唯一判定依据。这样任何一次烧录失败都能通过日志复现,而不是依赖人工观察窗口输出。