小技巧:STM32中使用SEGGER RTT日志功能 - 完整使用指南
#STM32 #RTT #嵌入式日志 #SEGGER #调试技巧
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
-
连接J-Link调试器
-
打开J-Link RTT Viewer
-
自动检测目标设备
-
实时查看日志输出
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调试技术指南
更多推荐





所有评论(0)