【单片机】使用SEGGER RTT实现日志打印

这篇具有很好参考价值的文章主要介绍了【单片机】使用SEGGER RTT实现日志打印。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在进行单片机开发的过程中,不可避免的要用到日志打印来辅助进行开发及问题排查。肯定有聪明的小伙伴会说了,直接用下面这种方法把printf重新向到串口不就得了:

int fputc(int ch, FILE *f)
{
    uint8_t temp[1]={ch};
    HAL_UART_Transmit(&huart2, temp, 1, 2);
}

在串口资源不是特别紧张的情况下,使用这种方法当然没问题,但是如果单片机的串口资源全部都被占用了,又有串口调试的需求,那就需要一些特殊的技巧了。
rtt打印,教程,知识分享,单片机,嵌入式硬件,stm32

RTT的全称是实时传输(Real Time Transmit),是Segger公司推出的,搭配Jlink使用的调试手段,与其它的日志打印手段相比,其具备下列特点:

方式 物理接口 优点 缺点
RTT SWDIO+SWCLK 速度非常快、不占用额外接口 需要移植RTT库
EventRecoder SWDIO+SWCLK 不占用额外接口 依赖MDK等开发环境,看日志需进debug
串口 TX+RX 无需专用上位机、重定向fputc简单 速度较RTT慢、需要占用串口
SWO SWDIO+SWCLK+SWO 不占用串口、重定向fputc简单 需要额外的SWO引脚、简单的下载器都没有带

RTT连接拓扑如下图所示:
rtt打印,教程,知识分享,单片机,嵌入式硬件,stm32

有眼尖的小伙伴看到了,虽然SEGGER RTT官方说是搭配Jlink的调试手段,但是没说别的调试器就一定不能用🙃
既然有这么个东西,我又碰巧有个Jlink,那不如试试看好不好用😀

驱动移植

第一步、下载Jlink驱动

甭管你有没有Jlink,SEGGER RTT是Jlink驱动里面的功能,驱动还是要下的:
访问SEGGER的官网,在Jlink的下载页进行下载即可:https://www.segger.com/downloads/jlink/
rtt打印,教程,知识分享,单片机,嵌入式硬件,stm32

第二步、提取单片机上的RTT库

打开Jlink驱动的安装位置(默认为:C:\Program Files\SEGGER\JLink),不知道的话就右键打开文件位置去找
rtt打印,教程,知识分享,单片机,嵌入式硬件,stm32
rtt打印,教程,知识分享,单片机,嵌入式硬件,stm32
然后在这个目录下找到RTT的库文件:
rtt打印,教程,知识分享,单片机,嵌入式硬件,stm32
解压后我们会用到压缩包里面的这两个文件夹:
rtt打印,教程,知识分享,单片机,嵌入式硬件,stm32

第三步、移植RTT库

把RTT文件夹、Config文件夹里面的SEGGER_RTT_Conf.h放到项目里面去,这些文件都放进去
rtt打印,教程,知识分享,单片机,嵌入式硬件,stm32
注意:我这边是把SEGGER_RTT_Conf.h跟其它的.h放一起了,你可以像官方的例程一样建个Config放

然后MDK里面该加的文件都添加进去:
rtt打印,教程,知识分享,单片机,嵌入式硬件,stm32
include文件夹也别忘了
rtt打印,教程,知识分享,单片机,嵌入式硬件,stm32
如果你的SEGGER_RTT_Conf.h放的目录跟我一样的话,你应该还有修改下这个地方
rtt打印,教程,知识分享,单片机,嵌入式硬件,stm32
现在你就可以用如下的代码就行打印的测试了:

void SEGGER_RTT_Test(void)
{
    SEGGER_RTT_Init();		//初始化只需在单片机运行开始时调用一次即可
    uint32_t cycle = 1000;
    while (cycle--)
    {
        SEGGER_RTT_printf(0, "0123456789abcdefgh\r\n");
    }
}

第四步、封装RTT库接口(可选)

毕竟是拿来打日志的,直接调用printf那样不太优雅,新建个CAT_LOG.h文件,把下面的内容放进去:

/*
 * @Author: xmprocat
 * @Date: 2023-03-20 20:26:22
 * @LastEditors: xmprocat
 * @LastEditTime: 2023-03-20 20:26:42
 * @Description: 
 */
#ifndef _LOG_H_
#define _LOH_H_
#include "SEGGER_RTT.h"

#define LOG_DEBUG 1

#if LOG_DEBUG


#define LOG_PROTO(type,color,format,...)            \
        SEGGER_RTT_printf(0,"  %s%s"format"\r\n%s", \
                          color,                    \
                          type,                     \
                          ##__VA_ARGS__,            \
                          RTT_CTRL_RESET)

/* 清屏*/
#define LOG_CLEAR() SEGGER_RTT_WriteString(0, "  "RTT_CTRL_CLEAR)

/* 无颜色日志输出 */
#define LOG(format,...) LOG_PROTO("","",format,##__VA_ARGS__)

/* 有颜色格式日志输出 */
#define LOGI(format,...) LOG_PROTO("I: ", RTT_CTRL_TEXT_BRIGHT_GREEN , format, ##__VA_ARGS__)
#define LOGW(format,...) LOG_PROTO("W: ", RTT_CTRL_TEXT_BRIGHT_YELLOW, format, ##__VA_ARGS__)
#define LOGE(format,...) LOG_PROTO("E: ", RTT_CTRL_TEXT_BRIGHT_RED   , format, ##__VA_ARGS__)

#else
#define LOG_CLEAR()
#define LOG
#define LOGI
#define LOGW
#define LOGE

#endif

#endif // !_LOG_H_

用的时候先include “CAT_LOG.h”,然后这样用:rtt打印,教程,知识分享,单片机,嵌入式硬件,stm32
通过不同的日志等级还可以有不同的颜色显示,这里先放个效果:
rtt打印,教程,知识分享,单片机,嵌入式硬件,stm32
到这里,单片机上需要的工作就结束了,只需要接上Jlink,用USB进行连接就行了。

有JLINK

如果有Jlink,可以直接使用J-Link RTT Viewer、J-Link RTT Logger、J-Link RTT Client进行日志查看。就拿最简单的J-Link RTT Viewer举例子,在开始菜单或者是搜索框找到它:
rtt打印,教程,知识分享,单片机,嵌入式硬件,stm32
默认情况下只需设置需要调试的芯片跟调试器接口即可,可以参照下图:
rtt打印,教程,知识分享,单片机,嵌入式硬件,stm32
设置好点击OK就可以开始愉快的看日志了(SEGGER_RTT_printf函数的第一个参数就是指定在哪个Terminal窗口显示,默认是0):
rtt打印,教程,知识分享,单片机,嵌入式硬件,stm32

无JLINK

买一个Jlink最简单😅…
既然是要白嫖,那使用体验肯定是没那么好的,但是要用还是可以用的。本方法也可以搭配Jlink使用,但是不推荐。

第一步:装个Python

步骤自行百度,只要是Python3.6以上就行

第二步:安装pyocd

python3 -m pip install -U pyocd

第三步:安装芯片的pack

这里以Stm32F103ZET6为例子,装这个pack

python3 -m pyocd pack -i stm32f103

第四步:查看设备列表

python -m pyocd list

我这边是插了两个下崽器所以有两个设备
rtt打印,教程,知识分享,单片机,嵌入式硬件,stm32

第五步:连接设备

python -m pyocd rtt

rtt打印,教程,知识分享,单片机,嵌入式硬件,stm32

总结

SEGGER RTT毕竟是设计来与Jlink配合进行使用的,日志传输的速度非常快,并且支持在裸机、RTOS环境下运行,下图是官方宣传的理论性能:
rtt打印,教程,知识分享,单片机,嵌入式硬件,stm32

虽然支持与DAP等非Jlink调试器一起使用,但是与之配合的pyocd只在最新版本支持RTT,虽然RTT本身并不支持中文,但是时不时会因为字符编码格式问题抽风,使用体验算不上好(J-Link RTT Viewer不会出现)。
rtt打印,教程,知识分享,单片机,嵌入式硬件,stm32
作为一种不占用串口的日志输出方式,在部分应用场景下还是值得一试的。

参考文献

https://www.segger.com/downloads/jlink/
https://www.segger.com/jlink-rtt.html
https://zhuanlan.zhihu.com/p/163771273?utm_id=0文章来源地址https://www.toymoban.com/news/detail-755145.html

到了这里,关于【单片机】使用SEGGER RTT实现日志打印的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用DMA传输实现单片机高效串口转发——以STM32系列为例

    Date Author Version Note 2023.08.06 Dog Tao V1.0 1. 完成了文档的撰写。 2023.08.23 Dog Tao V1.1 1. 增加了STM32F103-USART2的DMA传输配置示例。 2. 增加了STM32F103与F407单片机的DMA控制器介绍并更改了第一章节的结构。 应用场景 在许多现实应用场景中,例如工业自动化控制、嵌入式通信设备等领域,

    2024年02月14日
    浏览(28)
  • 三、51单片机 使用Proteus仿真实现8位数码管滚动显示(仿真及代码)

    1,目标         使用51单片机控制8位数码管,分别滚动显示单个数字0~7,程序运行之后,单片机先控制最左边的第一位数码管显示0,其他的熄灭,延时一段时间之后,控制左边第二个数码管显示1,其它熄灭,以此类推,反复循环上述过程。 2,设计方式         使用P0输出

    2024年02月13日
    浏览(33)
  • AT89C51单片机实现单片机串口互动(中断方式,单片机--单片机,应答)

     说一下功能:客户机发送0x01到服务机 2服务单片机应答0xf2到客户机 3客户机接收到0xf2,发送信息153432这6个数字到服务机 4client发送完信息后发送0xaa结束通信 5server接收到0xaa后回复0xaa结束通信,从此老死不相往来 看代码: 服务端代码:    

    2024年02月13日
    浏览(36)
  • 51单片机实现贪吃蛇(清翔单片机)

    目录 一、创作背景 二、实现过程 1.一些声明与定义 2.键盘扫描 3.定时器中断 5.蛇的初始化 6.蛇体的移动 7.食物的创建 8.食物的检测和身体的增长 9.检测死亡 10.总代码 总结 由于大一的一个小作业,花了10天完成了这个小项目,中途克服了很多困难,发此文章以作纪念。 这些

    2024年02月08日
    浏览(32)
  • 单片机毕设 基于单片机的智能快递柜设计与实现

    Hi,大家好,这里是丹成学长,今天向大家介绍一个 单片机项目 基于单片机的智能快递柜设计与实现 大家可用于 课程设计 或 毕业设计 🧿 毕设项目分享:见文末! 一般来说,传统快递服务方式是人对人,即快递员进行揽件派送,与签收人进行面对面签收,确认无误后服务终

    2024年04月09日
    浏览(42)
  • 如何使用单片机点亮LED灯,并使用按键控制[51单片机]

    首先先看一下我的板子,如果我们板子不相同,可能操作也不太相同 我们就不讲底层原理了,直接看,我们可以看到板子上有 8个LED灯   那这个8个LED用什么来控制呢,我们先看底层的线路图,所有的LEDD都连接到了P2带后缀的接口上, 那么只需要操作这几个接口的高低电频,

    2024年02月05日
    浏览(32)
  • 单片机毕设 基于单片机的火灾报警系统设计与实现

    Hi,大家好,学长今天向大家介绍一个 单片机项目 基于单片机的火灾报警系统设计与实现 大家可用于 课程设计 或 毕业设计 火灾是指在时间或空间上失去控制的燃烧所造成的灾害。在各种灾害中,火灾是最经常、最普遍地威胁公众安全和社会发展的主要灾害之一。人类能够

    2024年02月02日
    浏览(42)
  • 【单片机基础】使用51单片机制作函数信号发生器(DAC0832使用仿真)

    单片机作为一个数字电路系统,当需要采集外界模拟量的使用需要进行AD转换,将模拟量转换成数字量,供单片机使用。51单片机需要外部配置一个AD转换芯片来进行模拟量的采集,如我之前写了一篇ADC0832的使用。高级的单片机如STC12和STM32已经集成了AD转换功能,只需简单配置

    2024年02月08日
    浏览(34)
  • 单片机设计基于51单片机的智能风扇控制系统设计与实现

      我们常见的电风扇一般只有四、五个风速档,用的是人工开关,而且并不是每个人家里都会有空调,或者在一些小型的工厂或者一些小型加工厂,这些地方都可能没有配备大型的中央空调系统这些东西,所以这些东西往往都会采用风扇这种小成本的东西来代替,但是不清楚

    2024年02月03日
    浏览(53)
  • 单片机实现动态内存管理

            多数传统的单片机并没有动态内存管理功能。单片机通常具有有限的存储资源,包括固定大小的静态RAM(SRAM)用于数据存储和寄存器用于特定功能。这些资源在编译时被分配并且在程序的整个生命周期中保持不变。 灵活性和效率:动态内存管理可以根据程序的需

    2024年02月14日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包