搜索
返回列表 发新帖本帖赏金 20.00元(功能说明)我要提问

[STM32] jlink RTT使用详解

[复制链接]
2243|9
 楼主 | 2021-3-23 22:35 | 显示全部楼层 |阅读模式
本帖最后由 xyz549040622 于 2021-3-23 22:37 编辑

#申请原创#   @21小跑堂

1.什么是Jlink RTT。
全称为SEGGER’s Real Time Transfer(RTT),一种基于SEGGER公司的基于JLink调试器的交互式用户I/O的技术。故名思义,就是一种基于jlink的和用户进行交互的技术,可以直观的显示调试芯片的信息,以及可以让用户和调试芯片进行互动的技术。

2.为什么要使用Jlink RTT。
1>不需要额外的引脚和硬件配置,支持SWD方式,两根线就可以使用。
2>速度快,与debug和run并行使用,平均一行文本可以在一微秒或更少的时间内输出。官方给出了一个速度对比图。
855756059fba883ef6.png
3>RTT的通信可以通过不同的应用程序完成,可以使用SDK集成到自定义的应用程序中,可本地连接,可远程连接。
基于以上3个优点,如果你还在调试ARM芯片的时候傻傻的使用USART进行用户交互,那实在是效率太低了。

3.Jlink使用RTT的准备
1>jlink软件包
https://www.segger.com/downloads/jlink/#J-LinkSoftwareAndDocumentationPack
12896059fbb14ff11.png
2>Jlink仿真器一个,官网没找到到底哪一个版本的Jlink版本开始支持RTT的,看到网上说V9是支持的,我这里用的是Jlink V11的仿真器。
HW:V11.00
dll:V6.98c

4.移植RTT的SDK代码到MDK的工作
1>在上一步Jlink软件的安装路径下找到RTT的SDK包,我这里在D盘安装的。
D:\Program Files (x86)\SEGGER\JLink\Samples\RTT\RTT

7526059fbdea6e0b.png
2>MDK工程下新建一个RTT的文件夹,把下面四个文件复制到RTT目录下,将这些文件添加到MDK的工程中。
986616059fbea32770.png

将代码添加到工程中
350616059fbf7569b6.png


头文件包含
433596059fc02b50b5.png


5.支持RTT的三个软件
Jlink提供了三个软件RTT Viewer、RTT Client、RTT Logger,这三个软件可以在SEGGER目录下找到:
721456059fc0f1fa65.png

6.使用RTT前的一些需要了解的几个概念。
使用RTT需要了解两个概念,即所谓的channel和terminal。这里我也只是根据我现在的认知做了一个解释,不一定恰当。
由于没有详解RTT的内部运行机制,我在这里把channel和terminals理解为软件的概念。
RTT的SDK默认支持2个channel,分别是0和1。
每个channel支持16个terminal,分别是0-F。
在这两个概念的基础上,我把RTT Viewer、RTT Client、RTT Logger这三个软件做了一个对照表。了解下面这个表格,才能更好的使用和配置RTT。
192066059fc21abc0a.png


7.MDK的代码编写

1>头文件引用#include "SEGGER_RTT.h"
2>RTT的初始化函数 SEGGER_RTT_Init();
上面两项是通用代码,下面是使用通道0,用RTT Viewer、RTT Client输出一段调试信息。

  1. /*********************************************************************************************************
  2. *                                                主程序
  3. *********************************************************************************************************/
  4. int main (void)                                                                                 
  5. {


  6.   FLASH_ReadOutProtection(DISABLE);                                   //读保护


  7.     SystemInit();                                                                            //CPU时钟初始化
  8.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);        //使用优先级组4(4:4结构)

  9.     SEGGER_RTT_Init();   

  10.     #ifdef DEBUG_MODE                                                        //调试模式
  11.     SEGGER_RTT_printf(0,"Demo Init!\r\n");
  12.     #endif   


  13. while(1)
  14. {
  15.         SEGGER_RTT_SetTerminal(0);     
  16.         SEGGER_RTT_printf(0,"Demo Run Terminal 0!\r\n");   
  17.         SEGGER_RTT_SetTerminal(1);     
  18.         SEGGER_RTT_printf(0,"Demo Run Terminal 1!\r\n");         
  19. }



  20.   return (0);
  21. }
复制代码


上面的代码就是用通道0的terminal0和terminal1输出调试信息。RTT的SDK中默认已经配置好channel 0的参数了,我们使用channel 0的时候,直接使用打印函数即可。
上述代码编辑后编译无错误,然后下载。

打开RTT Viewer后显示如下,按照实际情况配好参数后点击OK。
244886059fc30a298d.png


可以看到控制窗口已经输出了调试信息。>前面的数字即为当前使用的terminal ID。
141416059fc3d6fd36.png


打开RTT Client后显示如下:
193216059fc5258a8a.png

这时候会发现没有数据输出。不要着急,重点来了。

1)先关闭RTT Client,点击MDK的Debug按钮进去Debug模式。
104866059fc5e8c6a7.png


2)再次打开RTT Client,显示如下:

110196059fc6a5d738.png

3)点击MDK的Run全速运行。控制台开始输出调试信息。

530006059fc7415f32.png

下面继续使用通道1,使用RTT Logger输出调试信息在log文件中。因为RTT Logger使用的是通道1,RTT的SDK中是没有给通道1分配缓存区和名称的,必须进行手动设置。
还有要注意的是,通道0和通道1是并行的,两者输出调试信息是不冲突的。
使用通道1的代码如下所示:

  1. uint8_t _UpBufferCH1[64] = {0};
  2. uint8_t _DownBufferCH1[64] = {0};


  3. /*********************************************************************************************************
  4. *                                                主程序
  5. *********************************************************************************************************/
  6. int main (void)                                                                                 
  7. {


  8.   FLASH_ReadOutProtection(DISABLE);                                   //读保护


  9.     SystemInit();                                                                            //CPU时钟初始化
  10.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);        //使用优先级组4(4:4结构)

  11.     SEGGER_RTT_Init();   


  12.     /* 配置通道1,上行配置(STM32->RTT Viewer软件) */
  13.     SEGGER_RTT_ConfigUpBuffer(1, "RTTUP", _UpBufferCH1, 64, SEGGER_RTT_MODE_NO_BLOCK_SKIP);

  14.     /* 配置通道1,下行配置(RTT Viewer软件->STM32) */   
  15.     SEGGER_RTT_ConfigDownBuffer(1, "RTTDOWN", _DownBufferCH1, 64, SEGGER_RTT_MODE_NO_BLOCK_SKIP);

  16.     #ifdef DEBUG_MODE                                                        //调试模式
  17.     SEGGER_RTT_printf(0,"Demo Init!\r\n");
  18.     #endif   


  19. while(1)
  20. {
  21.         SEGGER_RTT_SetTerminal(0);     
  22.         SEGGER_RTT_printf(1,"Demo Run Terminal 0!\r\n");   
  23.         SEGGER_RTT_SetTerminal(1);     
  24.         SEGGER_RTT_printf(1,"Demo Run Terminal 1!\r\n");         
  25. }



  26.   return (0);
  27. }
复制代码


上述代码编辑后编译无错误,然后下载。
打开RTT Logger后如下所示:

520296059fc824601d.png

这里要注意的是,在RTT Logger中,>后面可以自由输入>前面表示的参数,按回车键确认。无输入的情况下,按回车键跳过。
一直回车键,如果程序配置通道1正确的话,会出现下面图片的画面,不停的给log文件中写数据。
注意:如果程序中没有配置通道1,RTT Logger检测不到通道1的情况下就会自动关闭。
正确的RTT Logger显示画面如下:
927856059fc89f17b6.png

打开上述路径中的.log文件,里面的内容如下所示,这说明成功的生成了log文件。

169576059fc93438e6.png

只要弄懂上面的内容,你就可以很爽的使用RTT来输出调试信息了,我们一般只使用RTT Viewer这个软件就足够了。他还可以设置显示的颜色,格式化输出等,具体的函数说明可以查看
Jlink安装目录下的使用手册16.4.1章节即可。
手册路径如下:D:\Program Files (x86)\SEGGER\JLink\Doc\Manuals。
724186059fc9b42517.png




使用特权

评论回复

打赏榜单

21小跑堂 打赏了 20.00 元 2021-03-24
理由:恭喜通过原创文章审核!请多多加油哦!

相关帖子

| 2021-3-26 21:27 | 显示全部楼层
使用RTT Logger芯片复位了,需要操作重新连接吗?

使用特权

评论回复
 楼主 | 2021-3-27 21:28 | 显示全部楼层
x_hzx 发表于 2021-3-26 21:27
使用RTT Logger芯片复位了,需要操作重新连接吗?

应该是需要重新连接的。这个我测试一下给你回复。

使用特权

评论回复

评论

xyz549040622 2021-3-31 18:24 回复TA
只要RTT Logger界面关了,就停止记录了,复位肯定是需要重新连接的。 
x_hzx 2021-3-30 18:08 回复TA
谢谢老板辛苦解答 
| 2021-3-31 10:57 | 显示全部楼层
好文章,问下楼主,用JLink-OB 使用使用吗?
上次折腾了一下,没成功,放弃了,不知道是不是这个原因

使用特权

评论回复

评论

xyz549040622 2021-3-31 18:17 回复TA
jlink OB没有试过。 
| 2021-4-7 13:58 | 显示全部楼层
Jscope了解一下,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈

使用特权

评论回复

评论

xyz549040622 2021-4-7 18:14 回复TA
已经使用了,这个功能也是相当的不错的。 
| 2021-4-9 09:31 | 显示全部楼层
好深奥

使用特权

评论回复
扫描二维码,随时随地手机跟帖
返回列表 发新帖 本帖赏金 20.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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