Jlink使用技巧之虚拟串口功能
扫描二维码
随时随地手机看文章
前言
串口调试是单片机开发过程必不可少的一个功能,一般是使用一个UART-TTL的串口模块来实现串口的功能,其实下载调试使用的Jlink仿真器也可以实现串口调试的功能,本篇文章将介绍如何使用Jlink实现虚拟串口功能。ITM简介
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