使用RTT代替UART,把你的JLink变成串口调试助手~

article/2025/8/26 23:30:06

摘要:不知道大家在单片机开发中是如何打印调试信息的,大多数应该是用串口调试打印吧,在大多数的情况下,一般在制板和写代码时都会预留串口1做为调试打印用。

但是在实际开发如果没有预留串口怎么办?其实我们的下载器是可以用来作为调试打印来用的,只是很多小伙伴不知道这个功能而已,今天就来说一下如何用调试器JLink来打印信息。

1、JLink仿真调试器

下载器五花八门,但是我只用JLink,小巧方便携带。对于单片机开发者一般所用的下载器基本就是JLink和ST-Link。这两者功能差不多,JLink是SEEGER公司的,ST-Link是ST公司的,而且只支持ST系列的芯片。只用JLink下载器调试,原因就是这玩意体积小,只有四根线,用起来太方便了,YYDS!

J-Link OB ARM 仿真调试器

2、安装JLink驱动

下载链接:https://www.segger.com/downloads/jlink/。买回来JLink驱动后,一般卖家都会提供JLink的驱动程序,驱动安装完成后就可以下载调试程序了。

https://www.segger.com/downloads/jlink/

当然我们现在要使用JLink的RTT功能,就需要在官网下载完整的Jlink包,最新版本的是V7.52版本的,当然别的版本也可以。下载完成后直接安装可以了。安装完成后你会在你的安装目录下看到如下内容:

JLink安装目录

3、移植RTT

安装完成就好办了,RTT源码包就在我们刚刚安装的JLINK驱动的目录里面。我的目录是:D:\Software\SEGGER\JLink_V644b\Samples\RTT

解压后具体的目录是:D:\Software\SEGGER\JLink_V644b\Samples\RTT\SEGGER_RTT_V644b\RTT

然后将这个RTT文件夹复制到我们的编写程序的工程文件夹中

然后在项目中新建一个RTT分组,并将RTT文件夹中的两个.c文件添加进来。

当然还要记得添加RTT的头文件路径

到这里基本就移植成功了,是不是很简单,就是把RTT的源码添加到工程中即可,完全不需要修改别的什么操作。

4、RTT打印输出

接下来就可以打印输出了。

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "SEGGER_RTT.h"int main(void)
{ HAL_Init();                    	//初始化HAL库    Stm32_Clock_Init(336,8,2,7);  	//设置时钟,168Mhzdelay_init(168);               	//初始化延时函数LED_Init();						//初始化LED	while(1){SEGGER_RTT_printf(0,"zhiguoxin666\r\n");}
}

编译没有错误之后连接好下载器

连接好硬件

配置为SW模式

之后打开JLink安装目录下的JLinkRTTViewer.exe

按照如下配置

将代码下载到单片机中就可以看到已经完美的打印了。

5、RTT的使用技巧

1、RTT缓冲大小

有时候我们发现我们的信息不能完全的打印出来,可能是因为缓冲不够,默认缓冲区大小事1K字节,如果不够可以改大一点。

默认1024字节

2、多虚拟端口使用

RTT支持向不同的虚拟端口中打印信息,使用方法如下。

首先在RTT Viewer软件中分别打开三个虚拟端口:

编写代码

while(1)
{SEGGER_RTT_SetTerminal(0);SEGGER_RTT_printf(0,"zhiguoxin666,SEGGER RTT Terminal 0!\r\n");SEGGER_RTT_SetTerminal(1);SEGGER_RTT_printf(0,"zhiguoxin666,SEGGER RTT Terminal 1!\r\n");SEGGER_RTT_SetTerminal(2);SEGGER_RTT_printf(0,"zhiguoxin666,SEGGER RTT Terminal 2!\r\n");delay_ms(1000);
}

编译、链接、下载,观察现象:

窗口0

窗口1

窗口2

3、修改打印字符颜色

RTT支持不同颜色的字符显示。

时用时在字符串前面加上对应颜色的宏定义就可以了。

while(1)
{SEGGER_RTT_SetTerminal(0);SEGGER_RTT_printf(0,RTT_CTRL_TEXT_RED"zhiguoxin666,SEGGER RTT Terminal 0!\r\n");SEGGER_RTT_SetTerminal(1);SEGGER_RTT_printf(0,RTT_CTRL_TEXT_GREEN"zhiguoxin666,SEGGER RTT Terminal 1!\r\n");SEGGER_RTT_SetTerminal(2);SEGGER_RTT_printf(0,RTT_CTRL_TEXT_BLUE"zhiguoxin666,SEGGER RTT Terminal 2!\r\n");delay_ms(1000);
}

编译、链接、下载,观察现象:

红色

绿色

蓝色

4、使用printf重定向

项目中使用printf的地方非常多,如果可以直接修改printf重定向到RTT组件,则会非常方便。使用的方法是直接使用RTT提供的API实现fputc。

原子的例程

重定义fputc函数

//重定义fputc函数 
int fputc(int ch, FILE *f)
{ 	SEGGER_RTT_PutChar(0, ch);return ch;
}

替换之前的代码:

while(1)
{printf("zhiguoxin666 ,printf SEGGER RTT Terminal!\r\n");delay_ms(1000);
}

编译、链接、下载

结语:RTT和USRAT各有优点,要根据不同的情况选择,如果遇到一个显示项目没有预留串口用来调试打印信息,可以用别的方法。当然打印调试还有很多方法这只是其中的一种方法,如果你还有更好的方法,欢迎评论区留言哟~


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

相关文章

TCP RTT与TCP RTO关系详解

本文目录 1,TCP的RTT和TCP的RTO的定义1.1,什么是TCP的RTT1.2,什么是TCP的RTO 2,TCP的当前RTT和RTO的计算2.1,开始讲RTT计算算法前,我们先理解一下TCP里对RTT进行采样的流程2.2,最初始的TCP RTT和…

通过pylink给jlink-RTT添加时间戳

参考链接 目前还有一些bug,比如时间戳有时候会加在一行log的中间,有时候又会少一些时间戳,但是log目前没发现出现问题 在使用pylink时,需要用到Jlink的dll库,需要将D:\SEGGER\JLink_V766d文件夹下的JLink_x64.dll和JLi…

J-Link RTT 支持浮点数

RTT的使用 略 添加浮点数功能 注: 如下代码暂时不支持数据左补零,正浮点数前面显示等功能;不指定位宽时按实际位宽显示,不指定小数位数时按2位小数显示。 在SEGGER_RTT_printf.c文件的SEGGER_RTT_vprintf()函数中,添…

RTT Studio和Cubemx联合开发

1. RTT studio创建工程 创建工程 ## 创建完成以后的目录结构 2. 配置CubuMx 双击cubumx的图标打开CubeMx 配置时钟 生成代码 构建后的代码结构 编译代码满屏错误:不要慌 3. 新增脚本 新建scons脚本文件 SConscript 脚本内容如下,每次修改外…

STM32 RTT

1、安装包 如果安装过jlink,可以用evething来搜索“SEGGER_RTT”,选择“压缩文件”。 压缩文件中的RTT文件夹加入到项目当中 2、项目修改 3、使用 3.1 普通使用 SEGGER_RTT_printf(0, "Terminal 0 print:%d\r\n", i); 3.2 多端口…

[STM32]jlink RTT使用详解

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

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();} }前后台系统就是在轮询系统…