摘 要: 基于USB接口的仿真器,,提出了一種采用PHILIPS公司ARM7內核,、LPC2148為主控制器的設計方案,并給出了硬件電路設計,。利用本仿真器通過第三方軟件可以實現(xiàn)目標機的調試和在線編程,。硬件電路設計簡單,是取代并口方式仿真器的一種經(jīng)濟可行的方案,。
關鍵詞: ARM仿真器,;調試系統(tǒng);USB接口,;JTAG
基于JTAG仿真器的調試是目前ARM開發(fā)中采用最多的一種方式,。大多數(shù)ARM設計采用了片上JTAG接口,并將其作為測試,、調試方法的重要組成,。JTAG仿真器通過ARM芯片的JTAG邊界掃描口與ARM CPU核通信,實現(xiàn)了完全非插入式調試,,不使用片上資源,,不需要目標存儲器,不占用目標系統(tǒng)的任何端口,。由于JTAG調試的目標程序是在目標板上執(zhí)行,,使得仿真更加接近于目標硬件[1]。
目前針對嵌入式系統(tǒng)開發(fā)的調試工具品種繁多,,如ARM公司的AXD debugger軟件與Mutil-ICE仿真器等,。但是大部分嵌入式調試工具價格過高,因此設計實現(xiàn)一種速度快、性能穩(wěn)定,、價格低廉,、易于實現(xiàn)的ARM調試工具是十分必要的。
1 ARM JTAG調試原理
ARM典型的調試系統(tǒng)結構如圖1所示,。調試系統(tǒng)包括調試主機,、仿真器和調試目標,。
調試主機是一臺運行調試軟件(例如ADS)的計算機,。調試主機可以發(fā)出高層的調試命令,例如設置斷點,、訪問內存等[2],。
仿真器用來將調試主機發(fā)出的高層調試命令轉換為底層的ARM JTAG調試命令。因為目標機無法識別調試主機發(fā)送來的高級命令,,因此就需要仿真器將調試主機發(fā)出的高層調試命令轉換為底層的ARM JTAG調試命令[3],。在整個調試系統(tǒng)中起到重要的作用,其性能也決定了整個調試系統(tǒng)性能,。
2 方案設計
本文提出了一種采用PHILIPS公司的ARM7芯片LPC2148設計,,具有USB2.0通信方式、高速穩(wěn)定的ARM仿真器實現(xiàn)方案,,如圖2所示,。
守護進程接收從IDE集成開發(fā)環(huán)境發(fā)送來的調試命令,將其通過USB總線轉發(fā)到ARM仿真器,,ARM仿真器再將調試命令轉換成JTAG格式的信號并發(fā)送到I/O口,,從而控制調試目標執(zhí)行特定的操作,達到調試的目的,。同理,,從調試目標返回的數(shù)據(jù),先經(jīng)過ARM仿真器的譯碼,,再經(jīng)過守護進程返回到IDE開發(fā)環(huán)境,,從而形成一個完整的調試系統(tǒng)。
3 硬件電路設計
本設計的最大特點是采用了LPC2148作為主控芯片,。該芯片內部集成了ARM7TDMI-S微控制器和完全兼容USB2.0的設備控制器,,支持32個物理(16個邏輯)端點;支持控制,、批量,、中斷和同步端點;所有端點都有一個雙向的DMA通道,。因為芯片內部集成了USB控制器,,大大降低了電路板的設計難度和開發(fā)成本。其硬件電路框圖如圖3所示。
(1)本機JTAG調試電路
為了便于調試和燒寫程序,,將芯片LPC2148的JTAG接口接到一個20引腳的標準JTAG插口,。本設計中使用引腳P0.8、P0.9,、P0.10,、P0.12、P0.14作為外部JTAG接口,,盡量不用有其他接口功能的引腳,,如P0.11、P0.14接口與I2C接口SCL1,、SDA1功能復用,,以便于將來的硬件升級。為了增強帶負載能力,,使用一片74HC244芯片,,同時為了盡量兼容大部分ARM開發(fā)板上的不同JTAG插口,本設計提供了一個20引腳的JTAG插口和一個14引腳的JTAG插口,。
(2)USB電路(包括供電電路)
USB接口電路如圖4所示,。為了使LPC2148的軟件可以更靈活地控制USB設備與主機之間的連接,本接口電路使用P0.31(只能使用該引腳)來實現(xiàn)SoftConnect特性,。當P0.31輸出低電平時,,D+線通過電阻上拉到VDD3.3,通知USB主機:USB設備與其建立連接,;當P0.31輸出高電平時,,D+線斷開與VDD3.3的連接,通知USB主機:USB設備已經(jīng)斷開與USB主機的連接,。
Q1選用的是P溝道MOS管,,而不選用普通的PNP三極管,因為MOS管是電壓驅動型,,驅動電流幾乎為0,;而普通的PNP三極管是電流驅動,需要一定的驅動電流,。導通時,,P0.31_P17有可能被拉低,LPC2148要求該引腳在復位引腳為低電平期間不能被拉低,,否則JTAG口將被禁止,,因此必須選用P溝道的MOS管。LPC2148的P0.23引腳為USB設備控制器,,用于檢測USB總線是否插入檢測引腳[4],。
4 仿真器固件程序設計
仿真器LPC2148芯片中的固件程序實現(xiàn)的功能包括:通過USB與上位機軟件進行通信,,并將上位機發(fā)送過來的、經(jīng)過封裝的USB數(shù)據(jù)流轉換為JTAG信號,,并最終送到相應的引腳或者將相應引腳的數(shù)據(jù)經(jīng)過封裝后,,通過USB傳送到PC機中。圖5為應用程序的流程圖,。
主函數(shù)首先將作為JTAG接口使用的5個引腳設置成相應屬性,,并完成USB設備初始化,配置中斷向量,、開中斷,,然后進入無限循環(huán)函數(shù)。
無限循環(huán)函數(shù)首先處理USB事件,,如USB控制傳輸,、USB總線復位等。然后判斷標志位是否收到數(shù)據(jù),,如果未收到則繼續(xù)執(zhí)行無限循環(huán);如果收到了數(shù)據(jù),,則將數(shù)據(jù)從端點緩沖區(qū)讀出,,再交給數(shù)據(jù)處理函數(shù)處理。數(shù)據(jù)處理函數(shù)按照上位機程序對數(shù)據(jù)封裝方式進行解析,,根據(jù)解析的命令(讀取TDI,、寫TMS或TDO等),通過分支處理跳到相應的處理函數(shù),。在這個過程中如果上位機要讀取調試目標數(shù)據(jù),,可將相應的值按同樣格式進行封裝,然后通過USB發(fā)送到上位機,。數(shù)據(jù)封裝格式如圖6所示,。
C語言定義的命令碼如下:
#define UNKOWN_COMMAND 0x00 //未知指令
#define PORT_DIRECTION 0x01 //設置端口方向為輸入或輸出
#define PORT_SET 0x02 //將JTAG端口的引腳都設為高電平
#define PORT_GET 0x03 //讀JTAG端口的引腳數(shù)據(jù)
#define PORT_SETBIT 0x04 //設置JTAG端口的某一位為1,由DATA[0]中數(shù)據(jù)決定設置的具體位數(shù)
#define PORT_GETBIT 0x05 //讀取JTAG端口的某一位為1,,由DATA[0]中數(shù)據(jù)決定讀取的具體位數(shù)
#define WRITE_TDI 0x06 //寫TDI信號命令
#define READ_TDO 0x07 //讀TDO信號命令
#define WRITE_AND_READ 0x08 //讀寫指令,,對TDI寫一位,對TDO一位
#define WRITE_TMS 0x09 //寫TMS信號命令
#define WRITE_TMS_CHAIN 0x0A //寫TMS掃描鏈命令
本仿真器經(jīng)實際測試下載速度穩(wěn)定在30 KB/s左右,,具有單步,、全速、設置斷點(兩個硬斷點和無數(shù)軟斷點)等功能,。本文提出了一種具有硬件電路設計簡單,、價格低廉、調試速度快的ARM仿真器設計方案,,是取代傳統(tǒng)并口方式ARM仿真器的一種確實可行的方案,。
參考文獻
[1] 田澤.嵌入式系統(tǒng)開發(fā)與應用[M].北京:北京航空航天大學出版社,2004.
[2] 鄧春梅.嵌入式系統(tǒng)軟件仿真技術的研究與實現(xiàn)[D].成都:電子科技大學,2004.
[3] 楊晶箐.USB接口的邊界掃描測試控制器的設計與實現(xiàn)[D].成都:成都電子科技大學,,2006.
[4] 周立功,,張華.深入淺出ARM7-LPC213x/214x[M].北京:北京航空航天大學出版社,2005.