1.下载源码:https://github.com/SEGGERMicro/RTT
在这里插入图片描述
通用使用与配置
要将 RTT 集成到项目中,需将 RTT/SEGGER_RTT.c 添加到项目的源文件中,并将 RTT 目录添加为包含目录。
RTT/SEGGER_RTT_ASM_ARMv7M.S 是可选的汇编优化实现文件,可作为额外的源文件添加(Cortex-M3/M4/M7代码中默认配置启用),用于替代 RTT 函数的 C 语言实现。该文件兼容 ARMv7M 和 ARMv8M 处理器,并支持大多数工具链。

RTT 可通过 SEGGER_RTT_Conf.h 进行配置。在大多数情况下,默认配置已足够使用,无需修改 SEGGER_RTT_Conf.h。若需要进行额外配置,建议将 SEGGER_RTT_Conf.h 复制到项目的配置目录中,并在副本上进行修改。这样可以避免在更新软件包时配置被覆盖。

2.在CMakeList.txt中添加.c和头文件路径
在这里插入图片描述
3.在代码中初始化

#include "SEGGER_RTT.h"

int main(void) {
    // ... 硬件初始化
    SEGGER_RTT_Init(); // 初始化 RTT

    // 使用 RTT 打印
    SEGGER_RTT_printf(0, "Hello from STM32G431 via RTT!\n");

    while(1) {
        // ...
    }
}

4.查看
方法1:J-Link RTT Viewer。此时不能一边在线调试一边读取结果。
在这里插入图片描述
方法二:集成到vscode,可在线调试时打印

launch.json中,原工程类型“jlinkgdbtarget”不支持RTT,新增设置:

{
    "name": "Debug with J-Link & RTT",
    "type": "cortex-debug",      // 确保类型cortex-debug
    "request": "launch",
    "cwd": "${workspaceFolder}",
    "preLaunchTask": "build",    // 这个名称需要和 tasks.json 中的任务名匹配
    "executable": "${command:st-stm32-ide-debug-launch.get-projects-binary-from-context1}",
    "servertype": "jlink",       // 指定 GDB 服务器为 J-Link
    "device": "STM32G431VB",     // 明确指定设备型号
    "interface": "swd",
    "runToEntryPoint": "main",
    // 在此处即可正常使用 rttConfig
    "rttConfig": {
        "enabled": true,
        "address": "auto",
        "decoders": [
            {
                "port": 0,
                "type": "console",
                "label": "RTT Output"
            }
        ]
    }
}

task.json中定义:

{
    "label": "build",          // 这个标签必须与 preLaunchTask 一致
    "type": "shell",
    "command": "cmake",
    "args": [
        "--build",                          // 构建参数
        "${command:cmake.buildDirectory}",   // 指定构建目录
        "--parallel", "8"                   // -j8 参数
    ],
    "group": {
        "kind": "build",
        "isDefault": true
    },
    "problemMatcher": ["$gcc"],
    "detail": "编译调试目标"
}

安装插件:
在这里插入图片描述

点击运行:
在这里插入图片描述
TERMINAL中新增一个页面,可以看到trace打印:
在这里插入图片描述
5.重定向printf
重写_write

// GCC 环境下,printf 调用的是 _write,而不是 fputc
_ssize_t _write(int file, char *ptr, int len)
{
    //HAL_UART_Transmit(&uart_debug, (uint8_t *)ptr, len, 0xFFFF);
	SEGGER_RTT_Write(0, ptr, len);
    return len;
}

现在可以实现jlink+vscode编译、调试、烧录一条龙!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐