一、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"
1
接着初始化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);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
编译、下载,测试结果如图:
四、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);
}
1
2
3
4
5
6
7
8
9
编译、下载、运行结果为:
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);
}
1
2
3
4
5
6
7
8
9
编译、下载,结果如图:
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;
}
1
2
3
4
5
6
修改代码,测试printf是否可以正常使用:
while (1) {
printf("Hello, Printf Test!\r\n");
Delay_ms(1000);
}
1
2
3
4
编译、下载,结果如图:
这种方法实现下,测试printf打印浮点数也是可以的:
while (1) {
printf("Hello, Printf Test!\r\n");
printf("Float test:%.2f\r\n", 1.23);
Delay_ms(1000);
}
1
2
3
4
5
SEGGER RTT 中提供的 SEGGER_RTT_printf 为了减小体积,不支持浮点数的打印。