[STM32]jlink RTT使用详解

article/2025/8/26 17:41:47

1.什么是Jlink RTT。
全称为SEGGER’s Real Time Transfer(RTT),一种基于SEGGER公司的基于JLink调试器的交互式用户I/O的技术。故名思义,就是一种基于jlink的和用户进行交互的技术,可以直观的显示调试芯片的信息,以及可以让用户和调试芯片进行互动的技术。

2.为什么要使用Jlink RTT。
1>不需要额外的引脚和硬件配置,支持SWD方式,两根线就可以使用。
2>速度快,与debug和run并行使用,平均一行文本可以在一微秒或更少的时间内输出。官方给出了一个速度对比图。

3>RTT的通信可以通过不同的应用程序完成,可以使用SDK集成到自定义的应用程序中,可本地连接,可远程连接。
基于以上3个优点,如果你还在调试ARM芯片的时候傻傻的使用USART进行用户交互,那实在是效率太低了。

3.Jlink使用RTT的准备
1>jlink软件包
SEGGER - The Embedded Experts - Downloads - J-Link / J-Trace

2>Jlink仿真器一个,官网没找到到底哪一个版本的Jlink版本开始支持RTT的,看到网上说V9是支持的,我这里用的是Jlink V11的仿真器。
HW:V11.00
dll:V6.98c

4.移植RTT的SDK代码到MDK的工作
1>在上一步Jlink软件的安装路径下找到RTT的SDK包,我这里在D盘安装的。
D:\Program Files (x86)\SEGGER\JLink\Samples\RTT\RTT


2>MDK工程下新建一个RTT的文件夹,把下面四个文件复制到RTT目录下,将这些文件添加到MDK的工程中。


将代码添加到工程中



头文件包含



5.支持RTT的三个软件
Jlink提供了三个软件RTT Viewer、RTT Client、RTT Logger,这三个软件可以在SEGGER目录下找到:


6.使用RTT前的一些需要了解的几个概念。
使用RTT需要了解两个概念,即所谓的channel和terminal。这里我也只是根据我现在的认知做了一个解释,不一定恰当。
由于没有详解RTT的内部运行机制,我在这里把channel和terminals理解为软件的概念。
RTT的SDK默认支持2个channel,分别是0和1。
每个channel支持16个terminal,分别是0-F。
在这两个概念的基础上,我把RTT Viewer、RTT Client、RTT Logger这三个软件做了一个对照表。了解下面这个表格,才能更好的使用和配置RTT。



7.MDK的代码编写

1>头文件引用#include "SEGGER_RTT.h"
2>RTT的初始化函数 SEGGER_RTT_Init();
上面两项是通用代码,下面是使用通道0,用RTT Viewer、RTT Client输出一段调试信息。


/**********************************************************************************************************                                                主程序*********************************************************************************************************/int main (void)                                                                                 {FLASH_ReadOutProtection(DISABLE);                                   //读保护SystemInit();                                                                            //CPU时钟初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);        //使用优先级组4(4:4结构)SEGGER_RTT_Init();    #ifdef DEBUG_MODE                                                        //调试模式SEGGER_RTT_printf(0,"Demo Init!\r\n");#endif    while(1){SEGGER_RTT_SetTerminal(0);     SEGGER_RTT_printf(0,"Demo Run Terminal 0!\r\n");    SEGGER_RTT_SetTerminal(1);     SEGGER_RTT_printf(0,"Demo Run Terminal 1!\r\n");         }return (0);}

 上面的代码就是用通道0的terminal0和terminal1输出调试信息。RTT的SDK中默认已经配置好channel 0的参数了,我们使用channel 0的时候,直接使用打印函数即可。
上述代码编辑后编译无错误,然后下载。

打开RTT Viewer后显示如下,按照实际情况配好参数后点击OK。



可以看到控制窗口已经输出了调试信息。>前面的数字即为当前使用的terminal ID。



打开RTT Client后显示如下:


这时候会发现没有数据输出。不要着急,重点来了。

1)先关闭RTT Client,点击MDK的Debug按钮进去Debug模式。



2)再次打开RTT Client,显示如下:



3)点击MDK的Run全速运行。控制台开始输出调试信息。



下面继续使用通道1,使用RTT Logger输出调试信息在log文件中。因为RTT Logger使用的是通道1,RTT的SDK中是没有给通道1分配缓存区和名称的,必须进行手动设置。
还有要注意的是,通道0和通道1是并行的,两者输出调试信息是不冲突的。
使用通道1的代码如下所示:

uint8_t _UpBufferCH1[64] = {0};
uint8_t _DownBufferCH1[64] = {0};


/*********************************************************************************************************
*                                                主程序
*********************************************************************************************************/
int main (void)                                                                                 
{


  FLASH_ReadOutProtection(DISABLE);                                   //读保护


    SystemInit();                                                                            //CPU时钟初始化
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);        //使用优先级组4(4:4结构)

    SEGGER_RTT_Init();   


    /* 配置通道1,上行配置(STM32->RTT Viewer软件) */
    SEGGER_RTT_ConfigUpBuffer(1, "RTTUP", _UpBufferCH1, 64, SEGGER_RTT_MODE_NO_BLOCK_SKIP);

    /* 配置通道1,下行配置(RTT Viewer软件->STM32) */   
    SEGGER_RTT_ConfigDownBuffer(1, "RTTDOWN", _DownBufferCH1, 64, SEGGER_RTT_MODE_NO_BLOCK_SKIP);

    #ifdef DEBUG_MODE                                                        //调试模式
    SEGGER_RTT_printf(0,"Demo Init!\r\n");
    #endif   


while(1)
{
        SEGGER_RTT_SetTerminal(0);     
        SEGGER_RTT_printf(1,"Demo Run Terminal 0!\r\n");   
        SEGGER_RTT_SetTerminal(1);     
        SEGGER_RTT_printf(1,"Demo Run Terminal 1!\r\n");         
}



  return (0);
}

上述代码编辑后编译无错误,然后下载。
打开RTT Logger后如下所示:



这里要注意的是,在RTT Logger中,>后面可以自由输入>前面表示的参数,按回车键确认。无输入的情况下,按回车键跳过。
一直回车键,如果程序配置通道1正确的话,会出现下面图片的画面,不停的给log文件中写数据。
注意:如果程序中没有配置通道1,RTT Logger检测不到通道1的情况下就会自动关闭。
正确的RTT Logger显示画面如下:


打开上述路径中的.log文件,里面的内容如下所示,这说明成功的生成了log文件。



只要弄懂上面的内容,你就可以很爽的使用RTT来输出调试信息了,我们一般只使用RTT Viewer这个软件就足够了。他还可以设置显示的颜色,格式化输出等,具体的函数说明可以查看
Jlink安装目录下的使用手册16.4.1章节即可。
手册路径如下:D:\Program Files (x86)\SEGGER\JLink\Doc\Manuals。

---------------------
作者:xyz549040622
链接:https://bbs.21ic.com/icview-3118746-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。


http://chatgpt.dhexx.cn/article/gTvO1NSB.shtml

相关文章

Redis-RTT

1. 什么是redis的RTT RTT是网络往返时间的简称 每一次执行redis都会向redis-server发送执行的命令(send),比如set a 1, redis-server接收到请求并执行后,会返回一个数据或结果(recv) , send时间和recv中间的时间就是RTT, 也就是说假如发送了三次redis命令,就会产生三个RTT redi…

TCP RTT 采集方法

TCP RTT 采集方法值得一提: 正常状态采集的 RTT 因加入了接收端 Delayed ACK,积累 ACK 等原因而偏大。Disorder,Recovery 状态采集的 RTT 相对准确,通过 Timestamps,SACK 采集。 平时抓包,Wireshark 如何…

keil工程,程序写多后,RTT不能打印

一、Options for Target,Code Generation 一般默认是Use default compiler version 5 ,选择V6.14,重新编译烧录程序,可以继续RTT打印。 修改为: 二、这样编译后,编译速度快很多,但是&#xff…

RTT 内核启动流程

1.启动流程: RT-Thread 支持多种平台和多种编译器,而 rtthread_startup() 函数是 RT-Thread 规定的统一启动入口。一般执行顺序是:系统先从启动文件开始运行,然后进入 RT-Thread 的启动 rtthread_startup() ,最后进入…

segger_rtt使用帮助

一、KEIL中添加[RTT_Syscalls_KEIL.c][SEGGER_RTT.c][SEGGER_RTT_printf.c], 并将文件夹[segger_rtt]添加到引用目录中。 二、在[SEGGER_RTT_printf.c]中顶部添加 #define NRF_LOG_USES_RTT 1 三、main()中初始化如下: SEGGER_RTT_Init(); //初始化 SEGGER_RTT_pr…

H7-TooL高速 DAPLINK仿真器,含全功能版 RTT Viewer

摘要:前几天分享了一篇使用JLink的RTT代替串口文章,没想到这两天安富莱家更新了H7-TOOL,并且包含了全功能版 RTT Viewer功能,试了一下感觉很不错。 有关于安富莱家的H7-TooL工具在前面我已经介绍过了,电子工程师必备的…

使用Jlink RTT工具打印日志

使用Jlink RTT工具打印日志 背景 平常调试代码中使用串口打印log,往往需要接出串口引脚,比较麻烦,并且串口打印速度较慢,串口的中断可能会影响代码的执行效率。 SEGGER RTT支持使用J-link调试器输出来自目标微控制器的信息&…

RTT打印log

目录 一、移植 RTT驱动 二、环境搭建 一、移植 RTT驱动 1、找到RTT驱动文件 (1) 在 J-Flash安装目录找到 RTT驱动文件并解压得到如下文件: (2) 找到 RTT配置文件: 2、在工程中添加 RTT 驱动: (1) 将以上文件复制到工程目录 (2) 将对应的头…

webrtc rtt 计算

Definitions RTT(Round-Trip Time): 往返时延。在计算机网络中它是一个重要的性能指标,表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延。 一般认为单向时延…

《嵌入式 - 嵌入式大杂烩》详解J-Link RTT打印

开发环境: J-Link版本:V9.4 J-Link驱动版本:V760h_x86_64 Keil:V5.30 在嵌入式开发过程中,经常需要进行打印调试,通常使用串口进行打印输出,但通常串口资源有限,这时就可以通过J-Link工具里面自带的RTT实现打印,从而节约一个串口资源。 1 RTT简介 RTT全称是Real Ti…

RTT学习笔记8-RTT内核移植

RTT 内核移植接口 CortexM系列的内核移植 1.关闭中断 ;/* ; * rt_base_t rt_hw_interrupt_disable(void); ; */ rt_hw_interrupt_disable PROC ;PROC 伪指令定义函数EXPORT rt_hw_interrupt_disable ;EXPORT 输出定义的函数,类似于 C 语言 externMRS …

nordic 52832中添加RTT打印

JlinkRTT RTT是基于Jlink调试器的实时传输技术,可以代替串口打印一些调试信息,不需要额外接线。 nordic 52832官方例程中,会将RTT打印函数做进一步封装,下面就讲一下怎么开启52832中的RTT打印。 第一步 增加RTT代码 RTT源代码可以在segger官方网站下载,也可以在nordic 5…

计算机网络传输层——学习笔记

目录 传输层概述 多路复用和多路分解 协议 UDP协议 可靠数据传输协议(reliable data transfer protocol RDT) 经完全可靠信道的可靠数据传输:rdt 1.0 经具有比特差错信道的可靠数据传输:rdt 2.0 经具有比特差错的丢包信道的…

RTT简介及其简单应用

一、 裸机系统和多任务系统 裸机系统通常分为轮询系统和前后台系统。 轮询系统不难理解就是按照顺序从上往下反复来执行,伪代码如下: int main() {Init();while(1){/*事件1*/event1();/*事件2*/event2();/*事件3*/event3();} }前后台系统就是在轮询系统…

TCP中RTT时延的理解

最近服务器环境部署了tcprtt网络时延监控,发现不同服务器不同节点之间的RTT时延表象非常奇怪,无法准确的判断服务器的网络情况。因此需要弄清楚什么是RTT,以及能否作为服务器网络性能的检测指标。 1、RTT是什么? TCP中的RTT指的是…

FreeRTOS记录(四、FreeRTOS任务堆栈溢出问题和临界区)

本来计划是消息队列、信号量、任务通知、事件集、邮件的文章 但是因为自己调试的时候遇到了一个问题,还是把堆栈溢出问题放到前面来说 ..增加临界区的使用说明 2021/11/7 ..临界区的使用部分增加任务挂起与临界区说明 2021/11/26目录 任务…

1-FreeRTOS入门指南

本专栏是根据官方提供的文档进行FreeRTOS的各个功能函数的说明,以及函数的使用 本专栏不涉及动手操作,只是对原理进行说明,FreeRTOS基础知识篇更新完成会对如何在开发板上进行上手实战操作。 这里不会对比其他RTOS的优缺点,因为每…

freeRTOS调度

freeRTOS调度策略 背景 嵌入式的设备开发通常有两种模式:裸机开发和OS开发。像功能较为强大的SOC通常都会先一直linux或其他OS然后进行业务逻辑的开发;而单片机则有很多简单的应用场景直接使用裸机开发的模式,稍微复杂些的场景,会…

FreeRTOS 解析

目录 Task Task State Task Priority Idle Task Run Time Statistics Task Scheduling Single-core 单核处理器 AMP 非对称多核处理器 SMP 对称多核处理器 Context Switch Inter-task Communication and Synchronization Queue 队列 Binary Semaphore 二值信号量 …

FreeRTOS队列

在实际的应用中,常常会遇到一个任务或者中断服务需要和另外一个任务进行“沟通交流”,这个“沟通交流”的过程其实就是消息传递的过程。在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式,但是如果在使用操作系统的应用中…