Keil调试(RTT Debug 断点)
调试
打印操作
方式 | 接口 | 优缺点 |
---|---|---|
串口打印 | TX+RX | 简单,但是占用串口,速度慢,重定向fputc简单 |
RTT打印 | SWDIO+SWCLK | 速度快,不占额外接口,直接移植RTT库 |
断点打印 | SWDIO+SWCLK | Debug的时候断点操作 |
SWO | SWDIO+SWCLK+SWO | 需要连接SWO引脚,重定向fputc简单 |
这里我只介绍RTT打印和断点打印;
一. RTT打印输出
- 下载 J-Link驱动:https://www.segger.com/downloads/jlink/
- 根据参考路径找到RTT下的文件: j-link\JLink_V620h\Samples\RTT\SEGGER_RTT_V620h\RTT
- 将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 并配置好:
效果如图:
- 附加功能:
-
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"); } } }
效果如下:(默认显示两位小数,有其他需求在相同位置自行更改)
- RTT默认不输出浮点数的,想输出浮点数需要再
二.断点打印
- main.c
- 添加断点后打开Breakpoints…,可以直接在断点窗口中加断点(也可以根据地址以及文件以及行数直接添加):
- 添加完断点在断点窗口如图操作
然后运行,程序不会中断,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