目录
1. 概述
以往总是通过串口打印log,但经常因资源限制,无法打印。最近接触到J-Link RTT Viewer,本文目的是记录下使用方法(只需要把J-Link安装目录下的源文件,添加到自己的工程就可以了)。
参考连接:【嵌入式小技巧】STM32 实现 SEGGER RTT 打印(超详细),根据博客自己操作了下。
2. 找到驱动文件
按照如下,进入J-Link安装目录,可以找到源文件的压缩包:
解压后文件如下:
进入RTT文件夹,这里面就是需要添加到Keil工程的文件:
3. 添加到工程
在keil工程中添加驱动文件的两个.c文件:
添加初始化程序
SEGGER_RTT_Init();
SEGGER_RTT_printf(0, "Hello world !");
4. 查看打印结果
启动J-Link RTT Viewer:
设置下连接方式,选择对应的MCU。这里设置了芯片的资源范围,测试了下,使用auto就可以:
设置好后,就进入了终端界面。在下方会显示连接状态,这里因为MCU已经运行了程序,所以立刻打印了Hello world!
:
5. 封装print_log函数
主要是为了使用更加方便,不用再加终端号:
void print_log(const char * sFormat, ...)
{
va_list ParamList;
va_start(ParamList, sFormat);
SEGGER_RTT_vprintf(BUFFER_INDEX, sFormat, &ParamList);
va_end(ParamList);
}
6. 遇到的问题
6.1 打印超长数据
当要打印的内容很长,如一个将近2K的CA证书,就会出现打印不全的问题。需要修改默认长度,全局搜索BUFFER_SIZE_UP
:
6.2 不支持打印中文
使用模组ping谷歌,响应信息,发现打印中文会乱码:
6.3 通用打印格式 - 预定义宏
#define LED_DEBUG_ENABLE
#if defined(LED_DEBUG_ENABLE)
#define led_debug(...) rtt_print_log(__VA_ARGS__)
#else
#define led_debug(...)
#endif
led_debug("%s: %s: %d\n", __FILE__, __func__, __LINE__);
实际打印效果:
…/User/nb_device_led.c: rgb_led_on: 114
参考链接:KEIL编译器预处理器和预定义宏(include,ifdef,def等)。
6.4 时间戳和打印颜色
Jlink RTT Viewer增加时间戳+打印不同颜色优先级LOG
增加时间戳,需要MCU内具有相应接口。
不能在All Terminals中显示颜色,只能在对应编号的Terminals显示颜色
6.5 SEGGER_RTT_vprintf 和 SEGGER_RTT_printf
void LogHalRttPrint(const char *format, ...)
{
va_list ParamList;
va_start(ParamList, format);
SEGGER_RTT_vprintf(0, format, &ParamList);
va_end(ParamList);
// SEGGER_RTT_printf(0, format);
}
打印存在区别,使用SEGGER_RTT_printf,会打印异常
7 开源工具rtt_t2
添加链接描述中,博主开发了RTT-T,支持时间戳等功能,这样就不需要在MCU程序中去支持。在gitee中看了下,作者使用RTT_T2代替了RTT工具。
每次连接J-Link都会复位MCU
下载
从gitee上直接下载(点击进入),
下载msi
直接安装
测试
解决问题
添加链接描述
在本地拷贝