<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 牛人業(yè)話 > ARM菜鳥:JLINK與JTAG的區(qū)別

          ARM菜鳥:JLINK與JTAG的區(qū)別

          作者: 時間:2014-12-07 來源:網(wǎng)絡 收藏

            調(diào)試,要遵循的調(diào)試接口協(xié)議,就是其中的一種。當仿真時,IAR、KEIL、ADS等都有一個公共的調(diào)試接口,RDI就是其中的一種,那么我們?nèi)绾瓮瓿蒖DI-->調(diào)試協(xié)議()的轉(zhuǎn)換呢?有以下兩種做法:

          本文引用地址:http://www.ex-cimer.com/article/266438.htm

            1.在電腦上寫一個服務程序,把IAR、KEIL和ADS中的RDI命令解析成相關的協(xié)議,然后通后一個物理轉(zhuǎn)換接口(注意,這個轉(zhuǎn)換只是電氣 物理層上的轉(zhuǎn)換,就像RS232那樣的作用)發(fā)送你的的目標板。H-JTAG就是這樣的。H-JTAG的硬件就僅是一個物理電平的轉(zhuǎn)換接口,所以很簡單。 而電腦中裝的h-JTAG軟件就是前面說到的服務程序,負責協(xié)議轉(zhuǎn)換的。

            2.做一個板,用此板直接接收來自IAR、KEIL和ADS等軟件的調(diào)試命令,由此板做RDI->JTAG協(xié)議的轉(zhuǎn)換。然后與目標板通信,這就是的工作原理。

            由上可以看出H-JTAG由于是軟件作協(xié)議轉(zhuǎn)換的,所以速度較慢,但是硬件簡單。而第二種方法的一般帶一個強勁的CPU,作硬件協(xié)議轉(zhuǎn)換,把以硬件復雜,但速度快。

            JTAG的基本原理

            JTAG(JointTestActionGroup,聯(lián)合測試行動組)是一種國際標準測試協(xié)議(IEEE1149.1兼容)。標準的JTAG接口是4線——TMS、TCK、TDI、TDO,分別為模式選擇、時鐘、數(shù)據(jù)輸入和數(shù)據(jù)輸出線。

            JTAG的主要功能有兩種,或者說JTAG主要有兩大類:

            1)一類用于測試芯片的電氣特性,檢測芯片是否有問題;

            2)另一類用于Debug,對各類芯片以及其外圍設備進行調(diào)試;一個含有JTAGDebug接口模塊的CPU,只要時鐘正常,就可以通過JTAG接口訪問CPU的內(nèi)部寄存器、掛在CPU總線上的設備以及內(nèi)置模塊的寄存器。本文主要介紹的是Debug功能。

            JTAG原理分析

            簡單地說,JTAG的工作原理可以歸結(jié)為:在器件內(nèi)部定義一個TAP(TestAccessPort,測試訪問口),通過專用的JTAG測試工具對內(nèi)部節(jié)點進行測試和調(diào)試。首先介紹一下邊界掃描和TAP的基本概念和內(nèi)容。

            邊界掃描

            邊界掃描(Boundary-Scan)技術的基本思想是在靠近芯片的輸入/輸出引腳上增加一個移位寄存器單元,也就是邊界掃描寄存器(Boundary-ScanRegister)。

            當芯片處于調(diào)試狀態(tài)時,邊界掃描寄存器可以將芯片和外圍的輸入/輸出隔離開來。通過邊界掃描寄存器單元,可以實現(xiàn)對芯片輸入/輸出信號的觀察和控制。對 于芯片的輸入引腳,可以通過與之相連的邊界掃描寄存器單元把信號(數(shù)據(jù))加載到該引腳中去;對于芯片的輸出引腳,也可以通過與之相連的邊界掃描寄存器“捕 獲”該引腳上的輸出信號。在正常的運行狀態(tài)下,邊界掃描寄存器對芯片來說是透明的,所以正常的運行不會受到任何影響。這樣,邊界掃描寄存器提供了一種便捷 的方式用于觀測和控制所需調(diào)試的芯片。另外,芯片輸入/輸出引腳上的邊界掃描(移位)寄存器單元可以相互連接起來,在芯片的周圍形成一個邊界掃描鏈 (Boundary-ScanChain)。邊界掃描鏈可以串行地輸入和輸出,通過相應的時鐘信號和控制信號,就可以方便地觀察和控制處在調(diào)試狀態(tài)下的芯 片。

            測試訪問口TAP

            TAP(TestAccessPort)是一個通用的端口,通過TAP 可以訪問芯片提供的所有數(shù)據(jù)寄存器(DR)和指令寄存器(IR)。對整個TAP的控制是通過TAP控制器(TAPController)來完成的。下面先 分別介紹一下TAP的幾個接口信號及其作用。其中,前4個信號在IEEE1149.1標準里是強制要求的。

            TCK:時鐘信號,為TAP的操作提供了一個獨立的、基本的時鐘信號。

            TMS:模式選擇信號,用于控制TAP狀態(tài)機的轉(zhuǎn)換。

            TDI:數(shù)據(jù)輸入信號。

            TDO:數(shù)據(jù)輸出信號。

            TRST:復位信號,可以用來對TAPController進行復位(初始化)。這個信號接口在IEEE1149.1標準里并不是強制要求的,因為通過TMS也可以對TAPController進行復位。

            STCK:時鐘返回信號,在IEEE1149.1標準里非強制要求。

            簡單地說,PC機對目標板的調(diào)試就是通過TAP接口完成對相關數(shù)據(jù)寄存器(DR)和指令寄存器(IR)的訪問。

            系統(tǒng)上電后,TAPController首先進入Test-LogicReset狀態(tài),然后依次進入Run-Test/Idle、Selcct-DR- Scan、Select-IR-Scan、Capture-IR、Shift-IR、Exitl-IR、Update-IR狀態(tài),最后回到Run- Tcst/Idle狀態(tài)。在此過程中,狀態(tài)的轉(zhuǎn)移都是通過TCK信號進行驅(qū)動(上升沿),通過TMS信號對TAP的狀態(tài)進行選擇轉(zhuǎn)換的。其中,在 Capture-IR狀態(tài)下,一個特定的邏輯序列被加載到指令寄存器中;在Shift-IR狀態(tài)下,可以將一條特定的指令送到指令寄存器中;在 Update—IR狀態(tài)下,剛才輸入到指令寄存器中的指令將用來更新指令寄存器。最后,系統(tǒng)又回到Run—Test/Idle狀態(tài),指令生效,完成對指令 寄存器的訪問。當系統(tǒng)又返回到Run—Test/Idle狀態(tài)后,根據(jù)前面指令寄存器的內(nèi)容選定所需要的數(shù)據(jù)寄存器,開始執(zhí)行對數(shù)據(jù)寄存器的工作。其基本 原理與指令寄存器的訪問完全相同,依次為seIect—DR—Scan、Capture—DR、Shift—D、Exitl一DR、Update—DR, 最后回到Run-Tcst/Idle狀態(tài)。通過TDl和TDO,就可以將新的數(shù)據(jù)加載到數(shù)據(jù)寄存器中。經(jīng)過一個周期后,就可以捕獲數(shù)據(jù)寄存器中的數(shù)據(jù),完 成對與數(shù)據(jù)寄存器的每個寄存器單元相連的芯片引腳的數(shù)據(jù)更新,也完成了對數(shù)據(jù)寄存器的訪問。

            目前,市場上的JTAG接口有14引腳和20引腳兩種。其中,以20引腳為主流標準,但也有少數(shù)的目標板采用14引腳。經(jīng)過簡單的信號轉(zhuǎn)換后,可以將它們通用。

          可控硅相關文章:可控硅工作原理




          關鍵詞: ARM JLINK JTAG

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();