Jlink使用技巧之虚拟串口功能

简介: 前言串口调试是单片机开发过程必不可少的一个功能,一般是使用一个UART-TTL的串口模块来实现串口的功能,其实下载调试使用的Jlink仿真器也可以实现串口调试的功能,本篇文章将介绍如何使用Jlink实现虚拟串口功能。

前言

串口调试是单片机开发过程必不可少的一个功能,一般是使用一个UART-TTL的串口模块来实现串口的功能,其实下载调试使用的Jlink仿真器也可以实现串口调试的功能,本篇文章将介绍如何使用Jlink实现虚拟串口功能。

ITM简介

img_533afce4061801e558a2fce3bc4a5346.jpe

ITM是ARM Cortex-M系列内核芯片中的一种全新的调试功能,可以方便的通过调试器来实现printf调试功能。来自STM32中文参考手册的介绍:

ITM ( 指令跟踪微单元 instrumentation trace macrocell):ITM是一应用驱动的跟踪源,它支持printf类的调试手段来跟踪操作系统(OS)和应用事件,并发布判定的系统信息。ITM以包的形式发布跟踪信息,它由以下部分组成:

  • 软件跟踪:软件可以通过直接写ITM激发寄存器来发布包信息。
  • 硬件跟踪:ITM会发布由DWT产生的信息包。
  • 时间戳:时间戳被发布到相应的包上。ITM包含一个21位的计数器以产生时间戳。Cortex-M3的时钟或串行线观测器(Serial Wire Viewer)的位时钟率给计数器提供时钟。由ITM发送的信息包输出到TPIU(Trace Port Interface Unit),TPIU再添加一些额外的包(参考TPIU),然后输出完整的包序列给调试器。用户在设置或使用ITM之前,必需先使能异常调试和监视控制寄存器(Debug Exception and Monitor Control Register)的TRCEN位。

1.将ITM端口寄存器定义添加到源代码中

在程序开始处添加以下代码:

#define ITM_Port8(n)    (*((volatile unsigned char *)(0xE0000000+4*n)))
#define ITM_Port16(n)   (*((volatile unsigned short*)(0xE0000000+4*n)))
#define ITM_Port32(n)   (*((volatile unsigned long *)(0xE0000000+4*n)))
#define DEMCR           (*((volatile unsigned long *)(0xE000EDFC)))
#define TRCENA          0x01000000

2.重定向printf函数

添加重定向printf函数代码:

struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;

int fputc(int ch, FILE *f) {
  if (DEMCR & TRCENA) {
    while (ITM_Port32(0) == 0);
    ITM_Port8(0) = ch;
  }
  return(ch);
}

以上两段代码可以添加在usart.c文件中,如果文件中已经有了重定向printf的代码,要屏蔽掉,只保留一个重定向。

3.在应用程序中添加调试信息

在程序中添加需要输出的调试信息:

printf("电子电路开发学习:mcu149, Test: %.1f \r\n" ,test += 0.1);

4.设置ITM端口0以使能调试功能

在进行调试之前要先使能ITM调试功能,具体配置如下图所示:

img_62f65b0354d2cb5194346ee46fa72004.jpe

5.确认硬件的连接方式。

使用ITM调试机制必须使用SWD模式,而且必须要连接SWO,SWO对应JTAG接口的13脚,即至少需要连接4根线。如下图所示:

img_ed9368139bc90e24522ca33fef671aac.jpe

6.打开Debug(printf)窗口

进入Debug调试模式之后,调出Debug(printf)窗口,View - Serial Windows - Debug (printf) Viewer,如下图所示:

img_caf35d5c9c60de4beba45d2e440e04a7.jpe

程序运行之后,就会在printf窗口看到串口输出的信息。

img_6883baa4d7032945d60ca81f6cdfdeee.jpe

参考资料:

Debug (printf) Viewer


JLink_Windows_V614b软件下载链接:JLink_Windows_V614b.exe


历史精选文章:


欢迎大家关注我的个人博客

或微信扫码关注我的公众号

img_954cd7422a2def047d3f713ee25a28c1.jpe

目录
相关文章
|
5月前
|
存储 NoSQL Linux
OpenOCD(一):什么是OpenOCD&调试适配器硬件
OpenOCD(一):什么是OpenOCD&调试适配器硬件
532 0
|
编解码 Linux 数据格式
Linux MIPI DSI LCD设备驱动开发调试细节学习笔记(一)
Linux MIPI DSI LCD设备驱动开发调试细节学习笔记(一)
1561 0
|
Linux
调试lcd时候给linux单板移植tslib
调试lcd时候给linux单板移植tslib
117 0
调试lcd时候给linux单板移植tslib
|
Linux 开发工具 git
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十五)具体单板的按键驱动程序(查询方式)
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十五)具体单板的按键驱动程序(查询方式)
244 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十五)具体单板的按键驱动程序(查询方式)
|
Ubuntu Linux 编译器
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十七)具体单板的LED驱动程序
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十七)具体单板的LED驱动程序
186 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十七)具体单板的LED驱动程序
|
芯片
手把手教你制作Jlink-OB调试器(含原理图、PCB、外壳、固件)
手把手教你制作Jlink-OB调试器(含原理图、PCB、外壳、固件)
445 0
手把手教你制作Jlink-OB调试器(含原理图、PCB、外壳、固件)
|
编译器 C语言 芯片
1、STVD和STVP的使用及串口烧写程序教程
1、STVD和STVP的使用及串口烧写程序教程
1064 0
1、STVD和STVP的使用及串口烧写程序教程
stm32实用技巧:JLINK接口定义和使用JTAG或SW下载程序
stm32实用技巧:JLINK接口定义和使用JTAG或SW下载程序
stm32实用技巧:JLINK接口定义和使用JTAG或SW下载程序