前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用J-Link打印日志 | SEGGER Real-Time Transfer(RTT)工具的移植使用

使用J-Link打印日志 | SEGGER Real-Time Transfer(RTT)工具的移植使用

作者头像
Mculover666
发布2021-02-19 11:42:42
3.7K0
发布2021-02-19 11:42:42
举报
文章被收录于专栏:TencentOS-tiny

一、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组件的使用非常简单,首先包含头文件:

代码语言:javascript
复制
#include "SEGGER_RTT.h"

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

代码语言:javascript
复制
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软件中分别打开三个虚拟端口:

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

代码语言:javascript
复制
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官方支持彩色字符的打印,定义如下:

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

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
int fputc(int ch, FILE *f)
{
    SEGGER_RTT_PutChar(0, ch);
 
    return ch;
}

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

代码语言:javascript
复制
while (1) {
    printf("Hello, Printf Test!\r\n");
    Delay_ms(1000);
}

编译、下载,结果如图:

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

代码语言:javascript
复制
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的实现方法,如果您有更好的方法,欢迎留言或投稿~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Mculover666 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Real Time Transfer
  • 二、移植RTT工具
    • 1. 复制文件
      • 2. MDK中添加文件
        • 3. MDK中添加头文件路径
        • 三、RTT工具移植测试
          • 1. RTT Viewer
            • 2. 编写测试代码
            • 四、RTT的使用方法
              • 1. RTT实现机制
                • 2. 虚拟端口的使用
                  • 3. 彩色字符的使用
                    • 4. 接管printf重定向
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档