SEGGER J-Link

技术栈
工具链
j-link调试器seggerjtagswdrtt

概览

SEGGER J-Link 技术栈概览

SEGGER J-Link 是业界黄金标准的 JTAG/SWD 调试探针,由德国 SEGGER Microcontroller 公司开发。凭借极快的下载速度(最高达 4 MB/s)、宽泛的芯片支持(500+ 厂商、10000+ 芯片)和丰富的配套工具,J-Link 是专业嵌入式开发的首选调试器。

解决什么问题

  • 调试速度瓶颈:SWO 实时追踪、RTT 高速日志、Flash Breakpoints 等超越 GDB 的传统调试
  • 量产烧录:J-Flash 支持批量烧录、序列号写入、保护位配置
  • 多核异构调试:同时调试 Cortex-A + Cortex-M 双核系统
  • 免焊调试:RTT(Real Time Transfer)仅需 SWD 两根线即可实现双向 printf 日志

关键特性

  • 极速下载:Flash 下载速度高达 4 MB/s(J-Link Ultra+)
  • RTT 技术:双向高速通道,printf 输出不影响实时性能
  • Ozone 调试器:专业级图形化调试器,支持指令跟踪、代码分析
  • SystemView:RTOS 事件实时可视化、中断和任务切换时间线
  • J-Scope:变量实时波形显示,无需额外代码

安装

SEGGER J-Link 安装指南

1. 环境准备

项目 要求
操作系统 Windows 7+ / macOS 10.15+ / Linux (x86_64, ARM64)
硬件 J-Link 调试器(EDU/Base/Plus/Ultra+/PRO 任意型号)
USB USB 2.0/3.0 接口,Micro-USB 或 USB-C 线
配套软件 IDE 支持 GDB Server 协议(Keil/IAR/SEGGER Embedded Studio 等)

2. 安装步骤

下载

访问 https://www.segger.com/downloads/jlink/ → 选择对应系统安装包。

⚠️ J-Link EDU 版本仅供教育用途,商业开发请购买 J-Link BASE 或以上型号。

Windows

  1. 下载 .exe 安装包(如 JLink_Windows_V794e.exe
  2. 运行安装向导,接受许可证
  3. 全选组件:J-Link Commander、J-Flash、RTT Viewer、Ozone 等
  4. 安装 USB 驱动(自动)
  5. 完成后插入 J-Link,设备管理器中出现 SEGGER J-Link

macOS

# 下载 .pkg 安装包运行,或:
brew install --cask segger-jlink

Linux (.deb / .rpm)

# Debian/Ubuntu
wget --post-data "accept_license_agreement=accepted" https://www.segger.com/downloads/jlink/JLink_Linux_V794e_x86_64.deb
sudo dpkg -i JLink_Linux_*.deb

# RPM
sudo rpm -i JLink_Linux_*.rpm

# 安装 udev 规则(否则提示权限错误)
sudo cp /opt/SEGGER/JLink/99-jlink.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules

验证

JLinkExe        # Linux/macOS
JLink.exe       # Windows
# 交互式界面输入 ? 查看命令列表
JLink -device STM32F407VG -if SWD -speed 4000 -autoconnect 1

3. 常见安装问题

问题 解决方案
连接提示 "Cannot connect to J-Link" 检查 USB 线是否数据线(非充电线);重新插拔
固件升级提示 允许升级,新版固件修复已知问题
Linux 权限不足 安装 udev 规则后重新插拔 J-Link
Ozone 无法启动调试 检查是否正确选择芯片型号和接口(SWD/JTAG)
J-Link EDU 被识别为克隆 EDU 不允许商用,检查使用场景;如误报联系 SEGGER
VMware/VirtualBox 虚拟机 在虚拟机设置中将 USB 设备直通给 Guest OS

示例

SEGGER J-Link 进阶:J-Flash 量产工具与 SystemView 分析

目标

掌握 J-Flash 批量编程的多功能配置(序列号烧录、选项字节、保护位),以及 SystemView 的 RTOS 实时事件分析。

一、J-Flash 批量量产配置

1. 创建 J-Flash 工程

J-Flash → File → New Project
→ Target Device: STM32F407VG
→ Target Interface: SWD, Speed: 4000 kHz
→ Flash Bank: 自动检测

2. 配置自动序列号

Options → Project Settings → Production
☑ Program Serial Number

Address:       0x0800E000   (Flash 末尾专用区域)
Length:        4 bytes
Start Value:   100000
Increment:     1
Format:        ASCII / Binary

3. 解锁 + 编程 + 锁定流程

Options → Project Settings → Production → Actions
执行顺序:
  1. Unsecure Chip (解除保护)
  2. Erase Sectors (擦除)
  3. Program (编程)
  4. Verify (校验)
  5. Secure Chip (重新写保护 Level 1)
  6. Start Application (运行)

4. 命令行调用(无头模式)

# 单次烧录
JFlash -openprj production.jflash \
       -open firmware.hex \
       -auto \
       -exit

# 批量烧录(脚本循环)
for i in {1..100}; do
    JFlash -openprj production.jflash \
           -open "firmware_v1.2.hex" \
           -auto \
           -exit
    echo "设备 #$i 完成"
done

5. 序列号 CSV 定制

# serial_numbers.csv
Chip_ID,Serial_Number,Calibration_Value
1,SN-24001-A,0x3F2A
2,SN-24002-A,0x3F15
3,SN-24003-A,0x3F48

配合 J-Flash 的 Custom Init Steps 宏调用 CSV 写入每个设备。

二、SystemView — RTOS 实时可视化

1. 集成到 FreeRTOS 工程

/* 下载 SystemView 源码:https://www.segger.com/downloads/systemview/ */
/* 将 SEGGER_SYSVIEW*.c/h 加入工程 */

#include "SEGGER_SYSVIEW.h"
#include "SEGGER_SYSVIEW_FreeRTOS.h"

int main(void) {
    HAL_Init();
    SystemClock_Config();

    /* ── 初始化 SystemView ── */
    SEGGER_SYSVIEW_Conf();
    SEGGER_SYSVIEW_Start();
    SEGGER_SYSVIEW_PrintfHost("SystemView 初始化完成\n");

    /* 注册 FreeRTOS 事件 */
    SEGGER_SYSVIEW_FreeRTOS_Init();

    /* 应用事件 */
    SEGGER_SYSVIEW_RecordVoid(0);  // 事件 ID 0: 系统启动

    // ... 创建任务 ...
    vTaskStartScheduler();
}

/* 在任务中标记事件 */
void sensor_task(void *pv) {
    while (1) {
        SEGGER_SYSVIEW_RecordEnterISR();  // 标记任务开始
        // 采集传感器数据
        SEGGER_SYSVIEW_RecordExitISR();

        // 命名事件
        SEGGER_SYSVIEW_OnUserStart(1);  // 用户事件 1: 数据处理
        process_data();
        SEGGER_SYSVIEW_OnUserStop(1);

        vTaskDelay(pdMS_TO_TICKS(100));
    }
}

2. SystemView 分析

# 启动 SystemView
SystemView

# 连接 J-Link → 选择设备 → 开始录制
# 分析面板:
#   - Timeline: 任务/中断时间线视图
#   - CPU Load: 各任务 CPU 占用率
#   - Context: 上下文切换次数
#   - Events: 用户自定义事件

3. 典型分析场景

问题 SystemView 发现
任务饥饿 低优先级任务长期不执行
中断轰炸 ISR 执行时间占比异常高
优先级翻转 高优任务被意外阻塞
内存泄漏 配合 Heap 监控发现
时序抖动 周期性任务的执行时间波动

三、J-Link Commander 诊断命令

JLinkExe -device STM32F407VG -if SWD -speed 4000

# 常用命令
J-Link>; connect
J-Link>; mem32 0x08000000, 16         # 读 Flash 前 64 字节
J-Link>; mem32 0x20000000, 16         # 读 SRAM
J-Link>; regs                          # 读 CPU 寄存器
J-Link>; setpc 0x08000400              # 设置 PC
J-Link>; w4 0x20000010, 0xDEADBEEF    # 写 32bit 到内存
J-Link>; erase                          # 擦除 Flash
J-Link>; loadbin firmware.bin, 0x08000000  # 烧录 .bin
J-Link>; r                              # 复位
J-Link>; g                              # 运行
J-Link>; halt                           # 暂停
J-Link>; sleep 1000                     # 延时
J-Link>; exit

关键点

  • J-Flash 命令行模式适合 CI/CD 产线自动化
  • SystemView 需要 RTT 或 SEGGER 协议支持,比 J-Scope 提供更丰富的系统级信息
  • 自定义事件 ID 0-31 为 SystemView 保留,用户事件从 32 开始
  • J-Link Commander 是底层诊断利器,适合排查硬件连接问题

J-Link RTT 日志与 Ozone 调试入门

目标

使用 J-Link 的 RTT(Real Time Transfer)实现零额外硬件的高速日志输出,并用 Ozone 进行图形化调试。

硬件

  • J-Link 调试器(EDU/Base/Plus 均可)+ STM32 开发板
  • 仅需 SWD 两根线(SWDIO + SWCLK)+ GND

一、RTT 日志集成

1. 添加 RTT 源文件到工程

# 从 SEGGER 官网或 J-Link 安装目录复制
cp /opt/SEGGER/JLink/Samples/RTT/SEGGER_RTT_V*.zip .
unzip SEGGER_RTT_V*.zip
# 将 SEGGER_RTT.c, SEGGER_RTT.h, SEGGER_RTT_Conf.h 加入工程

2. 初始化 RTT

/* main.c — RTT 日志 + J-Link 调试示例 */
#include "SEGGER_RTT.h"

int main(void) {
    HAL_Init();
    SystemClock_Config();

    /* 初始化 RTT — 必须在主时钟配置之后 */
    SEGGER_RTT_Init();

    SEGGER_RTT_printf(0, "RTT 日志初始化完成!\n");
    SEGGER_RTT_printf(0, "系统时钟: %lu Hz\n", HAL_RCC_GetSysClockFreq());

    uint32_t count = 0;
    uint32_t adc_value;

    while (1) {
        /* 模拟读取传感器 */
        adc_value = (count * 37 + 1024) % 4096;

        /* 高速日志 — 不阻塞,不影响实时性 */
        SEGGER_RTT_printf(0, "[%5lu] ADC: %4lu | 电压: %d.%03dV\n",
                          count, adc_value,
                          (adc_value * 3300) / 4096 / 1000,
                          (adc_value * 3300) / 4096 % 1000);
        count++;
        HAL_Delay(10);
    }
}

3. 查看 RTT 输出

# 启动 J-Link RTT Viewer(图形界面)
JLinkRTTViewer

# 或命令行 RTT Client
JLinkRTTClient

# 指定设备
JLinkRTTViewer -device STM32F407VG -if SWD -speed 4000

4. RTT 优势对比

方式 速度 占用引脚 对实时性影响
UART printf ~1 Mbps 2 脚 (TX/RX) 较高(阻塞)
SWO ITM ~10 Mbps 1 脚 (SWO)
RTT ~100 Mbps 0 脚 极低

RTT 通过 J-Link 的 SWD 通道传输,无需额外引脚!

二、Ozone 图形化调试

1. 启动 Ozone

# 命令行或桌面图标
ozone

2. 创建项目

  1. File → New Project Wizard
  2. 选择设备:STM32F407VG
  3. 选择接口:SWD,速度 4000 kHz
  4. 选择固件:firmware.elf
  5. 点击 Finish

3. 调试功能演示

操作 方法
断点 单击行号左侧
变量监视 右键变量 → Watch
数据采样 View → Data Sampling → 选择变量 → Start
指令跟踪 View → Instruction Trace → 查看执行历史
代码分析 View → Code Profile → 查看函数执行时间占比
实时曲线 配合 J-Scope 查看变量波形

4. Ozone 脚本自动初始化

// Ozone 启动脚本 (.jdebug)
void OnProjectLoad(void) {
    Target.SetTraceSource(TraceSource.ETB);
    Target.EnableTrace(true);
}

void OnTargetHalt(void) {
    Util.Log("Target halted at: " + Util.FormatAddress(CPU.PC()));
}

三、关键点

  • RTT 默认使用上行通道 0,可通过 SEGGER_RTT_printf(channel, ...) 使用多个通道
  • RTT 缓冲区大小在 SEGGER_RTT_Conf.hBUFFER_SIZE_UP 中配置(默认 1024 字节)
  • Ozone 免费提供给 J-Link 用户,功能远超 Keil/IAR 自带调试器

教程

SEGGER J-Link 调试与量产完全指南

本章目标

深入理解 J-Link 在专业嵌入式开发中的核心价值,掌握高级调试和量产工具链。


1. J-Link 型号选择

型号 速度 特色 定位
EDU 15MHz 基础教育用途 学生/爱好者
EDU Mini 4MHz 超小体积 入门
BASE 15MHz 无限制商用 中小型公司
Plus 50MHz 以太网 远程调试
Ultra+ 100MHz 4MB/s Flash 高速量产
PRO 100MHz 多核 + ETM 跟踪 高端开发

2. RTT 深入

RTT 通信原理

MCU RAM 中环形缓冲区 (Up Buffer + Down Buffer)
         ↕
J-Link 通过 SWD 直接读取(无需 CPU 参与)
         ↕
PC 端 RTT Viewer / JLinkRTTClient

多通道使用

// 通道 0:主日志
SEGGER_RTT_printf(0, "System boot OK\n");

// 通道 1:性能计数器(高频)
SEGGER_RTT_Write(1, &perf_data, sizeof(perf_data));

// 通道 2:错误日志
SEGGER_RTT_printf(2, "ERROR: %s at %d\n", file, line);

3. Ozone 高效调试

条件断点

Break.SetCondition("count == 42");
Break.SetCondition("data > 0x100 && data < 0x200");

数据采样

1. View → Data Sampling → 添加变量
2. 设置采样率(1kHz)
3. Start → 运行系统
4. 停后导出 CSV 分析

指令跟踪(ETM/ETB)

  • 需要 J-Trace 或 J-Link Pro
  • 记录每条执行的指令
  • 用于分析 HardFault 现场

4. 量产编程策略

离线烧录

  • J-Link + J-Flash:适合小批量(<1000)
  • Flasher ARM:独立烧录器,一键操作

在线烧录(产线)

# 配合测试治具
JLinkExe -device STM32F407VG -if SWD -speed 4000 \
    -autoconnect 1 -CommanderScript flash_script.jlink

# flash_script.jlink
r
loadbin firmware.bin 0x08000000
verifybin firmware.bin 0x08000000
r
g
exit

5. 安全与保护

# 使能读保护 Level 1
JLinkExe -device STM32F407VG -if SWD <;<EOF
r
w4 0x40023C14 0x08192A3B  # unlock OPTCR
w4 0x40023C14 0x08192A3B
w1 0x1FFFC000 0xCC         # RDP=CC (Level 2 不可逆!)
exit
EOF

⚠️ RDP Level 2 不可逆!芯片将永远无法再调试!


思考题

  1. RTT 为什么比串口 printf 快 100 倍?它的瓶颈在哪?
  2. 条件断点对 CPU 实时性有什么影响?
  3. 量产烧录如何保证固件不被窃取?

参考资料

  1. [1] SEGGER Microcontroller. J-Link User Manual (UM08001). 2024. https://www.segger.com/downloads/jlink/UM08001_JLink.pdf
  2. [2] SEGGER Microcontroller. Ozone User Guide. 2024. https://www.segger.com/downloads/jlink/Ozone_User_Guide.pdf
  3. [3] SEGGER Microcontroller. SystemView User Manual. 2024. https://www.segger.com/downloads/systemview/UM08027_SystemView.pdf
  4. [4] SEGGER Microcontroller. RTT Real Time Transfer Documentation. 2024. https://www.segger.com/products/debug-probes/j-link/technology/about-real-time-transfer/