天天看點

Jlink使用技巧之虛拟序列槽功能

前言

序列槽調試是單片機開發過程必不可少的一個功能,一般是使用一個UART-TTL的序列槽子產品來實作序列槽的功能,其實下載下傳調試使用的Jlink仿真器也可以實作序列槽調試的功能,本篇文章将介紹如何使用Jlink實作虛拟序列槽功能。

ITM簡介

Jlink使用技巧之虛拟序列槽功能

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調試功能,具體配置如下圖所示:

Jlink使用技巧之虛拟序列槽功能

5.确認硬體的連接配接方式。

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

Jlink使用技巧之虛拟序列槽功能

6.打開Debug(printf)視窗

進入Debug調試模式之後,調出Debug(printf)視窗,View - Serial Windows - Debug (printf) Viewer,如下圖所示:

Jlink使用技巧之虛拟序列槽功能

程式運作之後,就會在printf視窗看到序列槽輸出的資訊。

Jlink使用技巧之虛拟序列槽功能

參考資料:

Debug (printf) Viewer

JLink_Windows_V614b軟體下載下傳連結:

JLink_Windows_V614b.exe

曆史精選文章:

歡迎大家關注

我的個人部落格

或微信掃碼關注我的公衆号

Jlink使用技巧之虛拟序列槽功能