前言
串口調試是單片機開發過程必不可少的一個功能,一般是使用一個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 & 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調試功能,具體配置如下圖所示:

5.確認硬件的連接方式。
使用ITM調試機制必須使用SWD模式,而且必須要連接SWO,SWO對應JTAG接口的13腳,即至少需要連接4根線。如下圖所示:

6.打開Debug(printf)窗口
進入Debug調試模式之后,調出Debug(printf)窗口,View - Serial Windows - Debug (printf) Viewer,如下圖所示:

程序運行之后,就會在printf窗口看到串口輸出的信息。

參考資料:
JLink_Windows_V614b軟件下載鏈接:JLink_Windows_V614b.exe
歷史精選文章:
- Jlink使用技巧之合並燒寫文件
- Jlink使用技巧之燒寫SPI Flash存儲芯片
- Jlink使用技巧之虛擬串口功能
- Jlink使用技巧之讀取STM32內部的程序
- Jlink使用技巧之單獨下載HEX文件到單片機
- Jlink使用技巧之J-Scope虛擬示波器功能
- 百度智能手環方案開源(含源碼,原理圖,APP,通信協議等)
- 如何在Keil-MDK開發環境生成Bin格式文件
- elf格式轉換為hex格式文件的兩種方法
- 個人博客添加網易雲音樂Flash插件
- 兩行代碼搞定博客訪問量統計
歡迎大家關注我的個人博客
或微信掃碼關注我的公眾號

