【嵌入式小技巧】STM32 实现 SEGGER RTT 打印(超详细)

文章目录

  • 原创声明
  • 前言
  • 一、RTT 是什么?
  • 二、使用步骤
    • 1.引入驱动库
    • 2.实现 log 打印输出
      • 2.0 编译选项注意
      • 2.1 直接使用
      • 2.2 封装使用(推荐)
      • 2.3 效果演示
  • 总结
  • 授权须知


原创声明

本文为 HinGwenWoong 原创,如果这篇文章对您有帮助,欢迎转载,转载请阅读文末的【授权须知】,感谢您对 HinGwenWoong 文章的认可!


前言

嵌入式的开发离不开log的打印,我们常常使用的是重定向printf到串口打印输出,但是会对系统的实时性产生一定的影响,RTT技术可以在一定程度解决这个问题。

我是 HinGwenWoong ,一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,码字不易,如果帮到您,请帮我在屏幕下方点赞 ,您的点赞可以让技术传播得更远更广,谢谢!

一、RTT 是什么?

使用RTT(Real Time Transfer),可以从目标微控制器输出信息,以及以很高的速度将输入发送到应用程序,而不会影响目标的实时行为SEGGER RTT可与任何J-Link模型和支持后台内存访问的任何受支持的目标处理器一起使用,这些处理器是Cortex-MRX目标。

RTT在双向上都支持多个通道,直至主机和目标,都可以用于不同目的,并为用户提供最大的自由度。

RTT默认实现是每个方向使用一个通道,该通道用于可打印的终端输入和输出。 使用J-Link RTT Viewer,该通道可用于多个“虚拟”终端,从而仅使用一个目标缓冲区即可打印到多个窗口(例如,一个用于标准输出,一个用于错误输出,一个用于调试输出)。 例如,可以使用一个附加的(主机)通道来发送配置文件或事件跟踪数据。

更多资料,详见其官网 SEGGER’s Real Time Transfer (RTT)

【嵌入式小技巧】STM32 实现 SEGGER RTT 打印(超详细)_第1张图片

二、使用步骤

1.引入驱动库

  • 首先在官网选择合适的版本下载并安装 Jlink,官网下载地址【嵌入式小技巧】STM32 实现 SEGGER RTT 打印(超详细)_第2张图片
  • 安装之后进入目录可以看到 Jlink 全家桶
    【嵌入式小技巧】STM32 实现 SEGGER RTT 打印(超详细)_第3张图片
  • 在【开始】菜单栏可以看到快捷方式 【Segger RTT Viewer Vxxx.exe】,我这里安装了 V6.44c 的版本
    【嵌入式小技巧】STM32 实现 SEGGER RTT 打印(超详细)_第4张图片
  • 去到刚刚安装文件的目录,可以看到对应Jlink版本的 RTT 驱动的压缩包
    【嵌入式小技巧】STM32 实现 SEGGER RTT 打印(超详细)_第5张图片

  • 解压,可以见到驱动文件
    【嵌入式小技巧】STM32 实现 SEGGER RTT 打印(超详细)_第6张图片

  • 将上面红色框的文件,复制到 SMT32 工程文件中,加入到 KEIL 工程中
    【嵌入式小技巧】STM32 实现 SEGGER RTT 打印(超详细)_第7张图片
    并将其 头文件 也包含进工程

【嵌入式小技巧】STM32 实现 SEGGER RTT 打印(超详细)_第8张图片

2.实现 log 打印输出

2.0 编译选项注意

一定要 取消 这个勾选!!!
【嵌入式小技巧】STM32 实现 SEGGER RTT 打印(超详细)_第9张图片

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,请根据自己所用的芯片进行选择
【嵌入式小技巧】STM32 实现 SEGGER RTT 打印(超详细)_第10张图片
可以在 【log】标签页看到连接信息

【嵌入式小技巧】STM32 实现 SEGGER RTT 打印(超详细)_第11张图片
将程序编译并烧录进 STM32,可以看到代码里面写的调试信息输出到 【 Segger RTT 】中,大功告成!!!
【嵌入式小技巧】STM32 实现 SEGGER RTT 打印(超详细)_第12张图片

总结

以上是 stm32 实现 Segger RTT 打印 的全部内容,本文仅仅介绍了 Segger RTT 的使用,Segger RTT 的使用可以让我们节省一个串口的占用,还可以降低串口打印可能出现对系统实时性的影响。


更多阅读推荐
  • 【嵌入式实战】STM32+Lwip 实现 DHCP+HostName(超详细) : 在 DHCP 的基础上 Ping 域名的方式获取 DHCP 的 IP
  • 【嵌入式实战】STM32+Lwip 实现 SNTP 网络授时(超详细)
  • 【嵌入式实战】STM32+FreeRTOS+LWIP+WolfSSL 实现 HTTPS(超详细)

我是 HinGwenWoong ,一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,码字不易,如果帮到您,请帮我在屏幕下方点赞 ,您的点赞可以让技术传播得更远更广,谢谢!


授权须知

  1. 原创文章在推送两天后才可进行转载
  2. 转载文章,禁止声明原创
  3. 不允许直接二次转载,转载请根据原文链接联系作者
  4. 若无需改版,在文首清楚标注作者及来源/原文链接,并删除【原创声明】,即可直接转载。
    但对于未注明转载来源/原文链接的文章,我将保留追述的权利。

作者:HinGwenWoong
一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,共同进步!
CSDN: HinGwenWoong
原文链接:【嵌入式小技巧】stm32 实现 Segger RTT 打印(超详细)

  1. 若需要修改文章的排版,请根据原文链接联系作者
  2. 再次感谢您的认可,转载请遵守如上转载须知!

你可能感兴趣的:(嵌入式SMT32,stm32,嵌入式,c语言,rtt,单片机)