原创声明
本文为 HinGwenWoong 原创,如果这篇文章对您有帮助,欢迎转载,转载请阅读文末的【授权须知】,感谢您对 HinGwenWoong 文章的认可!
前言
嵌入式的开发离不开log
的打印,我们常常使用的是重定向printf
到串口打印输出,但是会对系统的实时性产生一定的影响,RTT技术可以在一定程度解决这个问题。
我是 HinGwenWoong ,一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,码字不易,如果帮到您,请帮我在屏幕下方点赞 👍 ,您的点赞可以让技术传播得更远更广,谢谢!
一、RTT 是什么?
使用RTT(Real Time Transfer)
,可以从目标微控制器输出信息,以及以很高的速度将输入发送到应用程序,而不会影响目标的实时行为。 SEGGER RTT
可与任何J-Link
模型和支持后台内存访问的任何受支持的目标处理器一起使用,这些处理器是Cortex-M
和RX
目标。
RTT
在双向上都支持多个通道,直至主机和目标,都可以用于不同目的,并为用户提供最大的自由度。
RTT
默认实现是每个方向使用一个通道,该通道用于可打印的终端输入和输出。 使用J-Link RTT Viewer
,该通道可用于多个“虚拟”终端,从而仅使用一个目标缓冲区即可打印到多个窗口(例如,一个用于标准输出,一个用于错误输出,一个用于调试输出)。 例如,可以使用一个附加的(主机)通道来发送配置文件或事件跟踪数据。
更多资料,详见其官网 SEGGER’s Real Time Transfer (RTT)
二、使用步骤
1.引入驱动库
- 首先在官网选择合适的版本下载并安装
Jlink
,官网下载地址 - 安装之后进入目录可以看到
Jlink
全家桶
- 在【开始】菜单栏可以看到快捷方式 【Segger RTT Viewer Vxxx.exe】,我这里安装了 V6.44c 的版本
- 去到刚刚安装文件的目录,可以看到对应
Jlink
版本的RTT
驱动的压缩包
- 解压,可以见到驱动文件
- 将上面红色框的文件,复制到
SMT32
工程文件中,加入到KEIL
工程中
并将其头文件
也包含进工程
2.实现 log 打印输出
2.0 编译选项注意
一定要 取消 这个勾选!!!
2.1 直接使用
在 main 函数调用初始化,然后直接可以使用
#include "SEGGER_RTT.h"
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
SEGGER_RTT_Init();
SEGGER_RTT_printf(0, "Hello world !"); // 原接口
}
2.2 封装使用(推荐)
也可以封装接口:
/*-----------------------------------------------------------
* Includes files
*----------------------------------------------------------*/
/* segger rtt includes. */
#include "SEGGER_RTT.h"
#include "SEGGER_RTT_Conf.h"
#define BUFFER_INDEX 0
/*!
* @brief 封装 RTT 打印接口
* 执行条件:无
*
* @retval: 无
*/
void print_log(const char * sFormat, ...)
{
va_list ParamList;
va_start(ParamList, sFormat);
SEGGER_RTT_vprintf(BUFFER_INDEX, sFormat, &ParamList);
va_end(ParamList);
}
/*!
* @brief 初始化 RTT 打印接口
* 执行条件:无
*
* @retval: 无
*/
void segger_rtt_init(char * str)
{
SEGGER_RTT_Init();
print_log(str); // 封装接口,无需填写 BUFFER_INDEX
}
在 main
中初始化和打印:
#include "bsp_printlog.h" //封装接口的 .c 文件的头文件
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
segger_rtt_init("Demo start !"); // 调用这句进行初始化以及打印开机信息【Demo start!】
print_log("print a log\n"); //
}
2.3 效果演示
硬件上,Jlink
连接线 连接到 STM32
上,打开 【Segger RTT Viewer Vxxx.exe】,连接芯片,我这里选择的是 STM32F7676IG
,请根据自己所用的芯片进行选择
可以在 【log】标签页看到连接信息
将程序编译并烧录进 STM32,可以看到代码里面写的调试信息输出到 【 Segger RTT 】中,大功告成!!!
总结
以上是 stm32 实现 Segger RTT 打印
的全部内容,本文仅仅介绍了 Segger RTT 的使用,Segger RTT 的使用可以让我们节省一个串口的占用,还可以降低串口打印可能出现对系统实时性的影响。
- 【嵌入式实战】STM32+Lwip 实现 DHCP+HostName(超详细) : 在 DHCP 的基础上 Ping 域名的方式获取 DHCP 的 IP
- 【嵌入式实战】STM32+Lwip 实现 SNTP 网络授时(超详细)
- 【嵌入式实战】STM32+FreeRTOS+LWIP+WolfSSL 实现 HTTPS(超详细)
我是 HinGwenWoong ,一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,码字不易,如果帮到您,请帮我在屏幕下方点赞 👍 ,您的点赞可以让技术传播得更远更广,谢谢!
授权须知
- 原创文章在推送两天后才可进行转载
- 转载文章,禁止声明原创
- 不允许直接二次转载,转载请根据原文链接联系作者
- 若无需改版,在文首清楚标注作者及来源/原文链接,并删除【原创声明】,即可直接转载。
但对于未注明转载来源/原文链接的文章,我将保留追述的权利。
作者:HinGwenWoong
一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,共同进步!
CSDN: HinGwenWoong
原文链接:【嵌入式小技巧】stm32 实现 Segger RTT 打印(超详细)
- 若需要修改文章的排版,请根据原文链接联系作者
- 再次感谢您的认可,转载请遵守如上转载须知!