前言
串口調(diào)試是單片機開發(fā)過程必不可少的一個功能,一般是使用一個UART-TTL的串口模塊來實現(xiàn)串口的功能,其實下載調(diào)試使用的J
link仿真器也可以實現(xiàn)串口調(diào)試的功能,本篇文章將介紹如何使用J
link實現(xiàn)
虛擬串口功能。
ITM簡介
ITM是ARM Cortex-M系列內(nèi)核芯片中的一種全新的調(diào)試功能,可以方便的通過調(diào)試器來實現(xiàn)printf調(diào)試功能。來自STM32中文參考手冊的介紹:
ITM ( 指令跟蹤微單元 instrumentation trace macrocell):ITM是一應(yīng)用驅(qū)動的跟蹤源,它支持printf類的調(diào)試手段來跟蹤操作系統(tǒng)(OS)和應(yīng)用事件,并發(fā)布判定的系統(tǒng)信息。ITM以包的形式發(fā)布跟蹤信息,它由以下部分組成:- 軟件跟蹤:軟件可以通過直接寫ITM激發(fā)寄存器來發(fā)布包信息。
- 硬件跟蹤:ITM會發(fā)布由DWT產(chǎn)生的信息包。
- 時間戳:時間戳被發(fā)布到相應(yīng)的包上。ITM包含一個21位的計數(shù)器以產(chǎn)生時間戳。Cortex-M3的時鐘或串行線觀測器(Serial Wire Viewer)的位時鐘率給計數(shù)器提供時鐘。由ITM發(fā)送的信息包輸出到TPIU(Trace Port Interface Unit),TPIU再添加一些額外的包(參考TPIU),然后輸出完整的包序列給調(diào)試器。用戶在設(shè)置或使用ITM之前,必需先使能異常調(diào)試和監(jiān)視控制寄存器(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函數(shù)
添加重定向printf函數(shù)代碼:
struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f) {
?if (DEMCR