1. J-Link 内置智能支持 CPU
通常有以下 2 种方式在 J-Link 软件中支持一个新的 CPU。
- J-Link 固件智能识别
- PC 端 (DLL) 智能识别
最理想的是在 固件 中智能识别,这种方式更强大更健壮,J-Link PC 软件能自动的检测到连接的 CPU-core。如果固件支持智能识别,则会自动识别。如果使用的 J-Link 固件不支持智能识别,并且只有 PC 端智能识别连接到的 CPU,则会以弹窗的形式出现如下警告。
1.1 J-Link 固件智能识别
在较新的 J-Link 上,J-Link 固件可以识别新的 CPU-core,这意味着对于这些 J-Link,目标序列 不用再从 PC 端 生成,而是直接在 J-Link 中生成。在固件中集成智能识别可以提高稳定性和更高的性能。
1.2 PC 端 (DLL) 智能识别
这是在基本实现级别支持一个 CPU-core。这种实现不依赖于 J-Link model,因为这不需要在固件中实现智能识别。这也就意味着,所有的 目标序列(JTAG/SWD/…) 都是在 PC 端产生,J-Link 只是简单的把这些 目标序列 发送出去和将结果发送给 DLL。只要使用的 DLL-Version 能识别 CPU-core, 这种方式就可以使旧的 J-Link 识别新的 CPU-core。
这种方式有个很大的弊端,每一个发送给目标的 序列,都会触发一个 USB 或 以太网 的传输事件。特别是在 USB 连接时会有一个很长的延时,显著影响 J-Link 的执行效率。特别是当执行动作时,J-Link 必须频繁的等待 CPU 的操作。举个例子,一个内存的读写操作,它需要跟随状态读操作或重复,直到内存操作完成。在执行这种任务时, PC 端就需要做一些假设,比如:在给定的周期之后完成操作。或者它需要进行大量的 USB 或 以太网 事务传输。在第一种模式 (fast mode) 在某些情况下不能工作,如 CPU 速度比较低。第二种模式 (slow mode) 将更可靠,但非常缓慢,因为有大量的 USB 或 以太网 事务传输。简单地归结为:最好的解决方案是在模拟器本身具有智能识别。
1.2.1 PC 端 (DLL) 的局限性
不稳定,尤其是低速目标
由于大量的 USB 事务会导致 J-Link 的性能非常差,PC 端的实现假设 CPU/Debug 接口足够快,可以处理 命令/请求 而不需要等待。因此,在使用 PC 端智能识别时,不能保证所有情况下的稳定性,特别是如果目标接口速度 (JTAG/SWD/…) 明显高于 CPU 速度的情况下。
性能低
因为有很多的数据在主机接口 (尤其是 USB) 传输,即使主机接口上的事务数量被限制在最小 (fast mode),由此产生的下载速度通常远低于在 固件中实现智能识别的速度。
不支持
如果使用 PC 端实现智能识别,SEGGER 公司不会给予任何支持。
2. J-Link 软件
从 J-Link 官网 下载软件和工具包,包括使用 J-Link 的应用程序。同时还附带了 J-Link 的 USB 驱动和文档。
| 软件 | 描述 |
|---|---|
| J-Link Commander | 命令行工具,具有目标分析的基本功能 |
| J-Link GDB Server | 是一个服务器,通过 TCP/IP 连接到 GNU Debuger (GDB),它是使用 GDB 协议的工具链连接到 J-Link 是必需的 |
| J-Link GDB Server command line version | J-Link GDB Server 的命令行版本。和 GUI 版本的功能相同 |
| J-Link Remote Server | 它提供了通过 TCP/IP 远程使用 J-Link/J-Trace 的可能性 |
| J-Mem | 目标内存查看器。显示正在运行的目标的内存内容,并允许编辑 |
| J-Flash | 独立的 Flash 编程程序。详见 UM08003(J-Flash User Guide).pdf |
| J-Flash Lite | 独立的 Flash 编程程序。删减版的 J-Flash |
| J-Link RTT Viewer | 免费的 J-Link 程序。显示使用 RTT 的目标的终端输出。可以并行或独立于调试器。 |
| J-Link SWO Viewer | 免费的 J-Link 程序。显示使用 SWO 引脚的目标的终端输出。可以并行或独立于调试器。 |
| J-Link SWO Analyzer | 解析 SWO RAW 输出的命令行工具,并把其存放在文件中 |
| JTAGLoad | 打开 svf 文件,并通过 J-Link/J-Trace 将文件数据发送给目标。 |
| J-Link Configurator | J-Link 的基于 GUI 的配置工具。同时支持基于 USB 和 TCP/IP 的 J-Link 连接。详见: J-Link Configurator |
| RDI support | 提供支持远程调试接口(RDI: Remote Debug Interface)。这将允许用户使用 遵从 RDI 的任何调试器通过 J-Link 调试。 |
| Processor specific tools | 处理特定处理器的免费命令行工具。包括:STR9 Commander 和 STM32 Unlock |
3. J-Link Commander (Command line tool)
更多 J-Link Commander 支持的指令,详见 SEGGER Wiki: J-Link commander。
3.1 命令行选项
为测试和自动化目的,可以使用不同的命令行选项启动 J-Link Commander。下表列出了J-Link Commander 有效的命令行选项。所有的命令行选项不分大小写。
| 命令 | 描述 |
|---|---|
| -AutoConnect | 自动启动目标连接序列 |
| -CommandScript | 发送命令文件给 J-Link |
| -CommandFile | 发送命令文件给 J-Link |
| -Device | 预先选择要连接的设备 |
| -ExitOnError | Commander 在出错后退出 |
| -If | 预先选择目标接口 |
| -IP | 选择 IP 作为主机接口 |
| -JLinkScriptFile | 发送 JLink 脚本文件给 J-Link |
| -JTAGConf | 设置 IRPre 和 DRPre |
| -Log | 设置 Log 文件路径 |
| -RTTTelnetPort | 设置 RTT TelnetPort |
| USB | 通过 USB 连接指定 S/N 号的 J-Link |
| -SettingsFile | 发送设置文件给 J-Link |
| -Speed | 给定一个初始速度开启 J-Link Commander |
3.1.1 -AutoConnect
该命令用于让 J-Link Commander 在进入交互模式时自动启动连接序列以连接到目标。
| 用法 | 示例 |
|---|---|
| -autoconnect <1|0> | JLink.exe -autoconnect 1 |
3.1.2 -CommanderScript
与 -CommandFile 类似。
3.1.3 -CommandFile
选择一个命令文件,并在批处理模式 (in batch mode) 下启动 J-Link Commander。J-Link Commander 的批处理模式类似于执行一个批处理文件。命令文件逐行解析,一次执行一个命令。
| 用法 | 示例 |
|---|---|
| -CommandFile <CommandFilePath> | 详见 3.2 中的 Example |
3.1.4 -Device
预先选择 J-Link Commander 将要连接的设备。对于一些设备,J-Link 在连接时已经知道设备,因为其中的一些设备需要特殊处理。已支持的设备名,详见 List of supported target devices。
| 用法 | 示例 |
|---|---|
| -Device <DeviceName> | JLink.exe -Device STM32F103ZE |
3.1.5 -ExitOnError
与 exitonerror 类似。(手册有误,需要更正)
3.1.6 -If
选择用于连接到目标接口的 J-Link 接口。J-Link Commander 首先会尝试使用当前 J-Link 固件中选择的 J-Link 接口连接到目标。如果连接失败,则 J-Link Commander 会在连接的 J-Link 所支持的所有接口中逐个尝试去连接到设备。
| 用法 | 示例 |
|---|---|
| -If <TargetInterface> | JLink.exe -If SWD |
目前支持的接口如下:
- JTAG
- SWD
3.1.7 -IP
主机接口使用 IP 连接到 J-Link。默认主机接口使用 USB。
| 用法 | 示例 |
|---|---|
| -IP <IPAddr> | JLink.exe -IP 192.168.1.17 |
从以太网上所有可用的模拟器列表中选择,可以使用 ***** 作为 <IPAddr>
3.1.8 -JLinkScriptFile
将 J-Link 脚本文件的路径传给 J-Link Commander。J-Link 脚本文件主要用于连接到需要特殊连接序列的目标,然后才能与核心通信。详见 J-Link Script Files。
| 用法 | 示例 |
|---|---|
| JLink.exe -JLinkScriptFile <File> | JLink.exe -JLinkScriptFile "D:\Default.JLinkScript" |
3.1.9 -JTAGConf
通过 IRPre 和 DRPre,以便在 JTAG-chain 中选择特定的设备。“-1, -1” 用于让 J-Link 自动选择一个设备。
| 用法 | 示例 |
|---|---|
| -JTAGConf <IRPre>, <DRPre> | JLink.exe -JTAGConf 4, 1 JLink.exe -JTAGConf -1, -1 |
3.1.10 -Log
设置日志文件路径,用于 DLL 输出日志信息。如果日志文件已经存在,则会被覆盖。
| 用法 | 示例 |
|---|---|
| -Log <LogFilePath> | JLink.exe -Log D:\log.txt |
3.1.11 -RTTTelnetPort
该命令用于更改 RTT telnet 端口。默认是 19021。
| 用法 | 示例 |
|---|---|
| -RTTTelnetPort <Port> | JLink.exe -RTTTelnetPort 9100 |
3.1.12 USB
通过 USB 连接到指定 SN 号的 J-Link。这样对于多个 J-Link 连接到同一个电脑上,可以通过多个 J-Link Commander 分别连接到不同的 J-Link。
| 用法 | 示例 |
|---|---|
| USB <SerialNo> | JLink.exe USB 580011111 |
3.1.13 -SettingsFile
选择目标设备要使用的 J-Link 设置文件。设置文件可以包含 J-Link Control 面板中的 “设置” 选项卡中的所有可配置选项。
| 用法 | 示例 |
|---|---|
| -SettingsFile <PathToFile> | JLink.exe -SettingsFile "D:\settings.txt" |
3.1.14 -Speed
以给定的初始速度开启 J-Link Commander。可使用的参数为 “adaptive”,“auto” 或者是一个可选择的整型值 (单位:kHz)。推荐使用固定速率,或者如果目标支持,可以使用自适应速率,默认的速率是 4000kHz。
| 用法 | 示例 |
|---|---|
| -Speed <Speed_kHz> | JLink.exe -Speed 4000 |
3.2 使用 J-Link 命令文件
还可以在 批处理模式 下使用 J-Link Commander,可以在不需要用户交互的情况下,使用 J-Link Commander 进行批处理操作。 不要混淆 J-Link 命令文件和 J-Link 脚本文件。当在 批处理模式 时使用 J-Link Commander,需要将命令文件路径传给它。命令文件的语法与 J-Link Commander 中的常规命令相同 (每个命令单独占一行)。SEGGER 建议始终通过命令行选项传递设备名,因为一些设备在连接/复位时需要进行特殊处理,以保证正常的功能。
示例:
JLink.exe -device STM32F103ZE -CommandFile D:\CommandFile.jlink
CommandFile.jlink 内容如下:
si 1
speed 4000
r
h
loadbin D:\firmware.bin, 0x08000000
附录一:命令集
支持的命令按用途分为如下几类:
通用
命令 描述 f 显示固件信息 h 停止 CPU IsHalted 返回当前 CPU 的状态 (停止/非停止) WaitHalt 等待 CPU 停止或给定的超时时间
语法:WaitHalt <TimeoutMs> 默认超时时间为 1000 msg 继续运行 Sleep 等待给定的时间 (单位: 毫秒)
语法:Sleep <delay>s 单步执行
语法:s [<NumSteps (dec)>]st 显示硬件状态 hwinfo 显示硬件信息 mem 读内存
语法:mem [<Zone>:]<Addr>,<NumBytes> (hex)mem8 按 8-bit 读取
语法:mem8 [<Zone>:]<Addr>,<NumBytes> (hex)mem16 按 16-bit 读取
语法:mem16 [<Zone>:]<Addr>,<NumBytes> (hex)mem32 按 32-bit 读取
语法:mem32 [<Zone>:]<Addr>,<NumBytes> (hex)w1 按 8-bit 写入
语法:w1 [<Zone>:]<Addr>,<Data> (hex)w2 按 16-bit 写入
语法:w2 [<Zone>:]<Addr>,<Data> (hex)w4 按 32-bit 写入
语法:w4 [<Zone>:]<Addr>,<Data> (hex)erase 擦除所选择设备的内部 Flash
语法:Erasewm 写测试字
语法:wm <NumWords>is 识别扫描链选择寄存器的长度 (Identify length of scan chain select register) ms 测量扫描链 (scan chain) 的长度
语法:ms <Scan chain>mr 测量 RTCK 反应时间 (react time)。
语法:mrq 退出 qc 关闭 JLink 连接并退出 eoe 出错退出
语法:eoe <1/0>r 复位 rx 复位
语法:rx <DelayAfterReset>RSetType 设置当前复位类型
语法:RSetType <type>Regs 显示寄存器内容 wreg 写寄存器
语法:wreg <RegName>,<Value>moe 显示模式进入的原因 (mode-of-entry),也就是说:CPU 为什么停止 SetBP 设置断点
用法:SetBP <addr> [A/T] [S/H]SetWP 设置观察点
语法:<Addr> [R/W] [<Data> [<D-Mask>] [A-Mask] ]ClrBP 清除断点
语法:ClrBP <BP_Handle>ClrWP 清除观察点
语法:ClrWP <WP_Handle>VCatch 写矢量捕获
语法:VCatch <Value>loadfile 下载文件到目标内存
语法:loadfile <filename>,[<addr>]
支持的扩展:*.bin,*.mot,*.hex,*.srec
<addr> 只用于 bin 文件loadbin 下载 bin 文件到目标内存
语法:loadfile <filename>,<addr>savebin 保存目标内存到二进制文件中
语法:savebin <filename>,<addr>,<NumBytes>verifybin 验证指定的二进制是否已经位于目标内存的指定地址
语法:verifybin <filename>,<addr>SetPC 设置 PC 为指定的值
语法:SetPC <Addr>le 切换到小端模式 be 切换到大端模式 log 使能日志信息
语法:log <filename>unlock 解锁设备
语法:unlock <DeviceName>
<DeviceName> 没解锁,则返回支持的设备列表
nRESET 被连接上term 测试命令,用来可视化目标设备的 printf 输出,使用 DCC (目标上运行 SEGGER DCC handler) ReadAP 读取一个 CoreSight AP 寄存器
注意:第一次读会返回之前读的数据,需要额外读取 DP 寄存器 3 以获取数据ReadDP 读取一个 CoreSight DP 寄存器
注意:对于 SWD,数据立刻返回
对于 JTAG,会返回之前读的数据,需要额外读取 DP 寄存器 3 以获取数据WriteAP 写入一个 CoreSight AP 寄存器 WriteDP 写入一个 CoreSight DP 寄存器 SWDSelect 选择 SWD 作为接口和输出
JTAG -> SWD 切换序列SWDReadAP 通过 SWD 读取一个 CoreSight AP 寄存器
注意:第一次读会返回之前读的数据,需要额外读取 DP 寄存器 3 以获取数据SWDReadDP 通过 SWD 读取一个 CoreSight DP 寄存器
注意:正确的数据立刻返回SWDWriteAP 通过 SWD 写入一个 CoreSight AP 寄存器 SWDWriteDP 通过 SWD 写入一个 CoreSight DP 寄存器 Device 选择连接一个指定的设备。
在大多数情况下,设备的显式选择是不必要的。选择设备使用户能够使用 J-Link Flash 编程功能以及在 Flash 中使用无限个断点
对于某些设备,显式设备选择是强制性的,以便允许 DLL 执行设备所需的特殊处理ExpDevList 从 DLL 内部导出设备名 ExpDevListXML 将设备名称从 DLL 内部设备列表导出到 XML 格式的文本文件
语法:ExpDevListXML <Filename>PowerTrace 执行电源跟踪 (并非所有模型都支持)
语法:PowerTrace <LogFile> [<ChannelMask> <RefCountSel>]
<LogFile>:用于存放电源跟踪数据的文件
<ChannelMask>:32-bit mask 用于指定什么通道被使能
<SampleFreq>:采样频率 (单位:Hz) (0 == max)
<RefCountSel>:0:无参考计数;1:在 SWO 上传输的字节数CP15
命令 描述 rce 读取 CP15
语法:rce <Op1>,<CRn>,<CRm>,<Op2>wce 写入 CP15
语法:wce <Op1>,<CRn>,<CRm>,<Op2>,<Data>ICE
命令 描述 Ice 显示嵌入式 ice 跟踪宏的状态 (ICE breaker) ri 读取 Ice 寄存器
语法:ri <RegIndex> (hex)wi 写入 Ice 寄存器
语法:wi <RegIndex>,<Data> (hex)TRACE
命令 描述 TClear TRACE:清除缓冲区 TSetSize TRACE:设置跟踪缓冲区的大小 TSetFormat TRACE:设置格式 TSR TRACE:显示区域 (并分析跟踪缓冲区) TStart TRACE:启动 TStop TRACE:停止 SWO
命令 描述 SWOSpeed SWO:显示支持的速率 SWOStart SWO:启动 SWOStop SWO:停止 SWOStat SWO:显示 SWO 状态 SWORead SWO:读取并显示 SWO 数据 SWOShow SWO:读取并分析 SWO 数据 SWOFlush SWO:刷新数据 SWOView SWO:查看终端数据 PERIODIC
命令 描述 PERConf PERIODIC:配置 PERStart PERIODIC:启动 PERStop PERIODIC:停止 PERStat PERIODIC:显示状态 PERRead PERIODIC:读取并显示数据 PERShow PERIODIC:读取并分析数据 File I/O
命令 描述 fwrite 向模拟器写入文件 fread 从模拟器读取文件 fshow 从模拟器读取并显示文件 fdelete 删除模拟器上的文件 fsize 显示模拟器上文件的大小 flist 列出模拟器上目录 SecureArea 创建/移除 probe 上的安全区域 Test
命令 描述 TestHaltGo 运行 go/halt 1000 次 TestStep 运行 step 1000 次 TestWSpeed 测试目标内存的写入速度
参数:[<Addr> [<Size>] ]TestRSpeed 测试目标内存的读取速度
参数:[<Addr> [<Size>] [<NumBlocks>] ]TestNWSpeed 测试网络下载速度
参数:[<NumBytes> [NumReps] ]TestNRSpeed 测试网络上传速度
参数:[<NumBytes> [\NumReps] ]TestCSpeed 测试 CPU 的速度
参数:[<RAMAddr>]JTAG
命令 描述 JTAGConf 在 ARM 设备前设置 IR/DR 位
语法:Config <IRpre>,<DRpre>speed 设置目标接口速率 i 读取 JTAG 的 Id wjc 写 JTAG 命令 (IR)
语法:wjc <Data> (hex)wjd 写 JTAG 数据 (DR)
语法:wjd <Data64> (hex),<NumBits> (dec)RTAP 使用状态机 (111110) 复位 TAP 控制器 wjraw 写 Raw JTAG 数据
语法:wjraw <NumBits (dec)>,<tms>,<tdi>rt 复位 TAP 控制器 (nTRST) JTAG-Hardware
命令 描述 c00 创建 TDI = TMS = 0 的时钟 c 时钟 tck0 清除 TCK tck1 设置 TCK 0 清除 TDI 1 设置 TDI t0 清除 TMS t1 设置 TMS trst0 清除 TRST trst1 设置 TRST r0 清除 RESET r1 设置 RESET Connection
命令 描述 usb 通过 USB 连接到 J-Link
语法:usb <port> (port : 0 ~ 3)ip 通过 TCP/IP 连接到 J-Link ARM Pro 或 J-Link TCP/IP 服务器 Configuration
命令 描述 si 选择目标接口
语法:si <Interface> (Interface: SWD,JTAG,ICSP,FINE,… 任何支持的目标接口)power 开关目标电源
语法:power <State> [perm] (State:on/off)wconf 写配置字节
语法:wconf <offset>,<data>rconf 读配置字节
语法:rconflicense 显示所有有效的已授权命令 ipaddr 显示/分配连接的 J-Link 的 IP 地址和子网掩码 gwaddr 显示/分配连接的 J-Link 的网关地址 dnsaddr 显示/分配连接的 J-Link 的 DNS 服务器地址 conf 显示连接的 J-Link 的配置 calibrate 校准目标电流测量 selemu 从连接到主机的模拟器列表中选择要通信的模拟器
语法:selemu [<Interface0> <Interfacce1> …]showEmuList 显示连接到主机的所有模拟器的列表
语法:showEmuList [<Interface0> <Interfacce1> …]VTREF 为 J-Link 的 VTref 设置一个固定值
语法:VTREF <ValuemV>