1. RTT简介

1.1 什么是RTT

RTT(Real Time Transfer)是SEGGER提供的一种嵌入式系统日志输出技术,相比传统串口有以下优势:

  • 高速传输:最高可达1MB/s

  • 无需额外硬件:直接通过调试器传输

  • 不影响程序实时性:后台传输不阻塞主程序

  • 多通道支持:可同时用于日志、命令交互等

1.2 工作原理

RTT在目标内存中创建共享数据块,调试器通过JTAG/SWD接口直接读写内存实现数据交换。

2. 环境搭建

2.1 获取RTT源码

bash

​​​​​​​# 从SEGGER官网下载J-Link软件包
# 路径:安装目录/Segger/JLink_VXXX/Samples/RTT
首先在官网选择合适的版本下载并安装 Jlink官网链接

下载完成安装后,可以看见以下所有的目录:RTT使用的库在Samples里面

2.2 工程配置

将以下文件添加到STM32工程:

  将里面的压缩包打开。可以得到所有的需要的文件


将这些加入到自己的keil工程中


加上头文件路径


务必将取消 这个勾选!!!

3. 基础使用

3.1 初始化配置

基础的打印操作:

可以直接在main函数中初始化RTT:即可使用:// RTT自动初始化,无需额外配置

不要忘记加上头文件:#include "SEGGER_RTT.h"

封装使用或重映射至熟悉的printf函数:
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <string.h>
#include <stdio.h>
#include "SEGGER_RTT.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

void print_log(const char * sFormat, ...)
{	
	va_list ParamList;
	va_start(ParamList, sFormat);
	SEGGER_RTT_vprintf(0, sFormat, &ParamList);
	va_end(ParamList);
}


int fputc(int ch, FILE *f)
{
    SEGGER_RTT_PutChar(0, ch); // 将字符发送到 RTT 的终端 0
    return ch;
}

/* USER CODE END 0 */

最终实现基本的输出日志功能:打开jlink安装的位置文件夹中的J_Link RTT Viewer 窗口,并进行连接后,运行程序即可打印日志功能.

硬件上,Jlink 连接线 连接到 STM32上,打开 【Segger RTT Viewer Vxxx.exe】,连接芯片,我这里选择的是 STM32F7676IG,请根据自己所用的芯片进行选择

在主函数中调用:

3.2 深入高级日志输出

// 简单的字符串输出
SEGGER_RTT_WriteString(0, "Hello RTT!\n");

// 格式化输出(类似printf)
SEGGER_RTT_printf(0, "System Started, Time: %dms\n", HAL_GetTick());

// 带颜色的输出
SEGGER_RTT_WriteString(0, RTT_CTRL_TEXT_BRIGHT_GREEN "OK: Operation Success\n");

4. 高级功能

4.1 多通道配置

// 定义多个通道
#define LOG_CHANNEL   0
#define DEBUG_CHANNEL 1
#define ERROR_CHANNEL 2

// 分别输出到不同通道
SEGGER_RTT_WriteString(LOG_CHANNEL, "Normal log message\n");
SEGGER_RTT_WriteString(DEBUG_CHANNEL, "Debug information\n");
SEGGER_RTT_WriteString(ERROR_CHANNEL, "Error occurred!\n");

4.2 颜色配置

// 颜色控制序列
#define RTT_COLOR_RED     RTT_CTRL_TEXT_BRIGHT_RED
#define RTT_COLOR_GREEN   RTT_CTRL_TEXT_BRIGHT_GREEN  
#define RTT_COLOR_YELLOW  RTT_CTRL_TEXT_BRIGHT_YELLOW
#define RTT_COLOR_BLUE    RTT_CTRL_TEXT_BRIGHT_BLUE
#define RTT_COLOR_RESET   RTT_CTRL_RESET

// 彩色日志输出
SEGGER_RTT_WriteString(0, RTT_COLOR_GREEN "[INFO] " RTT_COLOR_RESET);
SEGGER_RTT_printf(0, "Sensor value: %d\n", sensor_value);

4.3 自定义打印函数

// 封装便于使用的日志函数
void log_info(const char* format, ...)
{
    SEGGER_RTT_WriteString(0, RTT_COLOR_GREEN "[INFO] " RTT_COLOR_RESET);
    
    va_list args;
    va_start(args, format);
    SEGGER_RTT_vprintf(0, format, &args);
    va_end(args);
    
    SEGGER_RTT_WriteString(0, "\n");
}

void log_error(const char* format, ...)
{
    SEGGER_RTT_WriteString(0, RTT_COLOR_RED "[ERROR] " RTT_COLOR_RESET);
    
    va_list args;
    va_start(args, format);
    SEGGER_RTT_vprintf(0, format, &args);
    va_end(args);
    
    SEGGER_RTT_WriteString(0, "\n");
}

5. 实战应用

5.1 在FreeRTOS中使用

// 线程安全的RTT输出
void thread_safe_log(const char* format, ...)
{
    taskENTER_CRITICAL();
    
    va_list args;
    va_start(args, format);
    SEGGER_RTT_vprintf(0, format, &args);
    va_end(args);
    
    taskEXIT_CRITICAL();
}

5.2 性能监控

void performance_test(void)
{
    uint32_t start_time, end_time;
    
    start_time = HAL_GetTick();
    for(int i = 0; i < 1000; i++) {
        SEGGER_RTT_printf(0, "Test message %d\n", i);
    }
    end_time = HAL_GetTick();
    
    SEGGER_RTT_printf(0, "RTT Performance: %d messages in %dms\n", 
                      1000, end_time - start_time);
}
6. 调

6. 调试工具使用

6.1 J-Link RTT Viewer

  1. 连接J-Link调试器

  2. 打开J-Link RTT Viewer

  3. 自动检测目标设备

  4. 实时查看日志输出

6.2 Telnet连接

bash

# 通过telnet连接RTT服务器
telnet localhost 19021

7. 常见问题解决

7.1 无法检测到RTT

  • 检查调试器连接

  • 确认目标设备在运行状态

  • 验证RTT缓冲区地址设置

7.2 输出乱码

  • 检查RTT版本兼容性

  • 确认缓冲区大小设置合理

  • 验证内存访问权限

7.3 性能优化

c

// 批量输出减少调用次数
char buffer[256];
snprintf(buffer, sizeof(buffer), "Multiple values: %d, %f, %s\n", val1, val2, str);
SEGGER_RTT_WriteString(0, buffer);

8. 总结对比

特性 RTT 串口 SWO
速度 快(~1MB/s) 慢(~115200bps)
硬件需求 调试器 串口线 调试器
配置复杂度 简单 简单 复杂
实时性

附录

代码示例下载

[GitHub仓库链接]

参考文档

  • SEGGER RTT官方文档

  • J-Link用户手册

  • STM32调试技术指南

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐