使用J-Link打印日志——SEGGER Real-Time Transfer(RTT)工具的移植使用
发布日期:2021-07-01 02:35:20 浏览次数:2 分类:技术文章

本文共 2565 字,大约阅读时间需要 8 分钟。

一、Real Time Transfer

SEGGER RTT支持使用J-link调试器输出来自目标微控制器的信息,也可以接收输入,并且在高速度交互的同时不会影响目标处理器的实时性,可以省掉平常打印日志用的串口。

RTT工具支持 ARM Cortex-M0/M0+/M1/M3/M4/M7/M23/M33 内核和瑞萨 RX100/200/600 内核。

RTT工具的源码实现提供了完整的功能,可以自由使用。RTT的源码是作为J-Link软件包的一部分,在Jlink安装目录中的 Sample/RTT中,如图是我电脑上的路径:

如果电脑上未安装J-Link驱动,也可以在下载。

二、移植RTT工具

移植之前需要准备STM32开发板+Jlink下载器。本文使用的是STM32F407探索者开发板+Jlink下载器。

1. 复制文件

在原有裸机工程中新建一个文件夹SEGGER-RTT用于存放RTT源码,将RTT源码中RTT目录之下的文件都复制过来:

2. MDK中添加文件

新建SEGGER/RTT分组,将刚刚复制的rtt源码.c文件添加进去,再添加一个.h配置文件方便随时修改:

3. MDK中添加头文件路径

将RTT源码路径添加到MDK的头文件路径中:

至此,移植完成。

三、RTT工具移植测试

1. RTT Viewer

RTT Viewer用来与RTT组件进行交互,在J-link安装目录中已有:

双击运行,配置J-link连接方式、目标芯片型号、目标芯片的接口以及下载速度:
配置完成点击ok之后,显示RTT Viewer Connected表示已成功连接:

2. 编写测试代码

RTT组件的使用非常简单,首先包含头文件:

#include "SEGGER_RTT.h"

接着初始化RTT组件、并每隔1s打印一行内容:

int main(){
/* Init Systick */ Systick_Init(); /* Init RTT Tools */ SEGGER_RTT_Init(); /* Main Loop */ while (1) {
SEGGER_RTT_printf(0, "Hello, SEGGER RTT!\r\n"); Delay_ms(1000); }}

编译、下载,测试结果如图:

四、RTT的使用方法

1. RTT实现机制

RTT的实现机制是通过在内存中创建上行缓冲区(发送)和下行缓冲区(接收),使用SEGGER RTT 控制块来管理数据的写入和读取,每个控制块都有自己的ID。

在配置文件中可以修改默认缓冲区的大小:
SEGGER官方在每1ms发送一次的状态下,给出的缓冲区大小推荐值为:

2. 虚拟端口的使用

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

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

然后修改代码,在代码中分别向三个虚拟端口中打印信息:

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

编译、下载、运行结果为:

3. 彩色字符的使用

RTT官方支持彩色字符的打印,定义如下:

使用时只需要将宏定义加入即可,如下:

while (1) {
SEGGER_RTT_SetTerminal(0); SEGGER_RTT_printf(0, RTT_CTRL_TEXT_RED"Hello, SEGGER RTT Terminal 0!\r\n"); SEGGER_RTT_SetTerminal(1); SEGGER_RTT_printf(0, RTT_CTRL_TEXT_GREEN"Hello, SEGGER RTT Terminal 1!\r\n"); SEGGER_RTT_SetTerminal(2); SEGGER_RTT_printf(0, RTT_CTRL_TEXT_YELLOW"Hello, SEGGER RTT Terminal 2!\r\n"); Delay_ms(1000); }

编译、下载,结果如图:

4. 接管printf重定向

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

我使用的方法是直接使用RTT提供的API实现fputc,需要MDK开启微库支持:

在main.c最后实现fputc函数:

int fputc(int ch, FILE *f){
SEGGER_RTT_PutChar(0, ch); return ch;}

修改代码,测试printf是否可以正常使用:

while (1) {
printf("Hello, Printf Test!\r\n"); Delay_ms(1000);}

编译、下载,结果如图:

这种方法实现下,测试printf打印浮点数也是可以的:

while (1) {
printf("Hello, Printf Test!\r\n"); printf("Float test:%.2f\r\n", 1.23); Delay_ms(1000); }

SEGGER RTT 中提供的 SEGGER_RTT_printf 为了减小体积,不支持浮点数的打印。

以上就是我对于printf的实现方法,如果您有更好的方法,欢迎投稿~

转载地址:https://mculover666.blog.csdn.net/article/details/113040875 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:STM32CubeMX | 38-使用硬件SPI驱动以太网模块(W5500)
下一篇:STM32标准库工程中移植TencentOS-tiny

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月20日 01时41分38秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章