前言
串口調(diào)試是單片機(jī)開發(fā)過(guò)程必不可少的一個(gè)功能,一般是使用一個(gè)UART-TTL的串口模塊來(lái)實(shí)現(xiàn)串口的功能,其實(shí)下載調(diào)試使用的J
link仿真器也可以實(shí)現(xiàn)串口調(diào)試的功能,本篇文章將介紹如何使用J
link實(shí)現(xiàn)
虛擬串口功能。
ITM簡(jiǎn)介
ITM是ARM Cortex-M系列內(nèi)核芯片中的一種全新的調(diào)試功能,可以方便的通過(guò)調(diào)試器來(lái)實(shí)現(xiàn)printf調(diào)試功能。來(lái)自STM32中文參考手冊(cè)的介紹:
ITM ( 指令跟蹤微單元 instrumentation trace macrocell):ITM是一應(yīng)用驅(qū)動(dòng)的跟蹤源,它支持printf類的調(diào)試手段來(lái)跟蹤操作系統(tǒng)(OS)和應(yīng)用事件,并發(fā)布判定的系統(tǒng)信息。ITM以包的形式發(fā)布跟蹤信息,它由以下部分組成:- 軟件跟蹤:軟件可以通過(guò)直接寫ITM激發(fā)寄存器來(lái)發(fā)布包信息。
- 硬件跟蹤:ITM會(huì)發(fā)布由DWT產(chǎn)生的信息包。
- 時(shí)間戳:時(shí)間戳被發(fā)布到相應(yīng)的包上。ITM包含一個(gè)21位的計(jì)數(shù)器以產(chǎn)生時(shí)間戳。Cortex-M3的時(shí)鐘或串行線觀測(cè)器(Serial Wire Viewer)的位時(shí)鐘率給計(jì)數(shù)器提供時(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