RTT 日志与 Ozone 调试入门

知识库
知识库文档
/tech-stacks/segger-jlink/examples/RTT 日志与 Ozone 调试入门.md

文档

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 自带调试器

信息

路径
/tech-stacks/segger-jlink/examples/RTT 日志与 Ozone 调试入门.md
更新时间
2026/5/31