0x01 前言
最近收到系统提示,说是创作两周年纪念日了。看了看当初最早写下的STM32点灯文章,心中百感交集,感叹时光不饶人。那时应该是刚开始学STM32的时候,对于STM32需要随时携带线材和下载器来烧录这一点感到尤其没劲,不过现在反倒是非常顺眼也觉得烧录器的存在很合理了。
最近调试一块板子的时候略烦,调试的时候需要一直去观察ADC采样到的某个值的变化情况,如果DEBUG的话会破坏采样数据的连续性,且会导致Modbus RTU主站丢包引发错误引发断连,所以需要个不会影响到主功能的辅助代码来给我解决这个问题。
平时可能会用到串口打印来辅助调试,但是一般硬件不会预留串口,并且使用串口也还需要飞线、额外的一批配置代码,日后的复用性也不是太高。
几经查找,找到了个SEGGER RTT VIEWER调试组件,能够利用SWD接口来帮助调试。一般的板子都会预留出SWD接口,也不需要额外飞线,只需要使用的时候将这些文件添加进工程就行,并且根据官方的说明,使用此调试组件并不会占用太多资源,甚至在产品发布的时候保留调试代码也不会对实际使用造成任何影响,不过我还是建议将调试代码删除吧。
所谓RTT,即是实时传输技术,我们所用到的组件是由SEGGER公司开发,这家公司一款比较广为人知的产品就是J-link,支持所有ARM芯片的调试和仿真。RTT允许目标设备和主机之间进行双向通信
比传统的 UART 调试更快、更可靠,并且几乎不会影响到程序的运行,占用的资源非常少。
0x02 RTT Viewer移植
这里没有去自己移植了,直接用的是别人移植好的。去到硬汉嵌入式论坛下载这几个开发板的示例,即便你使用的芯片型号不在其中也没关系的,我本人已经尝试过了,链接整理在下方
在下载好后将SEGGER文件夹直接整个复制到你的工程之中,并且在IAR或者Keil中添加SEGGER/RTT路径下的所有文件,并且在工程中为编译器指明路径。
0x03 开始上手使用
找了个之前的工程,将RTT的代码插了进去演示一下。我自己的使用方式是这样:使用条件编译语句来进行区分。在Keil或者IAR工程中定义 全局宏 并为其定义成0或者1,就可以很方便的决定DEBUG代码的去留。
下面是 包含头文件 的代码:
#if DEBUF_MODE
#include "SEGGER_RTT.h"
#endif
下面是 使用RTT打印 的代码:
#if DEBUF_MODE
SEGGER_RTT_printf(0, "HelloWorld!\r\n");
#endif
在代码中添加了RTT的代码之后,那么可以开始使用了,我们会用到下面这个软件。安装Jlink驱动软件的时候会一并将这些一并安装
打开后是这个样子,选择你的芯片以及Jlink安装方式
连接之后会像上一张下方的字体一样,数据被源源不断的打印出来。
我稍微美化了一下,就如下图所示了。
常用的函数还有一个SEGGER_RTT_Write函数,和printf函数差不多,在发送整包数据的时候这个看起来还是很方便:
SEGGER_RTT_Write(1, &data_packet, sizeof(data_packet));
后续还有其他的功能暂时没有使用上,后续真正体验过了再来补充!