MAXQ微控制器提供的JTAG引導加載程序允許外部JTAG主站使用一組標準化命令輕松識別和編程任何MAXQ微控制器。本應用筆記中包含的代碼可用作構建功能齊全的JTAG引導加載程序主應用程序的起點。主控應用可以識別、初始化、加載和驗證任何支持標準化引導加載程序命令集的MAXQ微控制器的代碼和數據存儲器內容。
概述
MAXQ微控制器包括可重寫的板載程序存儲器,通常包括一個基于ROM的引導加載程序,該引導加載程序存儲器可以使用微控制器的JTAG兼容調試端口加載。盡管JTAG引導加載程序提供的確切功能因設備而異,但它通常包括允許讀取、寫入、驗證和擦除程序和數據存儲器的命令。一些器件提供引導加載程序的替代接口(如串行端口或SPI?接口),但JTAG接口最常使用有兩個原因。首先,JTAG接口必須已經存在,以支持在線調試功能。其次,JTAG接口通常不被最終用戶應用程序使用(與串行端口不同)。加載程序代碼后,可以使用可選的密碼機制來限制對引導加載程序或在線調試功能的訪問。有關每個MAXQ器件所支持功能的詳細信息,請參閱產品特定信息,包括數據資料和用戶指南。
本應用筆記介紹了為MAXQ2000實現JTAG引導加載程序主機所需的基本步驟。這些步驟包括與JTAG端口接口,與測試訪問端口(TAP)控制器通信,激活引導加載程序模式以及向基于ROM的引導加載程序發送命令。由于JTAG端口在所有MAXQ器件上工作原理相同,并且MAXQ自舉加載程序使用共享命令集,因此本應用筆記中介紹的大部分主題(以及大多數示例代碼)將適用于為任何MAXQ微控制器實現JTAG引導加載程序主機。
除串行端口外,MAXQ2000沒有特殊功能用于此實現。這意味著本文給出的示例代碼可以很容易地重新定位,以運行在任何具有足夠程序存儲器的MAXQ20器件上。代碼是用MAXQ匯編編寫的,并使用MAX-IDE開發環境進行編譯。該代碼可供下載。
硬件設置
本應用筆記的示例代碼是利用一對MAXQ2000評估(EV)板開發的。需要兩個MAXQ2000評估板來執行本文所述的軟件。一個MAXQ2000(JTAG主站)運行示例代碼;第二個MAXQ2000作為JTAG從站,由主站重新編程。兩個MAXQ8微控制器均采用標準00.2000MHz晶體。
主用MAXQ2000評估板經過修改,在原型設計區安裝一個2 x 5 引腳接頭,提供JTAG電纜連接的主端。接頭上的引腳遵循標準的MAXQ JTAG接頭布局,如表1所示進行連接。
JTAG針座引腳 | JTAG電纜功能 |
MAXQ2000 JTAG 主連接 |
MAXQ2000 JTAG 從機連接 |
1 | TCK (測試時鐘) | P0.0 (輸出) | P4.0 (輸入) |
2 | 接地 | 接地 | 接地 |
3 | TDO(測試數據輸出) | P0.1 (輸入) | P4.3 (輸出) |
4 | V裁判 | – | – |
5 | TMS(測試模式選擇) | P0.2 (輸出) | P4.2 (輸入) |
6 | n重置 | P0.4 (開漏) | n復位 (輸入) |
7 | 鍵控銷 | – | – |
8 | +5V | – | – |
9 | TDI (測試數據輸入) | P0.3 (輸出) | P4.1 (輸入) |
10 | 接地 | 接地 | 接地 |
從MAXQ2000評估板無需修改。如上所述,2 x 5 JTAG接頭安裝并連接在主MAXQ2000評估板的原型設計區域。然后連接兩個評估板;在主評估板原型區域的2 x 5 JTAG接頭和從評估板上的標準JTAG接頭(J2)之間連接了標準的5 x 4 JTAG電纜(通常用于將串行轉JTAG板連接到MAXQ評估板的JTAG類型)。該JTAG 2 x 5連接器包含在MAXQ2000評估板中。
為簡化起見,沒有嘗試通過JTAG電纜將電源或基準電壓從主評估板連接到從評估板。相反,兩個評估板設置為以相同的V工作。迪奧電壓(約3.6V)。這種設置確保MAXQ2000的主從器件在公共I/O軌電平下工作。
從評估板還將LCD子板(MAXQ2000-K01)安裝在接頭J3上。表2列出了兩塊板(以及串行轉JTAG板)的跳線和DIP開關設置。注意:所有未列出的跳線都應斷開連接。圖 1 顯示了最終設置。
板 | 開關或跳線 | 設置 | 筆記 |
串行轉JTAG板 | JH1 | 連接 | |
JH2 | 連接 | ||
JH3 | 連接 | 通過JTAG電纜提供5V電源 | |
主MAXQ2000評估板 | JU1 | 引腳 1 和 2 已連接 | 權力五DD采用 2.5V 電源 |
JU2 | 引腳 1 和 2 已連接 | 權力五迪奧采用 3.6V 電源 | |
JU3 | 引腳 1 和 2 已連接 | 權力五液晶顯示器采用 3.6V 電源 | |
JU4 | 連接 | 采用JTAG 5V電源為套件板供電 | |
DIP SW1 | 開關 #4 和 #8 打開;所有其他開關關閉 | 使串行端口 0 輸出到 J5 | |
DIP SW3 | 所有開關關閉 | ||
DIP SW6 | 所有開關關閉 | ||
從MAXQ2000評估板 | JU1 | Powers VDD from 2.5V supply | |
JU2 | 引腳 1 和 2 已連接 | Powers VDDIO from 3.6V supply | |
JU3 | 引腳 1 和 2 已連接 | Powers VLCD from 3.6V supply | |
DIP SW1 | 所有開關關閉 | ||
DIP SW3 | 所有開關關閉 | ||
DIP SW6 | 所有開關關閉 |
圖1.JTAG演示設置。
MAXQ JTAG接口
MAXQ微控制器上的JTAG接口由四條信號線組成,用于將信息移入和移出測試訪問端口(TAP)控制器。該TAP控制器提供對MAXQ自舉加載程序和在線調試功能的訪問。(請注意,實現調試主機雖然類似于實現引導加載程序主機,但超出了本應用筆記的范圍。四條JTAG信號線如表3所示。
JTAG信號 | 信號名稱 | 方向(主) | 方向(從屬) | 信號描述 |
TMS | 測試模式選擇 | 輸出 | 輸入 | 該信號線與TCK線一起用于將TAP控制器從一種工作狀態切換到另一種工作狀態。 |
TCK | 測試時鐘 | 輸出 | 輸入 | 該信號為JTAG接口提供時鐘。JTAG時鐘限制為從機時鐘頻率除以8的最大值。例如,如果從機以8MHz的時鐘頻率運行,則TCK的JTAG時鐘不能運行得超過1MHz。 |
TDI | 測試數據 | 輸出 | 輸入 | 該信號攜帶從主站發送到從站的數據。 |
統計局 | 測試數據輸出 | 輸入 | 輸出 | 該信號將從從站發送回主站的數據傳輸回主站。 |
從技術上講,nRESET引腳不是JTAG接口的一部分。它包含在JTAG電纜上,允許JTAG主機復位從機微控制器。復位從機微控制器是進入引導加載程序模式的必要步驟,如果JTAG通信意外中斷,復位也很有用。
由于JTAG接口是全雙工的,因此數據在TDI線路上從主站轉移到從機的同時,數據在TDO線路上從從機轉移到主站。從機在TCK的上升沿對輸入數據(在TDI和TMS上)進行采樣,并將傳出數據驅動到TCK下降沿TDO上的主站。對于傳入和傳出數據,值首先以最低有效位傳輸。
本應用筆記僅簡要概述JTAG接口和TAP控制器,以解釋示例代碼的操作。有關這些特性的更詳細討論,請參考MAXQ系列用戶指南的測試訪問端口(TAP)、在線調試模式和在系統編程部分。
與TAP控制器通信
TAP控制器圍繞狀態機構建,如下圖2所示。TAP 狀態機中包含 <> 個離散狀態。根據TMS信號的值,從一種狀態到另一種狀態的轉換發生在TCK的每個上升沿上。例如,如果TAP控制器處于選擇DR掃描狀態,并且TCK上出現上升沿:
如果TMS = 1,TAP控制器將轉換為選擇紅外掃描狀態。
如果 TMS = 0,TAP 控制器將轉換為捕獲 DR 狀態。
通過這種方式,可以將TAP控制器時鐘設置為任何所需狀態。關于下面的狀態圖(圖 2),有兩點需要注意:
無論啟動狀態如何,五個“1”轉換(保持TMS高電平和時鐘TCK五個完整周期)將始終使狀態機返回到測試-邏輯-復位狀態。這意味著,如果TAP控制器的當前狀態未知,或者JTAG主站和從站之間的通信以某種方式中斷,則始終可以通過時鐘進行五個“1”轉換,使TAP控制器恢復到已知狀態。
即使TCK時鐘繼續運行,也可以無限期地暫停JTAG通信并保持運行-測試-空閑、暫停-DR或暫停-IR狀態,而不會影響TAP控制器的狀態。
圖2.測試訪問端口 (TAP) 狀態機。
TAP控制器的狀態機提供對兩個控制寄存器的訪問,這兩個控制寄存器又提供引導加載程序的接口、調試接口和其他功能。
IR(指令寄存器)的寬度始終為三位。該寄存器充當索引寄存器,進而控制DR的功能(見下文)。
DR(數據寄存器)是TAP控制器內多個寄存器之一的接入點。當位移入或移出DR時,實際訪問的寄存器取決于IR的當前值。
圖3.在 TAP 控制器中注冊訪問權限。
如圖3所示(DR指向三個內部寄存器之一,具體取決于IR的值。
如果 IR = 011b,則 TAP 控制器處于旁路模式。在此模式下(這是 TAP 控制器的默認模式),轉移到 DR(通過 TDI)的數據只是通過 TDO 再次移出。通過TAP控制器傳輸的數據不會改變內部寄存器。
設置 IR = 100b 會將 TAP 控制器置于系統編程模式。在此模式下,移入DR的數據將移入3位系統編程寄存器。該寄存器(也可由MAXQ微存儲器作為ICDF寄存器的位[3:1]訪問)控制復位后MAXQ是進入正常程序執行模式還是引導加載程序模式。如果啟用了引導加載程序模式,它還控制引導加載程序將使用哪個接口(JTAG、串行或SPI)。
設置 IR = 010b 會將 TAP 控制器置于調試模式。在這種模式下,移入DR的數據被移入內部10位調試寄存器,引導加載程序可以讀取該寄存器。引導加載程序輸出的數據也通過此寄存器移出(以及兩個狀態位),并通過TDO從那里移出。該寄存器用于在引導加載程序和在線調試模式下傳輸數據。
在上面討論的三種模式中,旁路模式是“無操作”模式;它不提供對我們感興趣的引導加載程序函數的訪問。系統編程模式,盡管它的名字,實際上并不用于與引導加載程序通信,只是為了啟用對它的訪問。一旦引導加載程序處于活動狀態并正在通信,此 TAP 模式將不再有用。Debug 模式允許訪問 10 位輸入/輸出寄存器,是用于執行與引導加載程序的所有通信的模式。啟用引導加載程序后,TAP 控制器的此模式將獨占使用,直到加載程序會話完成。
控制JTAG端口和復位線
從機MAXQ2000上的JTAG/TAP端口的四條線(TMS、TCK、TDO和TDI)和nRESET線分別連接到主站MAXQ2000上的一個端口引腳。控制JTAG接口的第一步是正確配置這些線路。
#define TCK PO0.0 ; Test Clock - Master output #define TDO PI0.1 ; Test Data Out - Slave output, master input #define TMS PO0.2 ; Test Mode Sel - Master output #define TDI PO0.3 ; Test Data In - Master output #define RST PD0.4 ; Reset - Master open-drain output (on 1)
四條JTAG生產線在標準驅動模式下運行。從主機的角度來看,TMS、TCK和TDI將始終作為輸出驅動,而TDO(由從機驅動)將始終作為輸入驅動。JTAG線的方向是固定的,而不是雙向的。nRESET線路是一種特殊情況,配置為主端的漏極開路輸出。通常,從機會將自己的nRESET線拉高,因此主機應僅將線拉下(當從機復位時)或完全釋放(在所有其他時間)。主機沒有理由顯式驅動從機的nRESET線高電平。
;============================================================================== ;= ;= initializeJTAG ;= ;= Sets up the port pins for the JTAG interface. ;= ;= Inputs : None ;= Outputs : None ;= Destroys : None ;= initializeJTAG: move PD0.0, #1 ; TCK - master output move PO0.0, #1 ; Drive high move PD0.1, #0 ; TDO - master input move PO0.1, #1 ; Weak pullup on move PD0.2, #1 ; TMS - master output move PO0.2, #1 ; Drive low move PD0.3, #1 ; TDI - master output move PO0.3, #1 ; Drive high move PD0.4, #0 ; RST - open drain when 1, tristate when 0 move PO0.4, #0 ; Weak pullup off ret
初始化端口引腳后,時鐘0和時鐘1例程用于時鐘TMS線上的靜態0和1,以將TAP控制器從一個狀態推進到下一個狀態。JTAG時鐘可以以任何頻率驅動,只要JTAG時鐘速率保持在從機微控制器系統時鐘速率的1/8最大值以下即可。這里不需要考慮主站的系統時鐘速率;它不需要以任何方式與從站的系統時鐘速率匹配。主站可以比從站運行得更快或更慢,而不會引起JTAG通信問題。
由于本例中的從機MAXQ2000安裝了8MHz時鐘晶體,因此主機可以毫無問題地驅動高達1MHz的JTAG時鐘。在本例中,100kHz的JTAG時鐘速率就足夠了。
#define JCLOCK 40 ; 100kHz : (((10us / (1/8MHz)) / 2) ;============================================================================== ;= ;= clock0 ;= ;= Clocks a zero TMS bit into the JTAG interface. ;= ;= Inputs : None ;= Outputs : None ;= Destroys : LC[0] clock0: move TMS, #0 ; Drive TMS low move LC[0], #JCLOCK djnz LC[0], $ move TCK, #1 ; Clock rising edge move LC[0], #JCLOCK djnz LC[0], $ move TCK, #0 ; Clock falling edge move LC[0], #JCLOCK djnz LC[0], $ ret ;============================================================================== ;= ;= clock1 ;= ;= Clocks a one TMS bit into the JTAG interface. ;= ;= Inputs : None ;= Outputs : None ;= Destroys : LC[0] clock1: move TMS, #1 ; Drive TMS high move LC[0], #JCLOCK djnz LC[0], $ move TCK, #1 ; Clock rising edge move LC[0], #JCLOCK djnz LC[0], $ move TCK, #0 ; Clock falling edge move LC[0], #JCLOCK djnz LC[0], $ ret
有了這兩個例程,我們可以添加一個例程來初始化TAP控制器,方法是強制TAP控制器返回到測試邏輯復位狀態。請注意,測試邏輯重置狀態(顧名思義)執行 TAP 邏輯的完全重置,包括確定引導加載程序是否啟用以及引導加載程序正在使用哪個接口的位(SPE 和 PSS[1:0])。因此,一旦進入引導加載程序模式,將TAP控制器設置為測試-邏輯-復位將重置設備并退出引導加載程序模式。演示應用程序中使用的JTAG例程(testLogicReset本身除外)都假定TAP控制器在例程開始時處于運行-測試-空閑狀態。在JTAG通信例程中,TAP控制器將切換各種狀態;在例程結束時,TAP 控制器將始終返回到運行-測試-空閑狀態。
;============================================================================== ;= ;= testLogicReset ;= clock0, clock1 ;= ;= Resets the JTAG/TAP controller to its starting state. ;= ;= Inputs : None ;= Outputs : None ;= Destroys : LC[0] ;= testLogicReset: call clock1 call clock1 call clock1 call clock1 call clock1 call clock1 call clock1 call clock0 ; Brings us to Run-Test-Idle ret
寫入TAP指令寄存器
將值加載到 TAP 控制器的 IR 中是通過遍歷 TAP 狀態機向下移動到 Shift-IR 狀態并輸入新的 3 位值來完成的。在輸入 Update-IR 狀態之前,該值實際上不會從移位寄存器復制到指令寄存器。
與所有JTAG移位寄存器操作一樣,隨著新值的移入,寄存器的當前內容被移出(通過TDO)。但是,移出的值將始終是固定的(001b);這是JTAG標準強制要求的,用于測試JTAG接口的功能。
移入和移出任一移位寄存器(IR或DR)的過程是相同的;TAP 狀態機必須分別處于 Shift-IR 或 Shift-DR 狀態。輸入位(TDI處)由TAP控制器在每個TCK周期的上升沿采樣,而輸出位(TDO)在TCK周期的下降沿上被驅動。
;============================================================================== ;= ;= shift ;= ;= In a shift register state, clocks in a TDI bit and clocks out a TDO bit. ;= ;= Inputs : C - Bit to shift in to TDI. ;= Outputs : C - Bit shifted out from TDO. ;= Destroys : PSW, LC[0] ;= shift: jump C, shift_bit1 shift_bit0: move TDI, #0 ; Shift in zero bit jump shift_bitEnd shift_bit1: move TDI, #1 ; Shift in one bit jump shift_bitEnd shift_bitEnd: move LC[0], #JCLOCK djnz LC[0], $ move TCK, #1 ; Rising edge, TDI is sampled move LC[0], #JCLOCK djnz LC[0], $ move TCK, #0 ; Falling edge, TDO is driven out move LC[0], #JCLOCK djnz LC[0], $ move C, TDO ; Latch TDO value ret
對于傳輸中的每個位,除最后一位外,TMS必須保持低電平。這一點很重要,這樣,當每個位移入和移出時,狀態機將保持 Shift-IR 或 Shift-DR 狀態。在最后一個位周期,TMS必須被驅動為高電平,以便在最后一個位輸入和輸出時,TAP控制器將前進到Exit1-DR或Exit1-IR狀態。
例如,在表4中,JTAG主站將值100b(系統編程模式)移入IR寄存器。IR 寄存器開始編程為旁路值 011b;TAP 控制器以“運行-測試-空閑”狀態啟動。如下圖 4 所示,這些位從最低有效位開始,以最高有效位結束,移入(移出)TAP 控制器。因此,在第一個移位周期中,新值的位 0 移入,舊值的位 0 移出。
TCK | TMS | TDI | TDO | TAP State | 移位寄存器 | 指令寄存器 | ||||
位 2 | 位 1 | 位 0 | 位 2 | 位 1 | 位 0 | |||||
0 | 1 | x | x | Run-Test-Idle | x | x | x | 0 | 1 | 1 |
1 | 1 | x | x | Select-DR-Scan | x | x | x | 0 | 1 | 1 |
0 | 1 | x | x | Select-DR-Scan | x | x | x | 0 | 1 | 1 |
1 | 1 | x | x | Select-IR-Scan | x | x | x | 0 | 1 | 1 |
0 | 0 | x | x | Select-IR-Scan | x | x | x | 0 | 1 | 1 |
1 | 0 | x | x | Capture-IR | 0 | 0 | 1 | 0 | 1 | 1 |
0 | 0 | x | x | Capture-IR | 0 | 0 | 1 | 0 | 1 | 1 |
1 | 0 | x | x | Shift-IR | 0 | 0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | x | Shift-IR | 0 | 0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | x | Shift-IR | 0 | 0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 1 | Shift-IR | 0 | 0 | 0 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | Shift-IR | 0 | 0 | 0 | 0 | 1 | 1 |
0 | 1 | 1 | 0 | Shift-IR | 0 | 0 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 0 | Exit1-IR | 0 | 0 | 0 | 0 | 1 | 1 |
0 | 1 | x | 0 | Exit1-IR | 1 | 0 | 0 | 0 | 1 | 1 |
1 | 1 | x | 0 | Update-IR | 1 | 0 | 0 | 1 | 0 | 0 |
0 | 0 | x | x | Update-IR | 1 | 0 | 0 | 1 | 0 | 0 |
1 | 0 | x | x | Run-Test-Idle | x | x | x | 1 | 0 | 0 |
用于執行此操作的例程 shiftIR3 如下所示。
;============================================================================== ;= ;= shiftIR3 ;= clock0, clock1, shift ;= ;= Shifts a 3-bit value into the IR register. ;= ;= Inputs : A[0] - Low three bits contain value to shift into IR ;= Outputs : None ;= Destroys : AP, APC, A[0], PSW, LC[0] ;= shiftIR3: move APC, #80h ; Acc => A[0], turn off auto inc/dec call clock1 ; (Select DR Scan) call clock1 ; (Select IR Scan) call clock0 ; (Capture IR - loads 001b to shift register) call clock0 ; (Shift IR) move TMS, #0 ; Drive TMS low move C, TDO ; xxxxx210 c = s rrc ; sxxxxx21 c = 0 call shift ; Shift in IR bit 0 rrc ; ssxxxxx2 c = 1 call shift ; Shift in IR bit 1 rrc ; sssxxxxx c = 2 move TMS, #1 ; Drive TMS high for last bit call shift ; Shift in IR bit 2 (Exit1 IR) call clock1 ; (Update IR) call clock0 ; (Run Test Idle) ret
寫入TAP數據寄存器
將值移入和移出TAP控制器的DR的方式與IR的加載/卸載類似。通常,僅當 IR 設置為以下兩個值之一時,才會執行此操作:100b(將 TAP 控制器置于系統編程模式)或 010b(將 TAP 控制器置于調試模式)。
當系統編程模式處于活動狀態時,加載和卸載 DR 寄存器的操作如下。
進出DR寄存器的移位寬度為3位。所有三位都表示有效數據。
當達到 Update-DR 狀態時,傳輸到 DR 寄存器的值將復制到從屬微控制器的內部系統編程寄存器中。這三個位的使用方式如下。
從機微控制器可訪問(讀/寫)位0作為寄存器位ICDF.1(SPE),也稱為系統程序使能位。復位后由實用程序ROM檢查此位,以確定是否應進入引導加載程序模式(SPE = 1)或正常程序執行模式(SPE = 0)。
位 1 和 2 可由從機微控制器作為寄存器位 ICDF.2-3 (PSS0-PSS1) 訪問(讀/寫),也稱為編程源選擇位。在支持多個引導加載程序接口的微控制器上,如MAXQ2000,這些位用于選擇當SPE = 1時激活哪個引導加載程序接口。當SPE = 0(正常程序執行模式)時,這些位的設置不起作用。
從 DR 寄存器傳出的值是系統編程寄存器的先前值(進入 Capture-DR 狀態時鎖存到移位寄存器中)。
當調試模式處于活動狀態時,加載和卸載 DR 寄存器的操作如下。
進出DR寄存器的移入寬度為10位。對于移出的數據,所有 10 位表示有效數據(<> 個數據位和 <> 個狀態位)。對于移入的數據,僅使用八個數據位的值;不使用這兩個狀態位。
然后,作為引導加載程序命令的一部分,將移入 DR 寄存器的值的高八位被卸載并由引導加載程序(從實用程序 ROM 運行)讀取。
從 DR 寄存器移出的 10 位值由引導加載程序加載的 8 位值(作為命令輸出的一部分)和 TAP 控制器設置的兩位狀態信息組成。
;============================================================================== ;= ;= shiftDR3 ;= ;= Shifts a 3-bit value into the DR register. This operation should only be ;= performed when IR =100b (System Programming Mode). ;= ;= Inputs : A[0] - Low 3 bits contain value to shift into SPB (PSS1:PSS0:SPE) ;= Outputs : None ;= Destroys : AP, APC, A[0], PSW, LC[0] shiftDR3: move APC, #80h ; Acc => A[0], turn off auto inc/dec call clock1 ; (Select DR Scan) call clock0 ; (Capture DR) call clock0 ; (Shift DR) move TMS, #0 ; Drive TMS low move C, TDO ; xxxxx210 c = s rrc ; sxxxxx21 c = 0 call shift ; Shift in DR bit 0 rrc ; ssxxxxx2 c = 1 call shift ; Shift in DR bit 1 rrc ; sssxxxxx c = 2 move TMS, #1 ; Drive TMS high for last bit call shift ; Shift in DR bit 2 (Exit1 DR) call clock1 ; (Update DR) call clock0 ; (Run Test Idle) ret ;============================================================================== ;= ;= shiftDR ;= clock0, clock1, shift ;= ;= Shifts a 10-bit value into and out of the DR register. This operation ;= should only be performed when IR = 010b (Debug/Loader Mode). ;= ;= Inputs : A[0] - Byte value (input) to shift into DR ;= Outputs : A[0] - Byte value (output) shifted out of DR ;= A[1] - Low two bits are status bits 1:0 shifted out of DR ;= A[15] - Byte value shifted in, cached for use by shiftDR_next ;= Destroys : AP, APC, PSW, LC[0] shiftDR: move APC, #80h ; Acc => A[0], turn off auto inc/dec move A[15], A[0] ; Cache input byte value for use by shiftDR_next sla2 ; Add two empty bits (for status) call clock1 ; (Select DR Scan) call clock0 ; (Capture DR) call clock0 ; (Shift DR) move TMS, #0 ; Drive TMS low move C, TDO ; xxxxxxxx76543210 c = s rrc call shift ; Shift in DR bit 0 rrc call shift ; Shift in DR bit 1 rrc call shift ; Shift in DR bit 2 rrc call shift ; Shift in DR bit 3 rrc call shift ; Shift in DR bit 4 rrc call shift ; Shift in DR bit 5 rrc call shift ; Shift in DR bit 6 rrc call shift ; Shift in DR bit 7 rrc call shift ; Shift in DR bit 8 rrc move TMS, #1 ; Drive TMS high for last bit call shift ; Shift in DR bit 9 (Exit1 DR) call clock1 ; (Update DR) call clock0 ; (Run Test Idle) push Acc ; sddd dddd 10xx xxxx sra4 ; ssss sddd dddd 10xx sra2 ; ssss sssd dddd dd10 and #0003h ; ---- ---- ---- --10 move A[1], Acc ; Return status bits only in A[1] pop Acc and #0FF00h xch ; Return data bits only in A[0] ret
進入JTAG引導加載程序模式
將MAXQ2000置于JTAG引導加載程序模式需要以下步驟。
初始化 TAP 控制器,將其重置為測試-邏輯-復位狀態。
將指令寄存器 (IR) 設置為 100b 以啟用系統編程模式。
將數據寄存器 (DR) 設置為 001b。這將 SPE(系統編程啟用)位設置為 1 以啟用引導加載程序,并將 PSS[1:0](編程源選擇)位設置為 00b 以選擇 JTAG 接口。
保持低電平復位可復位MAXQ2000。
釋放重置。這導致MAXQ2000向矢量到實用程序ROM (8000h)中的標準復位點。然后,實用程序ROM代碼將檢查SPE和PSS位的值,并相應地激活JTAG引導加載程序。此時,引導加載程序正在運行并準備接受JTAG命令。
將指令寄存器 (IR) 設置為 010b 以啟用調試模式。這是用于與JTAG引導加載程序或調試引擎通信的模式;在這種情況下,我們將使用此模式與引導加載程序進行通信。
通過DR移動10位值,開始向JTAG引導加載程序發送命令。
#define IR_DEBUG 010b ; Debug Mode #define IR_BYPASS 011b ; Bypass Mode (default) #define IR_SYSTEM_PROG 100b ; System Programming Mode (activate loader) ; System Programming Register settings #define SP_EXECUTE 000b ; Bootloader disabled #define SP_LOAD_JTAG 001b ; Activate JTAG bootloader #define SP_LOAD_UART 011b ; Activate UART bootloader #define SP_LOAD_SPI 101b ; Activate SPI bootloader (invalid on 2000) #define SP_RESERVED 111b ; Reserved value ... call initializeJTAG ; Set up port pins for JTAG call testLogicReset ; Reset JTAG port (ending state: Run-Test-Idle) move Acc, #IR_SYSTEM_PROG call shiftIR3 ; Load the System Programming instruction into IR move Acc, #SP_LOAD_JTAG call shiftDR3 ; Enable the bootloader in JTAG interface mode move RST, #1 ; Drive nRESET low move Acc, #100 ; Delay for 100ms call delayMS call clock0 ; Remain in Run-Test-Idle move RST, #0 ; Release nRESET move Acc, #100 ; Delay for 100ms call delayMS move Acc, #IR_DEBUG call shiftIR3 ; Enable access to the 10-bit debug shift register ;;;; Bootloader commands may now be shifted through the DR register call waitForPrompt ; Verify that the bootloader is responding ...
與引導加載程序通信
引導加載程序運行后,實用程序 ROM 中的引導加載程序代碼將從從 DR 移位寄存器加載的內部寄存器讀取命令代碼。實用程序ROM還將結果數據寫入另一個內部寄存器,該寄存器可由JTAG主站通過DR寄存器移出。這樣,引導加載程序代碼和JTAG主站就可以交換信息。
但是,引導加載程序代碼和JTAG主站并不同步。只要JTAG時鐘的速率保持在MAXQ系統時鐘的最大值1/8以下,兩個時鐘的確切值對于通信目的無關緊要,因為JTAG是一個同步接口。但是,MAXQ系統時鐘速率和收到的引導加載程序命令的性質將決定引導加載程序接收命令和發送回復之間的延遲時間。例如,工作在2000MHz的MAXQ1比工作在2000MHz的MAXQ10需要更長的時間來響應給定的引導加載程序命令,即使兩個微控制器都可以使用100kHz的JTAG時鐘進行通信。僅讀取和返回信息的命令(例如返回ROM橫幅ID或從程序存儲器讀取的命令)也比包含諸如編程閃存等操作的命令花費更少的時間。
通過JTAG接口傳輸的數據不緩沖。如果在讀取上一個命令之前發送另一個 10 位命令,則前一個命令的結果將丟失。ROM代碼和TAP控制器確保在JTAG主站卸載先前的數據之前,引導加載程序不會發送額外的數據,但也需要反向同步。JTAG主站需要一種方法來判斷它轉移到DR中的前一個字節是否已被引導加載程序讀取。通過這種方式,JTAG主站可以知道何時發送下一個字節。知道這一點的方法源自 TAP 控制器通過引導加載程序的每個 8 位字節輸出發送的兩個附加狀態位。
圖4.通過 DR 傳輸數據和狀態位。
如上圖4所示,在TAP調試模式下移入和移出DR的數據由2個數據位(位9至0)和1個狀態位(位<>和<>)組成。當JTAG主站移入數據時,僅使用<>個數據位。兩個狀態位(仍必須移入)不由TAP控制器使用,可以設置為零或任何其他值。
在從 TAP 控制器移出的 10 位值中,兩個狀態位提供有關引導加載程序或調試引擎狀態的信息。當引導加載程序運行時,通常只會遇到最后兩種狀態(調試繁忙或調試有效),因為其他兩種狀態值在引導加載程序模式下不會出現。(請參閱圖 4 中的狀態/條件。
如果狀態位設置為調試繁忙(10b)值,則引導加載程序尚未讀取由JTAG主站轉移到DR中的先前值。這也意味著移出的 8 位數據值毫無意義,因為引導加載程序尚未完成命令。當收到此值時,JTAG主站必須使用先前傳輸的字節值重新加載DR,以便引導加載程序可以訪問它。正確執行此操作的狀態序列如下所示。
在將最后一個位轉換為處于Shift-DR狀態的DR并轉換到Exit1-DR之后,JTAG主站應檢查這兩個狀態位。
如果收到“調試繁忙”值,請切換到暫停 DR 狀態,然后從那里轉換到 Exit2-DR,然后再次返回到 Shift-DR。重新加載以前的 DR 值(不是這次移動的值),然后通過 Exit1-DR 和 Update-DR,忽略第二次傳遞時的狀態位的值。
延遲一小段時間(取決于正在執行的命令),然后重試字節傳輸。
如果狀態位設置為調試有效 (11b) 值,則引導加載程序已讀取移入的最后一個字節并加載了回復字節。移出的 8 位值包含有效數據。
執行引導加載程序命令序列時,shiftDR 和 shiftDR_next 例程會自動執行此同步。應該為序列中的第一個字節調用 shiftDR 例程;為后續字節調用shiftDR_next。shiftDR_next例程的操作與 shiftDR 相同,只是它檢查兩個狀態位并在必要時如上所述重新傳輸前一個 DR 字節。sendCommand 例程將所有這些聯系在一起,并調用 shiftDR 和 shiftDR_next 來傳輸命令序列,根據需要延遲和重新發送字節,直到命令完成。
;============================================================================== ;= ;= sendCommand ;= ;= Transmits a loader command by shifting bytes through DR. ;= ;= Inputs : DP[0] - Points to area of RAM which stores input bytes ;= for command and which will be filled with output. ;= LC[1] - Number of bytes to transmit/receive ;= Outputs : C - Set on JTAG communication error ;= Destroys : AP, APC, A[0], A[1], A[2], A[15], PSW, LC[0] ;= sendCommand: move APC, #80h ; Acc => A[0], turn off auto inc/dec push LC[1] call waitForPrompt pop LC[1] jump C, sendCommand_fail move Acc, @DP[0] ; Read first byte to transmit call shiftDR push Acc move Acc, A[1] cmp #3 ; Should be valid status since we had a prompt pop Acc jump NE, sendCommand_fail move @DP[0], Acc ; Store first received byte move NUL, @DP[0]++ ; Increment data pointer djnz LC[1], sendCommand_loop jump sendCommand_pass sendCommand_loop: move A[2], #10 ; Number of retries allowed sendCommand_retry: move Acc, @DP[0] ; Get next byte to transmit call shiftDR_next push Acc move Acc, A[1] cmp #3 pop Acc jump NE, sendCommand_stall move @DP[0], Acc ; Store received byte move NUL, @DP[0]++ ; Increment data pointer djnz LC[1], sendCommand_loop jump sendCommand_pass sendCommand_stall: move LC[0], #8000 ; About a millisecond djnz LC[0], $ move Acc, A[2] sub #1 jump NZ, sendCommand_retry jump sendCommand_fail
引導加載程序提供的函數
MAXQ微控制器上的引導加載程序功能通常遵循共享模式,這意味著許多命令和狀態碼在器件之間是相同的。不同的設備可以實現引導加載程序命令集的不同子集,具體取決于其內部程序存儲器的結構和其他要求。具體細節請參考您正在使用的MAXQ微控制器的用戶指南補充。在這種情況下,請參考MAXQ2000用戶指南補充文件中“在系統編程”部分中的引導加載程序命令。
與其他MAXQ引導加載程序一樣,MAXQ2000引導加載程序提供的命令分為0到15的命令系列。每個命令都以命令字節開頭,該字節是命令系列(前四位)和特定于命令的數字(低四位)的組合,如表 5 所示。作為一般規則,Family 0命令本質上是信息性的,由所有設備實現;其他命令系列是可選的。要確定特定MAXQ器件支持的命令系列,請參考器件的文檔。族 0 命令 05h(獲取支持的命令)返回一個位掩碼,指示該引導加載程序支持哪些其他命令系列。
MAXQ2000支持的引導加載程序命令系列如下。
族 0 - 信息和狀態。該系列中的命令可用于獲取MAXQ器件的基本信息,包括ROM/引導加載程序的身份和版本、最新命令的結果(狀態碼)以及程序和數據存儲器的大小。該系列還包括主擦除命令,該命令可清除設備上的所有程序和數據存儲器。
族 1 - 荷載可變長度。該系列中的命令可用于加載程序(閃存)或數據(RAM)存儲器。
族 2 - 轉儲可變長度。該系列中的命令可用于讀取程序或數據存儲器的內容。
系列 3 - CRC 可變長度。該系列中的命令可用于獲取在指定的程序或數據存儲器范圍內計算的CRC-16值。
族 4 - 驗證可變長度。該系列中的命令可用于驗證指定范圍的程序或數據存儲器是否與JTAG主站提供的數據相匹配。
族 5 - 加載并驗證可變長度。此系列中的命令將“加載”和“驗證”命令的功能合并到一個命令中。
族 6 - 擦除可變長度。在MAXQ2000上,此命令可用于將指定區域的數據RAM清零。
族 7 - 擦除固定長度。在MAXQ2000上,該命令可用于擦除閃存程序存儲器的單個頁面,而不是使用主擦除命令一次擦除所有閃存。
一旦MAXQ微控制器上的TAP控制器被置于JTAG加載器模式(所有MAXQ微控制器的過程都相同),第一步就是確定加載器是否響應。執行此操作的最快方法是重復傳輸引導加載程序命令代碼 00h(無操作)。每個引導加載程序命令完成后,引導加載程序會以提示符(“>”或 3Eh)字節進行響應。如果傳輸 00h 導致 3Eh 回復,則引導加載程序正在運行并準備好接受命令。
識別JTAG從屬微控制器
引導加載程序啟動并運行后,下一步是識別從MAXQ微控制器。族 0 命令 0Dh(獲取 ID 信息)返回一個可變長度的 ASCII 字符串(零端接),用于標識設備和實用程序 ROM 版本。
我們的示例程序獲取此信息,然后將其打印到串行端口作為演示的一部分。用于執行此操作的例程是getBanner。
;============================================================================== ;= ;= getBanner ;= waitForPrompt ;= shiftDR ;= clock0, clock1, shift ;= ;= Executes command 0Dh to retrieve the ROM (device ID) banner and prints ;= the banner text out over the serial port. ;= ;= Inputs : None ;= Outputs : C - Set on JTAG communication error ;= Destroys : AP, APC, Acc, PSW, LC[0] ;= getBanner: call waitForPrompt jump C, getBanner_fail move Acc, #CMD_GET_ROM_BANNER call shiftDR move Acc, #00h call shiftDR getBanner_loop: move Acc, #00h call shiftDR cmp #0FFh ; The banner is ASCII, so receiving this character ; most likely indicates that the JTAG lines are ; floating high and that no device is connected jump E, getBanner_fail jump Z, getBanner_done call txChar jump getBanner_loop getBanner_done: call txNewline jump getBanner_pass getBanner_fail: move C, #1 ret getBanner_pass: move C, #0 ret
擦除程序內存
MAXQ2000中包含的閃存程序存儲器必須先擦除(設置為0FFFFh),然后才能編程。JTAG演示應用程序通過發送02h(主擦除)引導加載程序命令來擦除閃存,指示引導加載程序擦除所有程序和數據存儲器。此命令還會清除密碼鎖定位,從而啟用所有受支持的命令系列。
根據MAXQ器件的不同,此02h(主擦除)命令可能需要幾秒鐘才能完成。由于這是一個單字節命令,因此確定何時完成的最簡單方法是發送無操作 (00h) 命令,然后連續 1 毫秒延遲,直到引導加載程序返回 3Eh,指示命令完成。此方法在下面的 masterErase 例程中顯示。
;============================================================================== ;= ;= masterErase ;= ;= Executes command 02h (Master Erase) to clear all program and data memory. ;= ;= Inputs : None ;= Outputs : C - Set on JTAG communication error ;= Destroys : Acc, PSW, LC[0], LC[1] ;= masterErase: call waitForPrompt jump C, masterErase_fail move Acc, #CMD_MASTER_ERASE call shiftDR move Acc, #00h call shiftDR move LC[1], #5000 ; Number of retries before returning an error masterErase_loop: move Acc, #CMD_NOP call shiftDR cmp #3Eh jump E, masterErase_pass move LC[0], #8000 ; Delay for about a millisecond djnz LC[0], $ djnz LC[1], masterErase_loop masterErase_pass: move C, #0 ret masterErase_fail: move C, #1 ret
檢索狀態信息
在 MasterErase(或幾乎任何其他引導加載程序命令)完成后,可以使用 04h(獲取狀態)命令來確定命令是否成功完成。“獲取狀態”命令返回兩個字節的數據:一個字節包含狀態標志(指示密碼鎖定設置/取消設置、字/字節模式處于活動狀態以及其他信息),第二個字節是單字節狀態代碼。
如果最后一個命令成功完成,則狀態代碼始終為 00h(無錯誤)。非零狀態代碼表示錯誤。狀態碼的詳盡列表見MAXQ2000用戶指南補充程序;此處列出了一些常見的錯誤代碼。
01h/02h - 不支持系列/命令無效。這些錯誤代碼通常表示與JTAG主機的通信故障或對齊錯誤。如果JTAG主站發送的字節數多(或少)于引導加載程序對給定命令代碼的預期,則引導加載程序會將其中一個數據字節解釋為新命令的開始。
03h - 無密碼匹配。此錯誤代碼通常表示JTAG主站嘗試使用受密碼保護的命令(通常包括不在族0中的任何命令),而沒有先清除密碼鎖。如果JTAG主站訪問已將代碼加載到字地址0010h – 001Fh中的部分,則會發生此錯誤。在這種情況下,部件必須被主擦除,或者必須使用密碼匹配命令 (03h) 來解鎖部件。
05h - 驗證失敗。加載/驗證或驗證命令上的驗證步驟失敗。此錯誤可能發生在通信故障之后,或者也因為嘗試重新編程先前編程的閃存而沒有先擦除它。
將代碼加載到程序存儲器中
為了演示JTAG引導加載程序的功能,演示應用需要通過JTAG連接將代碼加載到從機MAXQ2000中。在此示例中,加載的代碼將是啟動 LCD 控制器并在 LCD 顯示屏上顯示 4 位數字的簡單例程。
加載到從機MAXQ2000的代碼基于以下簡單的演示項目。
org 0 ljump main org 20h main: move LCRA, #03E0h ; xxx0001111100000 ; 00 - DUTY : Static ; 0111 - FRM : Frame freq ; 1 - LCCS : HFClk / 128 ; 1 - LRIG : Ground VADJ ; 00000 - LRA : RADJ = Min move LCFG, #0F3h ; 1111xx11 ; 1111 - PCF : All segments enabled ; 1 - OPM : Normal operation ; 1 - DPE : Display enabled move LCD0, #LCD_CHAR_0 move LCD1, #LCD_CHAR_0 move LCD2, #LCD_CHAR_0 move LCD3, #LCD_CHAR_2 move LCD4, #00h sjump $
但是,由于我們從演示應用程序而不是硬編碼的十六進制文件加載代碼字節(就像使用 MTK 或 MAX-IDE 加載代碼時一樣),演示應用程序將根據用戶輸入修改加載的應用程序。
在加載代碼之前,JTAG通信演示應用程序首先指示用戶輸入一個4位十進制數,然后修改正在加載的應用程序,如下所示。
液晶屏上顯示的數字是用戶輸入的 4 位數字。
密碼區域的前四個字節(從字地址 010h 開始)被編程為用戶輸入的四個字符的 ASCII 值。
應用程序代碼由演示使用對引導加載程序命令 10h(加載代碼,可變長度)的三次調用來加載。此命令的參數包括:要加載的字節數(加載代碼內存時必須是偶數以確保單詞對齊);起始地址;當然,還有數據本身。MAXQ存儲器是小端存儲器,因此應用必須首先發送每個程序字的最低有效字節。
;;;; ;;;; First load - LJUMP 0020h at start of program memory ;;;; move DP[0], #0 move @DP[0], #CMD_LOAD_CODE_VARIABLE move @++DP[0], #4 ; Length - 4 bytes move @++DP[0], #00h ; AddrL (byte address 0000h) move @++DP[0], #00h ; AddrH move @++DP[0], #000h ; 00 0B 20 0C - ljump 0020h move @++DP[0], #00Bh move @++DP[0], #020h move @++DP[0], #00Ch move @++DP[0], #000h ; Padding move @++DP[0], #000h ; Padding move @++DP[0], #55h move LC[1], DP[0] move DP[0], #0 nop call sendCommand nop jump C, main_failJTAG call getStatus jump C, main_failJTAG move Acc, A[3] ; Check that loader status is 00h (no error) jump NZ, main_failStatus
其余兩個代碼內存塊以類似的方式加載。
驗證程序存儲器中的代碼
加載代碼后,有幾種方法可以驗證它是否正確加載。
不要使用“加載代碼可變長度”命令 (10h),而是使用“加載并驗證代碼可變長度”命令 (50h)。后一個命令將代碼加載操作與驗證步驟相結合。
或者,可以通過調用驗證代碼可變長度命令 (40h) 單獨執行驗證。
JTAG主機可以通過使用轉儲代碼變量長度(20h)來驗證加載的代碼是否與發送的數據匹配,而不是讓引導加載程序驗證加載的代碼。
從程序存儲器轉儲代碼
加載完所有代碼后,JTAG演示的最后一步是在單個塊中讀出所有代碼。此讀取是通過將轉儲代碼可變長度 (20h) 命令發送到引導加載程序來完成的。此命令的參數是要開始轉儲(讀取)的地址和要轉儲的字節數。請注意,與所有JTAG引導加載程序命令一樣,每個字節讀回都必須發送一個字節。因此,此命令需要大量零鍵盤字節,每個字節將從程序存儲器讀取一個。
;;;; ;;;; Dump program code ;;;; move DP[0], #str_dumpCodeVariable call txString move DP[0], #0 move @DP[0], #CMD_DUMP_CODE_VARIABLE move @++DP[0], #1 ; Indicates single byte length (<256 bytes) move @++DP[0], #00h ; AddrL (byte address 0000h) move @++DP[0], #00h ; AddrH move @++DP[0], #128 ; Length - 128 bytes move LC[1], #128 main_loop1: move @++DP[0], #00h djnz LC[1], main_loop1 move @++DP[0], #000h ; Padding move @++DP[0], #000h ; Padding move @++DP[0], #55h move LC[1], DP[0] move DP[0], #0 nop call sendCommand nop jump C, main_failJTAG call getStatus jump C, main_failJTAG move Acc, A[3] ; Check that loader status is 00h (no error) jump NZ, main_failStatus
JTAG演示應用程序在讀取這些代碼字節后,通過串行端口以十六進制格式輸出這些代碼字節。
退出引導加載程序
單字節系列 0 命令 01h(出口加載程序)使引導加載程序完成操作并退出,如下所示。
引導加載程序啟動內部復位,將 SPE 和 PSS 位清零并復位微控制器。
微控制器退出復位,并在8000h時開始在實用程序ROM中執行。
SPE 現在清除為零后,實用程序 ROM 代碼會導致執行跳轉到地址 0000h 處的用戶應用程序代碼的開頭。
由于出口加載程序命令會自動清除SPE和PSS位,并且由于隨后的復位將TAP控制器清除回旁路模式,因此JTAG主站無需執行這些操作中的任何一個。
;;;; ;;;; Exit loader mode and allow program code to execute ;;;; call waitForPrompt move Acc, #CMD_EXIT_LOADER call shiftDR move Acc, #00h call shiftDR move Acc, #00h call shiftDR move Acc, #00h call shiftDR
運行演示
運行JTAG引導加載程序演示需要以下硬件和軟件組件。
硬件
兩塊MAXQ2000評估板(MAXQ2000-K00 REV B);一個評估板作為MAXQ2000主評估板,另一個作為MAXQ2000從基板。
MAXQ2000 LCD子板 (MAXQ2000-K01 REV B)
兩根2×5JTAG接口電纜(包含在MAXQ2000評估板中)
串行轉JTAG接口板(MAXQJTAG-001 REV B)
DB9直通串行電纜
兩個 5V 穩壓 (±5%) 直流壁式電源,中心柱正極,CUI Inc. DPR050030-P6 或同等電源
兩個HC49US 8.00MHz晶體
2 × 5 個 0.100 英寸排針
軟件
JTAG演示軟件包
MAX-IDE開發環境MAXQ
用于MAXQ的微控制器工具包(MTK)
設置說明
如果尚未安裝MAX-IDE,請根據MAXQ2000評估板附帶的文檔下載并安裝。
如果尚未安裝MTK,請根據MAXQ2000評估板附帶的文檔下載并安裝。
將LCD子板連接到從機MAXQ3板上的接頭J2000,如上圖1所示。LCD子板應懸掛在MAXQ2000板的頂部。
在兩塊MAXQ8評估板上安裝00.2000MHz晶體(Y1)。
將2×5 JTAG接頭安裝在主MAXQ2000套件的原型設計區,引腳連接到主MAXQ2000引腳,如表1所示。
配置串行轉JTAG板和兩個MAXQ2000評估板上的跳線和DIP開關,如表2所示。
將 DB9 串行電纜從 PC 上的 COM1 端口連接到串行到 JTAG 板上的 J1。
將第一個5V電源連接到串行轉JTAG板上的J2。
將第二個5V電源連接到從MAXQ1評估板上的J2000。
將第一根JTAG電纜從串行轉JTAG板上的P2連接到主MAXQ4板上的J2000。紅線應通向兩個JTAG接頭上的引腳1。
將第二根JTAG電纜從主MAXQ2000板上的原型區JTAG接頭連接到從MAXQ4板上的J2000。紅線應通向兩個JTAG接頭上的引腳1。
編譯和加載JTAG演示
下載JTAG演示軟件包并將其解壓縮到工作目錄中。
啟動 MAX-IDE。
打開兩個 5V 電源的電源。
從菜單中選擇“項目打開項目”,然后選擇 maxqjtag.prj 項目文件將其打開。
從菜單中選擇“調試”。應顯示“生成成功”消息。
從菜單中選擇“調試”。應出現一系列“正在加載”消息,然后是“完成”。
從菜單中選擇“調試”。
關閉最大集成點。
關閉電源。
運行JTAG演示
關閉電源后,斷開DB9串行電纜與串行轉JTAG板的連接。
將DB9電纜連接到主MAXQ5套件板上的J2000。
啟動 MTK。在啟動對話框中選擇“啞終端”。
從菜單中選擇選項。在對話框中,將端口設置為 COM1,將速度設置為 9600 波特。
從菜單中選擇以 1 波特率的目標。
打開電源。
如果應用程序已加載并且所有內容都已正確連接,則以下文本(圖5)將通過串行端口輸出。
圖5.演示應用程序,串行端口提示符。
現在輸入一個 4 位十進制數;之后無需按回車鍵。演示應用程序將完成其剩余操作(主擦除、加載代碼和轉儲代碼),并將輸出結果以及從程序內存轉儲的字節的十六進制值,如圖 6 所示。
圖6.演示應用程序,串行端口輸出。
結論
通過使用一組標準化命令,MAXQ微控制器提供的JTAG引導加載程序允許外部JTAG主機輕松識別和編程任何MAXQ微控制器。本應用筆記中包含的代碼可作為構建功能齊全的JTAG引導加載程序主應用的起點,該應用能夠識別、初始化、加載和驗證任何支持標準化引導加載程序命令集的MAXQ微控制器的代碼和數據存儲器內容。
審核編輯:郭婷
-
微控制器
+關注
關注
48文章
7552瀏覽量
151423 -
JTAG
+關注
關注
6文章
400瀏覽量
71687 -
主機
+關注
關注
0文章
995瀏覽量
35130
發布評論請先 登錄
相關推薦
評論