GD32F4开发 -- JLink使用

news2024/11/25 10:59:32

之前写过 STM32开发 – Jlink常用命令 ,今天遇到需要SEGGER RTT 配置,就再写一下吧。

一、下载并安装JLink

下载: J-Link / J-Trace Downloads

可选择需要的版本下载:
在这里插入图片描述

二、SEGGER RTT

包含文件

得到 SEGGER_RTT_V794m.zip 解压如下图:
在这里插入图片描述
SEGGER RTT Sources

https://www.segger.com/products/debug-probes/j-link/technology/about-real-time-transfer
https://wiki.segger.com/RTT

Included files

  • RTT/
    • SEGGER_RTT.c - Main module for RTT.
    • SEGGER_RTT.h - Main header for RTT.
    • SEGGER_RTT_ASM_ARMv7M.S - Assembly-optimized implementation of RTT functions for ARMv7M processors.
    • SEGGER_RTT_Printf.c - Simple implementation of printf (SEGGER_RTT_Printf()) to write formatted strings via RTT.
  • Syscalls/
    • SEGGER_RTT_Syscalls_*.c - Low-level syscalls to retarget printf() to RTT with different toolchains.
  • Config/
    • SEGGER_RTT_Conf.h - RTT configuration file.
  • Examples/
    • Main_RTT_InputEchoApp.c - Example application which echoes input on Channel 0.
    • Main_RTT_MenuApp.c - Example application to demonstrate RTT bi-directional functionality.
    • Main_RTT_PrintfTest.c - Example application to test RTT’s simple printf implementation.
    • Main_RTT_SpeedTestApp.c - Example application to measure RTT performance. (Requires embOS)

移植

直接将整个 RTT 文件夹拖入工程即可
在这里插入图片描述

使用

1、在主函数文件,添加头文件名

#include "SEGGER_RTT.h"

2、在主函数添加初始化SEGGER代码,放到系统时钟初始化 后面在初始化。

  SEGGER_RTT_ConfigUpBuffer(0, NULL, NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP);

3、在主函数或其它任务 内调用”SEGGER_RTT_printf“,即可测试输出

  SEGGER_RTT_printf(0, "printf Test: %%s,      \"RTT\" : %s.\r\n", "RTT");

定义 LOG.H 文件方便调用 SEGGER_API 接口

常规简易 LOG.H

#ifndef LOG_H
#define LOG_H

#include "SEGGER_RTT.h"

// 日志级别定义
#define LOG_LEVEL_NOLOG 0 // 无日志输出
#define LOG_LEVEL_ERROR 1 // 只输出错误
#define LOG_LEVEL_WARN 2  // 输出警告和错误
#define LOG_LEVEL_INFO 3  // 输出信息、警告和错误
#define LOG_LEVEL_DEBUG 4 // 输出调试信息、信息、警告和错误

// 设置当前日志级别
#define LOG_LEVEL LOG_LEVEL_DEBUG

// 常用文本颜色控制宏
#define LOG_RESET RTT_CTRL_RESET
#define LOG_RED RTT_CTRL_TEXT_RED
#define LOG_GREEN RTT_CTRL_TEXT_GREEN
#define LOG_YELLOW RTT_CTRL_TEXT_YELLOW
#define LOG_BLUE RTT_CTRL_TEXT_BLUE
#define LOG_MAGENTA RTT_CTRL_TEXT_MAGENTA
#define LOG_CYAN RTT_CTRL_TEXT_CYAN
#define LOG_WHITE RTT_CTRL_TEXT_WHITE

// 日志输出宏定义
#if LOG_LEVEL >= LOG_LEVEL_DEBUG
#define LOG(fmt, ...) SEGGER_RTT_printf(0, LOG_RESET "[DEBUG]: " fmt "\r\n", ##__VA_ARGS__)
#else
#define LOG(fmt, ...)
#endif

#if LOG_LEVEL >= LOG_LEVEL_INFO
#define LOG_INFO(fmt, ...) SEGGER_RTT_printf(0, LOG_GREEN "[INFO]: " fmt "\r\n", ##__VA_ARGS__)
#else
#define LOG_INFO(fmt, ...)
#endif

#if LOG_LEVEL >= LOG_LEVEL_WARN
#define LOG_WARN(fmt, ...) SEGGER_RTT_printf(0, LOG_YELLOW "[WARN]: " fmt "\r\n", ##__VA_ARGS__)
#else
#define LOG_WARN(fmt, ...)
#endif

#if LOG_LEVEL >= LOG_LEVEL_ERROR
#define LOG_ERROR(fmt, ...) SEGGER_RTT_printf(0, LOG_RED "[ERROR]: " fmt "\r\n", ##__VA_ARGS__)
#else
#define LOG_ERROR(fmt, ...)
#endif

#endif // LOG_H

带有时间戳的 LOG.H 文件,注意需要定义时间源!


#ifndef LOG_H
#define LOG_H
#include "SEGGER_RTT.h"
#if defined(USE_HAL_DRIVER)
extern uint32_t HAL_GetTick(void);
extern uint32_t HAL_GetUs(void);
    #define SYS_MS HAL_GetTick()
    #define SYS_US HAL_GetUs()
#else
    #define SYS_MS 0  // 如果不是使用HAL库 则使用自定义的时间源
    #define SYS_US 0
#endif

#define USE_LOG_DEBUG   1
#define PRINT_TIMESTAMP 1

typedef enum {
    LOG_TERMINAL0,
    LOG_TERMINAL1,
    LOG_TERMINAL2,
    LOG_TERMINAL3,
    LOG_TERMINAL4,
    LOG_TERMINAL5,
} LogTerminal_e;

typedef enum {
    LOG_ARR_BYTE1,
    LOG_ARR_BYTE2,
    LOG_ARR_BYTE4,
    LOG_ARR_FLOAT,
    LOG_ARR_INT,
} LogArrayType_e;

#if USE_LOG_DEBUG
    #if PRINT_TIMESTAMP
        #define LOG_PROTO(type, color, format, ...)                                                                                        \
            SEGGER_RTT_printf(0, "[%02d:%03d:%03d] %s%s" format "%s\r\n", (SYS_MS / 1000) % 60, SYS_MS % 1000, SYS_US % 1000, color, type, \
                              ##__VA_ARGS__, RTT_CTRL_RESET);
        // #define LOG_PROTO(type, color, format, ...)                                                                                                \
        //     SEGGER_RTT_printf(0, "[%02d:%02d:%02d:%03d:%03d] %s%s" format "%s\r\n", (SYS_MS / (60 * 60 * 1000)) % 24, (SYS_MS / (60 * 1000)) % 60, \
        //                       (SYS_MS / 1000) % 60, SYS_MS % 1000, SYS_US % 1000, color, type, ##__VA_ARGS__, RTT_CTRL_RESET);
    #else
        #define LOG_PROTO(type, color, format, ...) SEGGER_RTT_printf(0, "%s%s" format "%s\r\n", color, type, ##__VA_ARGS__, RTT_CTRL_RESET);
    #endif

    #define LOG_INFO(format, ...)  LOG_PROTO("[INFO]:", "", format, ##__VA_ARGS__)                           // 无颜色日志输出
    #define LOG_DEBUG(format, ...) LOG_PROTO("[DEBUG]:", RTT_CTRL_TEXT_BRIGHT_GREEN, format, ##__VA_ARGS__)  // 绿色日志输出
    #define LOG_WARN(format, ...)  LOG_PROTO("[WARN]:", RTT_CTRL_TEXT_BRIGHT_YELLOW, format, ##__VA_ARGS__)  // 黄色日志输出
    #define LOG_ERROR(format, ...) LOG_PROTO("[ERROR]:", RTT_CTRL_TEXT_BRIGHT_RED, format, ##__VA_ARGS__)    // 红色日志输出
    #define LOG_CLEAR()            SEGGER_RTT_WriteString(0, "\r\n" RTT_CTRL_CLEAR)                          // 清屏

    // 打印数组
    #define LOG_ARRAY(pArr, len, logArrayType, terminal)                        \
        do {                                                                    \
            SEGGER_RTT_SetTerminal(terminal);                                   \
            for (int i = 0; i < len; i++) {                                     \
                switch (logArrayType) {                                         \
                    case LOG_ARR_BYTE1:                                         \
                        SEGGER_RTT_printf(0, "%02x ", *(uint8_t *)(pArr + i));  \
                        break;                                                  \
                    case LOG_ARR_BYTE2:                                         \
                        SEGGER_RTT_printf(0, "%04x ", *(uint16_t *)(pArr + i)); \
                        break;                                                  \
                    case LOG_ARR_BYTE4:                                         \
                        SEGGER_RTT_printf(0, "%08x ", *(uint32_t *)(pArr + i)); \
                        break;                                                  \
                    case LOG_ARR_FLOAT:                                         \
                        SEGGER_RTT_printf(0, "%f ", *(float *)(pArr + i));      \
                        break;                                                  \
                    case LOG_ARR_INT:                                           \
                        SEGGER_RTT_printf(0, "%d ", *(int *)(pArr + i));        \
                        break;                                                  \
                    default:                                                    \
                        break;                                                  \
                }                                                               \
            }                                                                   \
            SEGGER_RTT_printf(0, "\r\n");                                       \
            SEGGER_RTT_SetTerminal(0);                                          \
        } while (0)

    // 初始化
    #define LOG_INIT()               \
        do {                         \
            SEGGER_RTT_Init();       \
            LOG_CLEAR();             \
            LOG_INFO("RTT Inited!"); \
        } while (0)

#else
    #define LOG_INFO(format, ...)
    #define LOG_DEBUG(format, ...)
    #define LOG_WARN(format, ...)
    #define LOG_ERROR(format, ...)
    #define LOG_CLEAR()
    #define LOG_ARRAY(pArr, len, logArrayType, terminal)
    #define LOG_INIT()
#endif

#endif


调试

打开J-LinkRTTViewer.exe
在这里插入图片描述
选择所使用电路的芯片型号和连接方式速度:
在这里插入图片描述
连接信息:
在这里插入图片描述
打印信息:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2127324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KTV 包房订房登记表—SAAS本地化及未来之窗行业应用跨平台架构

一、服务员点单 二、服务员自己点单好处 可以自动计算绩效和提成 三、阿雪技术观 拥抱开源与共享&#xff0c;见证科技进步奇迹&#xff0c;畅享人类幸福时光&#xff01; 让我们积极投身于技术共享的浪潮中&#xff0c;不仅仅是作为受益者&#xff0c;更要成为贡献者。无论是…

scene graph generation 计算mean recall数据的过程:

这里写目录标题 前言&#xff1a;计算mean recall的详细过程1. **准备数据**&#xff1a;2. **计算每个类别的recall**&#xff1a;具体代码片段准备groundtruth数据准备预测数据计算recall计算mean recall 前言&#xff1a; 计算流程这里参考maskrcnn_benchmark/data/dataset…

为AppInventor2开发自己的拓展(Extension) - 拓展开发入门篇

//为什么需要开发拓展&#xff1f;// App Inventor 2 是积木式在线安卓开发环境&#xff0c;利用拖拽式的方式实现代码块堆叠&#xff0c;从而完成相应的逻辑。 上手很容易&#xff0c;但是由于代码块提供的功能有限&#xff0c;使用比较单一&#xff0c;在开发上有很大的局限…

计算机视觉的应用32-基于Swin Transformer模型的嵌入混合注意力机制的人脸表情识别的应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用32-基于Swin Transformer模型的嵌入混合注意力机制的人脸表情识别的应用。随着深度学习技术的不断演进&#xff0c;计算机视觉领域迎来了诸多变革&#xff0c;其中 Transformer 架构的引入&#xf…

脑电实验打mark【Eprim中打mark】

文章目录 脑电实验打mark一、端口号查询二、并口打mark 脑电实验打mark 一、端口号查询 右击我的电脑–>管理–>设备管理器–>端口 二、并口打mark 在整个流程最前面添加inline控件&#xff1a; 需要打mark的控件名.onsetsignalenabledTrue //去送信 需要打mark的…

助力汽车零部件产业发展,2025 第十二届广州国际汽车零部件加工技术及汽车模具展览会与您相约“羊城”广州

助力汽车零部件产业发展&#xff0c;2025 第十二届广州国际汽车零部件加工技术及汽车模具展览会与您相约“羊城”广州 汽车零部件是支撑汽车工业持续健康发展的必要因素&#xff0c;为汽车的正常运行和安全性能提供了保障。近年来&#xff0c;中国汽车零部件行业受到各级政府的…

基于SpringBoot+Vue的线上考试系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的线上考试…

【C语言】内存函数详细讲解

文章目录 前言strerror的声明和使用字符串分类函数字符转换函数内存拷贝函数&#xff08;memcpy)memcpy的声明和使用memcpy函数的模拟实现 内存拷贝函数&#xff08;memmove&#xff09;memmove的声明和使用memmove模拟实现 内存比较函数&#xff08;memcmp&#xff09;memcmp的…

【数字ic自整资料】常见串行总线协议

参考链接 IIC总线的原理与Verilog实现_iic verilog-CSDN博客 I2C&#xff08;IIC&#xff09;的仲裁、时钟同步和时钟扩展_i2c,clock stretch波形-CSDN博客 精解IIC协议_iic写数据-CSDN博客 串行通信——UART总结-CSDN博客 SPI协议详解&#xff08;图文并茂超详细&#xf…

java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor

更换JDK java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (in unnamed module 0x3302035b) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module jdk.compiler does not export …

【大模型推理】大模型前向推理过程详解

文章目录 前期准备环境安装下载模型Qwen2-7b模型架构vscode配置launch.json文件 前向推理debug深入分析预测第一个next_token预测第二个next_token 为了搞清楚&#xff0c;大模型前向推理的具体流程&#xff0c;本文以Qwen2-7B-Instruct为例&#xff0c;通过直接debug官方推理示…

战外网配置——光猫桥接+路由器PPPoE拨号+防火墙外网链路健康检查+外网流量负载均衡

一、适用场景&#xff1a; 1、企业规模较大时&#xff0c;1条公网带宽流量可能不足&#xff0c;需要用到多条公网出口时。 2、企业有业务需要静态ip映射&#xff0c;但是因静态ip专线价格较高&#xff0c;所以需要拨号光纤承载较多的下行流量。 3、当公网出口有多条链路&#…

最大矩阵和

题目描述 给定一个二维整数矩阵&#xff0c;要在这个矩阵中选出一个子矩阵. 使得这个子矩阵内所有的数字和尽量大&#xff0c;我们把这个子矩阵称为和最大子矩阵 子矩阵的选取原则是原矩阵中一块相互连续的矩形区域。 输入描述 输入的第一行包含2个整数n,m(1< n,m< 10…

C++设计模式——Interpreter解释器模式

一&#xff0c;解释器模式的定义 解释器模式是一种行为型设计模式&#xff0c;它用于定义一个语言的文法并解析语言中的表达式&#xff0c;使开发者可以实现自定义语言&#xff0c;并通过解释器对语言中的表达式进行解析和执行。 解释器模式主要用于解决对特定表达式的解析与…

python-游戏自动化(三)(实战-豆腐女孩)

前提准备 特别注意&#xff1a; 本节教程所演示的模拟器分辨率设置为 720x1080&#xff08;手机版&#xff09;&#xff0c;电脑分辨率设置大720x1080并且没有设置放大。 今天的课程开始之前我们来回顾一下昨天所学的知识内容&#xff0c;因为今天要学的内容和昨天内容…

CogView-3-Plus:深度解锁智谱AI的图像生成新力量

一、引言&#xff1a;AI助力创意与效率的全面提升 在如今这个瞬息万变的科技时代&#xff0c;AI大模型早就不是实验室里的“神秘武器”&#xff0c;它们已经实实在在地融入到我们的日常工作中了&#xff0c;尤其是在图像生成和内容创作这块儿&#xff0c;简直是效率神器。只要几…

Leetcode3270. 求出数字答案

Every day a Leetcode 题目来源&#xff1a;3270. 求出数字答案 解法1&#xff1a;模拟 按题意模拟。 代码&#xff1a; /** lc appleetcode.cn id3270 langcpp** [3270] 求出数字答案*/// lc codestart class Solution { public:int generateKey(int num1, int num2, int…

基于python+django+vue鲜花商城系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的线…

反射(java)

一、junit单元测试框架 1、单元测试 就是针对最小的功能单元&#xff08;方法&#xff09;&#xff0c;编写测试代码对其进行正确性测试。 之前的是如何进行单元测试的&#xff1f; 有啥问题&#xff1f; 1、只能在ma方法编写测试代码&#xff0c;去调用其他方法进行测试。…

CCS811二氧化碳传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理介绍 三、程序设计 main.c文件 ccs811.h文件 ccs811.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 CCS811模块是一种气体传感器&#xff0c;可以测量环境中TVOC(总挥发性有机物质)浓度和eCO2…