前言
序列槽調試是單片機開發過程必不可少的一個功能,一般是使用一個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視窗看到序列槽輸出的資訊。
參考資料:
Debug (printf) ViewerJLink_Windows_V614b軟體下載下傳連結:
JLink_Windows_V614b.exe曆史精選文章:
- Jlink使用技巧之虛拟序列槽功能
- Jlink使用技巧之讀取STM32内部的程式
- Jlink使用技巧之單獨下載下傳HEX檔案到單片機
- Jlink使用技巧之J-Scope虛拟示波器功能
- 百度智能手環方案開源(含源碼,原理圖,APP,通信協定等)
- 如何在Keil-MDK開發環境生成Bin格式檔案
- elf格式轉換為hex格式檔案的兩種方法
- 個人部落格添加網易雲音樂Flash插件
- 兩行代碼搞定部落格通路量統計
歡迎大家關注
我的個人部落格或微信掃碼關注我的公衆号