[麦麦茶水间] 【每周分享】想打印信息,板子却没串口,JlinkRTT帮你搞定

[复制链接]
5|0
dffzh 发表于 2026-9-16 13:29 | 显示全部楼层 |阅读模式
, link, 串口, , RT,
#申请原创# #技术资源#


当我们遇到程序bug,特别是偶现bug的时候,可能会想,如果有串口可以打印信息,定位到原因的概率就大了;奈何板子资源或者PCB尺寸等影响,没有引出MCU调试串口接口,这个时候怎么办呀?
不用着急,只要你手头有Jlink调试器,就可以通过JlinkRTT来替你搞定打印信息问题。
简单理解的话,JlinkRTT就是一款可以直接通过Jlink调试器来将打印信息显示到指定终端助手的方法工具,也就是说只要你在程序里面增加RTT相关代码,就可以将打印信息通过Jlink的信号线显示到上位机软件里面,这个上位机软件就是Jlink安装目录下的JLinkRTTViewer.exe,默认路径就是:
C:\ProgramFiles\SEGGER\JLink
如下图所示:
那怎么样才能正常打印信息呢? 请继续往下看!
第一步当然是将RTT相关代码添加到你的程序工程里面。

还是之前那个路径,找到Samples文件夹:
然后找到里面的RTT文件夹下面的压缩包,名称是SEGGER_RTT_V792f.zip,这个压缩包名称可能会因为你安装的JFlash版本不一样而有区别,但这不影响:
解压之后如下所示,几个文件夹的作用描述如下:
我们需要把RTT文件夹下面的三个文件:
SEGGER_RTT.c
SEGGER_RTT_printf.c

SEGGER_RTT.h
以及Config文件夹下面的一个文件:
SEGGER_RTT_Conf.h
放到我们的代码工程里面。

我们可以在代码工程里面单独建个RTT文件夹,里面再新建src源文件夹和inc头文件夹,分别放RTT源代码的源文件和头文件:
添加后,编译工程,确保通过。
然后你就可以在需要的地方加上打印信息来赶紧尝试定位你的bug了,哈哈~
记得在相应源文件的位置包含RTT头文件:
#include"SEGGER_RTT.h"

怎么加打印呢?如果不清楚,可以去打印demo文件夹Examples里面看一下,一般打印的话,去看Main_RTT_PrintfTest.c源文件就够了:
这里要注意,SEGGER_RTT_ConfigUpBuffer接口的作用是在程序运行时,动态配置一个“上行缓冲区”,也就是从目标板传输到主机的通道,当你需要在默认通道之外额外开辟专用的输出通道(例如分别输出日志、数据或错误信息等)时,就会用到它,普通打印可以不用。
SEGGER_RTT_WriteString接口就是直接输出字符串信息到终端;
SEGGER_RTT_printf接口就是打印我们需要监控的数据变量等,要注意它的格式,和我们平时用的C库函数printf是不一样的。

然后我就在main初始化代码里加几个打印看看:
  1. <font face="Tahoma">//SEGGER_RTT_ConfigUpBuffer(0, NULL, NULL, 0, SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL);
  2. SEGGER_RTT_WriteString(0, "SEGGER Real-Time-Terminal Sample\r\n\r\n");
  3. SEGGER_RTT_WriteString(0, "###### Testing SEGGER_printf() ######\r\n");
  4. SEGGER_RTT_printf(0, "my app version: V%d.%d.%d\r\n",1,0,0);</font>
然后编译通过,代码基本OK~
接着我们就可以打开JLinkRTTViewer.exe了。

需要先进行配置,包括连接Jlink调试器的总线方式,目标MCU型号和接口类型及通信速率等,我的配置如下所示:
点击OK,如果正常连接,则下面日志栏会提示状态,如果连接异常,请根据提示进行排查:
然后我们下载一次MCU程序,下载后程序运行,不出意外,就能看到我们需要的打印信息了:
这个软件最大可以支持16个终端显示:
如果你觉得显示的信息的字体太小,你也可以调整字体:
也可以清除屏幕信息:
当然,我们最喜欢的功能可能还是这个软件的日志记录功能吧:
包括开始/停止终端日志记录、开始/停止数据记录及通道信息等。
那这里的终端日志(TerminalLogging)和数据日志(Data Logging)有什么区别呢?
其核心区别在于它们处理的是不同的RTT通道,以及对应的数据格式与用途完全不同:
终端日志处理的是RTTChannel 0的数据,也就是我们平时用来查看代码里打印的调试信的虚拟终端;
数据日志处理的是RTTChannel 1的数据,也就是专门用于传输二进制数据流的独立通道。
所以这里要注意:
很多初次使用的人容易混淆这两个功能。,如果你在代码里向Terminal 1打印了文本,但点击了Start Data Logging...,你会发现日志文件里是空的或乱码,因为Terminal 1的文本输出仍然属于Channel 0的范围,若要记录它,应该使用终端日志功能。

其实我们再来看SEGGER_RTT_ConfigUpBuffer接口,SEGGER_RTT_WriteString接口和SEGGER_RTT_printf接口的第一个参数,一般打印demo里面配置的都是0,其实这里的0就是终端0的意思:
我如果把第一条打印信息的第一个参数改成1,然后测试一下,这个打印在终端0里面就没有了:
我们可以来试一试日志记录功能,现开启终端日志记录,自定义日志文件名称:
在日志文件tlog.txt里面就可以看到日志记录信息了:
如果我们选择的是数据日志记录,这个时候,在dlog.txt文件里面就看不到日志信息:
RTT源代码和这个软件的其他功能还是不少的,这里就不详述了,有需要的坛友们可以深入研究一下,说不定可以让你的代码开发调试和问题定位达到事半功倍的效果呢。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

561

主题

4014

帖子

27

粉丝
快速回复 在线客服 返回列表 返回顶部
0