当前位置: 首页 > news >正文

Keil调试(RTT Debug 断点)

调试

打印操作

方式接口优缺点
串口打印TX+RX简单,但是占用串口,速度慢,重定向fputc简单
RTT打印SWDIO+SWCLK速度快,不占额外接口,直接移植RTT库
断点打印SWDIO+SWCLKDebug的时候断点操作
SWOSWDIO+SWCLK+SWO需要连接SWO引脚,重定向fputc简单

这里我只介绍RTT打印和断点打印;

一. RTT打印输出

  1. 下载 J-Link驱动:https://www.segger.com/downloads/jlink/

在这里插入图片描述

  1. 根据参考路径找到RTT下的文件: j-link\JLink_V620h\Samples\RTT\SEGGER_RTT_V620h\RTT

在这里插入图片描述

  1. 将RTT库添加到工程文件,记得别忘记添加包含路径

在这里插入图片描述

在这里插入图片描述

添加好后就可以使用SEGGER_RTT_printf(unsigned BufferIndex, const char *sFormat, ...)函数打印输出了

    SEGGER_RTT_Init(); //RTT初始化
    while (1)
    { 
        SEGGER_RTT_printf(0, "hello rtt\r\n"); //输出到Terminal0
        delay_ms(1000);
    }

打开 JLinkRTTViewer 并配置好:

在这里插入图片描述

在这里插入图片描述

效果如图:

在这里插入图片描述

  1. 附加功能:
  • 4.1 带颜色日志输出

    新建CAT_LOG.h文件

    #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_
    
    

    使用的时候导入头文件:CAT_LOG.h

    • main.c
     #include "CAT_LOG.h"
    
    int main()
    {
            SEGGER_RTT_Init();
        while (1)
        { 
            uint32_t cycle = 1000;
            while (cycle--)
            {
                delay_ms(500);
                SEGGER_RTT_printf(0, "%d\r\n",cycle);
                LOGI("hello rtt ---I");
                LOGW("hello rtt ---W");
                LOGE("hello rtt ---E");
    
            }
    
        }
    }
    

    **效果如下:**要在具体的Terminal中才能看到颜色

    在这里插入图片描述

  • 4.2 输出浮点数

    • RTT默认不输出浮点数的,想输出浮点数需要再SEGGER_RTT_printf.c中修改SEGGER_RTT_vprintf函数;
    //在SEGGER_RTT_vprintf函数下的 switch (c)语句中添加浮点数的case即可
    
    /*添加输出浮点数的功能。默认带两位小数。*/
          case 'f': 
          case 'F':
          {
            float fv = (float)va_arg(*pParamList, double); // 取出输入的浮点数值
            if (fv < 0)
            {
              _StoreChar(&BufferDesc, '-'); // 判断正负号
              fv *= -1;
            }
            int v = (int)fv;                                                    // 取正整数部分
            _PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags); // 显示整数
            _StoreChar(&BufferDesc, '.');                                       // 显示小数点
            v = (int)(fv * 100) % 100;                                          // 显示小数点后两位
            _PrintInt(&BufferDesc, v, 10u, 2, FieldWidth, FormatFlags);         // 显示小数部分
            break;
          }
    

    然后主函数中:

     #include "CAT_LOG.h"
    
    int main()
    {
            SEGGER_RTT_Init();
        while (1)
        { 
            uint32_t cycle = 1000;
            while (cycle--)
            {
                delay_ms(500);
                SEGGER_RTT_printf(0, "%f\r\n",(float)cycle/1.5);
                LOGI("hello rtt ---I");
                LOGW("hello rtt ---W");
                LOGE("hello rtt ---E");
    
            }
    
        }
    }
    

    效果如下:(默认显示两位小数,有其他需求在相同位置自行更改)

    在这里插入图片描述

二.断点打印

  • main.c

在这里插入图片描述

  1. 添加断点后打开Breakpoints…,可以直接在断点窗口中加断点(也可以根据地址以及文件以及行数直接添加):

在这里插入图片描述

  1. 添加完断点在断点窗口如图操作

在这里插入图片描述

然后运行,程序不会中断,command会printf输出内容:

在这里插入图片描述

  • 关于断点还有一些操作,可自行研究这个BreakPoints窗口…比如循环中一次性执行N此才停止(设置上图中的Count值即可)

引用:
https://blog.csdn.net/u011493046/article/details/129805728
https://www.bilibili.com/video/BV1qyquYsEsd/?spm_id_from=333.1387.upload.video_card.click&vd_source=92402b9607d936c44526595eea2317d0

相关文章:

  • 查看iphone手机的使用记录-克魔实战
  • OpenCv(二)——边界填充、阈值处理
  • AspNetCore路由:网络请求的交通指挥官
  • java笔记02
  • 微服务架构中的精妙设计:环境和工程搭建
  • 使用G-suite Workspace教育订阅快速搭建企业邮局及免费申请其他服务
  • 制作cass高程点块定义——cad c#二次开发——待调试
  • 鸿蒙学习手册(HarmonyOSNext_API16)_数据持久化③:关系型数据库
  • 【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的消息队列:使用 RabbitMQ 实现异步处
  • C++ STL常用算法之常用算术生成算法
  • 【区块链安全 | 第十四篇】类型之值类型(一)
  • ShuffleNet、MobileNet 和 EfficientNet的区别
  • 探索OCR的第二个方案:EasyOCR
  • 小智机器人关键函数解析,Application::MainLoop() 用于持续监听事件组中的事件,并根据不同的事件触发相应的操作
  • Android在KSP中简单使用Room
  • Vue.js的多个组件过渡:实现组件的动态切换
  • 互联网的组成
  • C语言信号量使用案例
  • 每日小积累day1
  • TDengine tar.gz和docker两种方式安装和卸载