ARM trace32 内存调试命令调试方法教程.docx
- 文档编号:11213941
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:29
- 大小:35.45KB
ARM trace32 内存调试命令调试方法教程.docx
《ARM trace32 内存调试命令调试方法教程.docx》由会员分享,可在线阅读,更多相关《ARM trace32 内存调试命令调试方法教程.docx(29页珍藏版)》请在冰点文库上搜索。
ARMtrace32内存调试命令调试方法教程
ARMtrace32内存调试命令调试方法教程
1IEEEStandard1149.1-TestAccessPortandBoundary-ScanArchitecture
既然是介绍JTAG调试,还是让我们从IEEE的JTAG调试标准开始吧。
JTAG是JOINTTESTACTIONGROUP的简称。
IEEE1149.1标准就是由JTAG这个组织最初提出的,最终由IEEE批准并且标准化的。
所以,这个IEEE1149.1这个标准一般也俗称JTAG调试标准。
接下来的这一部分,主要简单的介绍了TAP(TESTACCESSPORT)和BOUNDARY-SCANARCHITECTURE的基本构架。
虽然不是很全面,但对了解JTAG的基本原理来说,应该是差不离了。
如果希望更全面深入的了解JTAG的工作原理,可以参考IEEE1149.1标准。
这篇文章主要介绍ARMJTAG调试的基本原理。
基本的内容包括了TAP(TESTACCESSPORT)和BOUNDARY-SCANARCHITECTURE的介绍,在此基础上,结合ARM7TDMI详细介绍了的JTAG调试原理。
这篇文章主要是总结了前段时间的一些心得体会,希望对想了解ARMJTAG调试的网友们有所帮助。
我个人对ARMJTAG的理解还不是很透彻,在文章中,难免会有偏失和不准确的地方,希望精通JTAG调试原理的大侠们不要拍砖,有什么问题提出来,我一定尽力纠正。
同时也欢迎对ARMJTAG调试感兴趣的朋友们一起交流学习
2-1边界扫描
在JTAG调试当中,边界扫描(Boundary-Scan)是一个很重要的概念。
边界扫描技术的基本思想是在靠近芯片的输入输出管脚上增加一个移位寄存器单元。
因为这些移位寄存器单元都分布在芯片的边界上(周围),所以被称为边界扫描寄存器(Boundary-ScanRegisterCell)。
当芯片处于调试状态的时候,这些边界扫描寄存器可以将芯片和外围的输入输出隔离开来。
通过这些边界扫描寄存器单元,可以实现对芯片输入输出信号的观察和控制。
对于芯片的输入管脚,可以通过与之相连的边界扫描寄存器单元把信号(数据)加载倒该管脚中去;对于芯片的输出管脚,也可以通过与之相连的边界扫描寄存器“捕获”(CAPTURE)该管脚上的输出信号。
在正常的运行状态下,这些边界扫描寄存器对芯片来说是透明的,所以正常的运行不会受到任何影响。
这样,边界扫描寄存器提供了一个便捷的方式用以观测和控制所需要调试的芯片。
另外,芯片输入输出管脚上的边界扫描(移位)寄存器单元可以相互连接起来,在芯片的周围形成一个边界扫描链(Boundary-ScanChain)。
一般的芯片都会提供几条独立的边界扫描链,用来实现完整的测试功能。
边界扫描链可以串行的输入和输出,通过相应的时钟信号和控制信号,就可以方便的观察和控制处在调试状态下的芯片。
利用边界扫描链可以实现对芯片的输入输出进行观察和控制。
下一个问题是:
如何来管理和使用这些边界扫描链?
对边界扫描链的控制主要是通过TAP(TestAccessPort)Controller来完成的。
在下一个小节,我们一起来看看TAP是如何工作的。
2-2TAP(TESTACCESSPORT)
在上一节,我们已经简单介绍了边界扫描链,而且也了解了一般的芯片都会提供几条边界扫描链,用来实现完整的测试功能。
下面,我将逐步介绍如何实现扫描链的控制和访问。
TWENTYONETWENTYONECN@HOTMAIL.COMHTTP:
//TWENTYONE.BLOGCHINA.COM1OPEN-JTAG
在IEEE1149.1标准里面,寄存器被分为两大类:
数据寄存器(DR-DataRegister)和指令寄存器(IR-InstructionRegister)。
边界扫描链属于数据寄存器中很重要的一种。
边界扫描链用来实现对芯片的输入输出的观察和控制。
而指令寄存器用来实现对数据寄存器的控制,例如:
在芯片提供的所有边界扫描链中,选择一条指定的边界扫描链作为当前的目标扫描链,并作为访问对象。
下面,让我们从TAP(TestAccessPort)开始。
TAP是一个通用的端口,通过TAP可以访问芯片提供的所有数据寄存器(DR)和指令寄存器(IR)。
对整个TAP的控制是通过TAPController来完成的。
TAP总共包括5个信号接口TCK、TMS、TDI、TDO和TRST:
其中4个是输入信号接口和另外1个是输出信号接口。
一般,我们见到的开发板上都有一个JTAG接口,该JTAG接口的主要信号接口就是这5个。
下面,我先分别介绍这个5个接口信号及其作用。
TestClockInput(TCK)
TCK为TAP的操作提供了一个独立的、基本的时钟信号,TAP的所有操作都是通过这个时钟信号来驱动的。
TCK在IEEE1149.1标准里是强制要求的。
TestModeSelectionInput(TMS)
TMS信号用来控制TAP状态机的转换。
通过TMS信号,可以控制TAP在不同的状态间相互转换。
TMS信号在TCK的上升沿有效。
TMS在IEEE1149.1标准里是强制要求的。
TestDataInput(TDI)
TDI是数据输入的接口。
所有要输入到特定寄存器的数据都是通过TDI接口一位一位串行输入的(由TCK驱动)。
TDI在IEEE1149.1标准里是强制要求的。
TestDataOutput(TDO)
TDO是数据输出的接口。
所有要从特定的寄存器中输出的数据都是通过TDO接口一位一位串行输出的(由TCK驱动)。
TDO在IEEE1149.1标准里是强制要求的。
TestResetInput(TRST)
TRST可以用来对TAPController进行复位(初始化)。
不过这个信号接口在IEEE1149.1标准里是可选的,并不是强制要求的。
因为通过TMS也可以对TAPController进行复位(初始化)。
事实上,通过TAP接口,对数据寄存器(DR)进行访问的一般过程是:
通过指令寄存器(IR),选定一个需要访问的数据寄存器;
把选定的数据寄存器连接到TDI和TDO之间;
由TCK驱动,通过TDI,把需要的数据输入到选定的数据寄存器当中去;同时把选定的数据寄存器中的数据通过TDO读出来。
接下来,让我们一起来了解一下TAP的状态机。
TAP的状态机如图1所示,总共有16个状态。
在图中,每个六边形表示一个状态,六边形中标有该状态的名称和标识代码。
图中的箭头表示了TAPController内部所有可能的状态转换流程。
状态的转换是由TMS控制的,所以在每个箭头上有标有tms=0或者tms=1。
在TCK的驱动下,从当前状态到下一个状态的转换是由TMS信号决定。
假设TAPController的当前状态为Select-DR-Scan,在TCK的驱动下,如果TMS=0,TAPController进入Capture-DR状态;如果TMS=1,TAPController进入Select-IR-Scan状态。
TWENTYONETWENTYONECN@HOTMAIL.COMHTTP:
//TWENTYONE.BLOGCHINA.COM2OPEN-JTAG
图1.TAPControllerStateTransitions
这个状态机看似很复杂,其实理解以后会发现这个状态机其实很直接、很简单。
观察图1,我们可以发现,除了Test-LogicReset和Test-Run/Idle状态外,其他的状态有些类似。
例如Select-DR-Scan和Select-IR-Scan对应,Capture-DR和Capture-IR对应,Shift-DR和Shift-IR对应,等等。
在这些对应的状态中,DR表示DataRegister,IR表示InstructionRegister。
记得我们前面说过吗,寄存器分为两大类,数据寄存器和指令寄存器。
其实标识有DR的这些状态是用来访问数据寄存器的,而标识有IR的这些状态是用来访问指令寄存器的。
在详细描述整个状态机中的每一个状态之前,首先让我们来想一想:
要通过边界扫描链来观察和控制芯片的输入和输出,需要做些什么?
如果需要捕获芯片某个管脚上的输出,首先需要把该管脚上的输出装载到边界扫描链的寄存器单元里去,然后通过TDO输出,这样我们就可以从TDO上得到相应管脚上的输出信号。
如果要在芯片的某个管脚上加载一个特定的信号,则首先需要通过TDI把期望的信号移位到与相应管脚相连的边界扫描链的寄存器单元里去,然后把该寄存器单元的值加载到相应的芯片管脚。
下面,让我们一起来看看每个状态具体表示什么意思?
完成什么功能?
Test-LogicReset
系统上电后,TAPController自动进入该状态。
在该状态下,测试部分的逻辑电路全部被
TWENTYONETWENTYONECN@HOTMAIL.COMHTTP:
//TWENTYONE.BLOGCHINA.COM3OPEN-JTAG
禁用,以保证芯片核心逻辑电路的正常工作。
通过TRST信号也可以对测试逻辑电路进行复位,使得TAPController进入Test-LogicReset状态。
前面我们说过TRST是可选的一个信号接口,这是因为在TMS上连续加5个TCK脉冲宽度的“1”信号也可以对测试逻辑电路进行复位,使得TAPController进入Test-LogicReset状态。
所以,在不提供TRST信号的情况下,也不会产生影响。
在该状态下,如果TMS一直保持为“1”,TAPController将保持在Test-LogicReset状态下;如果TMS由“1”变为“0”(在TCK的上升沿触发),将使TAPController进入Run-Test/Idle状态。
Run-Test/Idle
这个是TAPController在不同操作间的一个中间状态。
这个状态下的动作取决于当前指令寄存器中的指令。
有些指令会在该状态下执行一定的操作,而有些指令在该状态下不需要执行任何操作。
在该状态下,如果TMS一直保持为“0”,TAPController将一直保持在Run-Test/Idle状态下;如果TMS由“0”变为“1”(在TCK的上升沿触发),将使TAPController进入Select-DR-Scan状态。
Select-DR-Scan
这是一个临时的中间状态。
如果TMS为“0”(在TCK的上升沿触发),TAPController进入Capture-DR状态,后续的系列动作都将以数据寄存器作为操作对象;如果TMS为“1”(在TCK的上升沿触发),TAPController进入Select-IR-Scan状态。
Capture-DR
当TAPController在这个状态中,在TCK的上升沿,芯片输出管脚上的信号将被“捕获”到与之对应的数据寄存器的各个单元中去。
如果TMS为“0”(在TCK的上升沿触发),TAPController进入Shift-DR状态;如果TMS为“1”(在TCK的上升沿触发),TAPController进入Exit1-DR状态。
Shift-DR
在这个状态中,由TCK驱动,每一个时钟周期,被连接在TDI和TDO之间的数据寄存器将从TDI接收一位数据,同时通过TDO输出一位数据。
如果TMS为“0”(在TCK的上升沿触发),TAPController保持在Shift-DR状态;如果TMS为“1”(在TCK的上升沿触发),TAPController进入到Exit1-DR状态。
假设当前的数据寄存器的长度为4。
如果TMS保持为0,那在4个TCK时钟周期后,该数据寄存器中原来的4位数据(一般是在Capture-DR状态中捕获的数据)将从TDO输出来;同时该数据寄存器中的每个寄存器单元中将分别获得从TDI输入的4位新数据。
Update-DR
在Update-DR状态下,由TCK上升沿驱动,数据寄存器当中的数据将被加载到相应的芯片管脚上去,用以驱动芯片。
在该状态下,如果TMS为“0”,TAPController将回到Run-Test/Idle状态;如果TMS为“1”,TAPController将进入Select-DR-Scan状态。
Select-IR-Scan
这是一个临时的中间状态。
如果TMS为“0”(在TCK的上升沿触发),TAPController进入Capture-IR状态,后续的系列动作都将以指令寄存器作为操作对象;如果TMS为“1”(在TCK的上升沿触发),TAPController进入Test-LogicReset状态。
Capture-IR
当TAPController在这个状态中,在TCK的上升沿,一个特定的逻辑序列将被装载到指令寄存器中去。
如果TMS为“0”(在TCK的上升沿触发),TAPController进入Shift-IR状态;如果TMS为“1”(在TCK的上升沿触发),TAPController进入Exit1-IR状态。
Shift-IR
在这个状态中,由TCK驱动,每一个时钟周期,被连接在TDI和TDO之间的指令寄存
TWENTYONETWENTYONECN@HOTMAIL.COMHTTP:
//TWENTYONE.BLOGCHINA.COM4OPEN-JTAG
器将从TDI接收一位数据,同时通过TDO输出一位数据。
如果TMS为“0”(在TCK的上升沿触发),TAPController保持在Shift-IR状态;如果TMS为“1”(在TCK的上升沿触发),TAPController进入到Exit1-IR状态。
假设指令寄存器的长度为4。
如果TMS保持为0,那在4个TCK时钟周期后,指令寄存器中原来的4bit长的特定逻辑序列(在Capture-IR状态中捕获的特定逻辑序列)将从TDO输出来,该特定的逻辑序列可以用来判断操作是否正确;同时指令寄存器将获得从TDI输入的一个4bit长的新指令。
Update-IR
在这个状态中,在Shift-IR状态下输入的新指令将被用来更新指令寄存器。
说了那么多,下面,让我们先看看指令寄存器和数据寄存器访问的一般过程,以便建立一个直观的概念。
1.系统上电,TAPController进入Test-LogicReset状态,然后依次进入:
Run-Test/IdleSelect-DR-ScanSelect-IR-ScanCapture-IRShift-IRExit1-IRUpdate-IR,最后回到Run-Test/Idle状态。
在Capture-IR状态中,一个特定的逻辑序列被加载到指令寄存器当中;然后进入到Shift-IR状态。
在Shift-IR状态下,通过TCK的驱动,可以将一条特定的指令送到指令寄存器当中去。
每条指令都将确定一条相关的数据寄存器。
然后从Shift-IRExit1-IRUpdate-IR。
在Update-IR状态,刚才输入到指令寄存器中的指令将用来更新指令寄存器。
最后,进入到Run-Test/Idle状态,指令生效,完成对指令寄存器的访问。
2.当前可以访问的数据寄存器由指令寄存器中的当前指令决定。
要访问由刚才的指令选定的数据寄存器,需要以Run-Test/Idle为起点,依次进入Select-DR-ScanCapture-DRShift-DRExit1-DRUpdate-DR,最后回到Run-Test/Idle状态。
在这个过程当中,被当前指令选定的数据寄存器会被连接在TDI和TDO之间。
通过TDI和TDO,就可以将新的数据加载到数据寄存器当中去,同时,也可以捕获数据寄存器中的数据。
具体过程如下。
在Capture-DR状态中,由TCK的驱动,芯片管脚上的输出信号会被“捕获”到相应的边界扫描寄存器单元中去。
这样,当前的数据寄存器当中就记录了芯片相应管脚上的输出信号。
接下来从Capture-DR进入到Shift-DR状态中去。
在Shift-DR状态中,由TCK驱动,在每一个时钟周期内,一位新的数据可以通过TDI串行输入到数据寄存器当中去,同时,数据寄存器可以通过TDO串行输出一位先前捕获的数据。
在经过与数据寄存器长度相同的时钟周期后,就可以完成新信号的输入和捕获数据的输出。
接下来通过Exit1-DR状态进入到Update-DR状态。
在Update-DR状态中,数据寄存器中的新数据被加载到与数据寄存器的每个寄存器单元相连的芯片管脚上去。
最后,回到Run-Test/Idle状态,完成对数据寄存器的访问。
上面描述的就是通过TAP对数据寄存器进行访问的一般流程。
会不会还是觉得很抽象?
让我们来看一个更直观的例子。
现在假设,TAPController现在处在Run-Test/Idle状态,指令寄存器当中已经成功的写入了一条新的指令,该指令选定的是一条长度为6的边界扫描链。
下面让我们来看看实际如何来访问这条边界扫描链。
图2所示的是测试芯片及其被当前指令选定的长度为6的边界扫描链。
由图2可以看出,当前选择的边界扫描链由6个边界扫描移位寄存器单元组成,并且被连接在TDI和TDO之间。
TCK时钟信号与每个边界扫描移位寄存器单元相连。
每个时钟周期可以驱动边界扫描链的数据由TDI到TDO的方向移动一位,这样,新的数据可以通过TDI输入一位,边界扫描链的数据可以通过TDO输出一位。
经过6个时钟周期,就可以完全更新边界扫描链里的数据,而且可以将边界扫描链里捕获的6位数据通过
TWENTYONETWENTYONECN@HOTMAIL.COMHTTP:
//TWENTYONE.BLOGCHINA.COM5OPEN-JTAG
TDO全部移出来。
图2.测试芯片及其当前选定的边界扫描链
图3表示了边界扫描链的访问过程。
图3.1表示了芯片和边界扫描链的初始化状态,在测试状态下,芯片的外部输入和输出被隔离开了,芯片的输入和输出可以通过相应的边界扫描链来观察和控制。
在图3.1中,扫描链里的每个移位寄存器单元的数据是不确定的,所以在图中用X表示,整个扫描链里的数据序列是XXXXXX。
要从TDI输入到测试芯片上的数据序列是:
101010.同时要从TDO得到芯片相应管脚上的状态。
现在TAPController从Run-Test/Idle状态经过Select-DR-Scan状态进入到Capture-DR状态,在Capture-DR状态当中,在一个TCK时钟的驱动下,芯片管脚上的信号状态全部被捕获到相应的边界扫描移位寄存器单元当中去,如图3.2所示。
从图3.2中我们可以看出,在进入Capture-DR状态后,经过一个TCK时钟周期,现在扫描链中的数据序列变成了:
111000.在数据捕获完成以后,从Capture-DR状态进入到Shift-DR状态。
在Shift-DR状态中,我们将通过6个TCK时钟周期来把新的数据序列(101010)通过TDI输入到边界扫描链当中去;同时,将边界扫描链中捕获的数据序列(111000)通过TDO输出来。
在进入到Shift-DR状态后,每经过一个TCK时钟驱动,边界扫描链从TDO输出一位数据;同时,从TDI接收一位新的数据。
图3.3所示的是在Shift-DR状态下,1个TCK时钟周期后的扫描链的变化。
图3.4所示的是在Shift-DR状态下,2个TCK时钟周期后的扫描链的变化。
此时,扫描链已经从TDI串行得到了两位新数据,从TDO也串行输出了两位数据。
在TCK时钟的驱动下,这个过程一直继续下去。
图3.5所示的是在经过6个TCK时钟周期以后扫描链的情况。
从图3.5中我们可以看到:
边界扫描链当中已经包含了新的数据序列:
101010.在TDO端,经过6个TCK时钟驱动以后,也接收到了在Capture-DR状态下捕获到的数据序列:
111000.到目前为止,虽然扫描链当中包含了新的数据序列:
101010,但测试芯片的管脚上的状态还是保持为:
111000.下一步,需要更新测试芯片相应管脚上的信号状态。
要实现更新,TAPController从Shift-DR状态,经过Exit1-DR状态,进入到Update-DR状态。
在Update-DR状态中,经过一个周期的TCK时钟驱动,边界扫描链中的新数据序列将被加载到测试芯片的相应管脚上去,如图3.6所示。
从图3.6可以看出,测试芯片的状态已经被更新,相应管脚上的状态序列已经从111000变为101010.最后从Update-DR状态回到Run-Test/Idle状态,完成对选定的边界扫描链的访问。
TWENTYONETWENTYONECN@HOTMAIL.COMHTTP:
//TWENTYONE.BLOGCHINA.COM6OPEN-JTAG
(1)初始化状态
(2)CAPTURE-DR
(3)SHIFT-DR+1TCK
TWENTYONETWENTYONECN@HOTMAIL.COMHTTP:
//TWENTYONE.BLOGCHINA.COM7OPEN-JTAG
(4)SHIFT-DR+2TCK
(5)SHIFT-DR+6TCK
(6)UPDATE-DR
图3.边界扫描链的访问过程
TWENTYONETWENTYONECN@HOTMAIL.COMHTTP:
//TWENTYONE.BLOGCHINA.COM8OPEN-JTAG
在看完上面这个例子以后,对TAPController的状态机应该大概了解了吧?
对如何访问边界扫描链应该也有个直观的概念了吧?
虽然上面的这个例子只是说明了如何访问边界扫描链,对其它的数据寄存器、指令寄存器的访问过程也是类似的。
要实现对指令寄存器的访问,不同的是TAPController必须经过不同的状态序列:
Run-Test/IdleSelect-DR-ScanSelect-IR-ScanCapture-IRShift-IRExit1-IRUpdate-IRRun-Test/Idle.
2-3指令寄存器、公共指令以及数据寄存器
在IEEE1149.1标准当中,规定了一些指令寄存器、公共指令和相关的一些数据寄存器。
对于特定的芯片而言,芯片厂商都一般都会在IEEE1149.1标准的基础上,扩充一些私有的指令和数据寄存器,以帮助在开发过程中进行进行方便的测试和调试。
在这一部分,我将简单介绍IEEE1149.1规定的一些常用的指令及其相关的寄存器。
与ARM7TDMI相关的私有指令和寄存器将在后面的部分专门介绍。
指令寄存器:
指令寄存器允许特定的指令被装载到指令寄存器当中,用来选择需要执行的测试,或者选择需要访问的测试数据寄存器。
每个支持JTAG调试的芯片必须包含一个指令寄存器。
BYPASS指令和Bypass寄存器:
Bypass寄存器是一个一位的移位寄存器,通过BYPASS指令,可以将bypass寄存器连接到TDI和TDO之间。
在不需要进行任何测试的时候,将bypass寄存器连接在TDI和TDO之间,在TDI和TDO之间提供一条长度最短的串行路径。
这样允许测试数据可以快速的通过当前的芯片送到开发板上别的芯片上去。
IDCODE指令和DeviceIdentification寄存器:
Deviceidentification寄存器中可以包括生产厂商的信息,部件号码,和器件的版本信息等。
使用IDCODE指令,就
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM trace32 内存调试命令调试方法教程 内存 调试 命令 方法 教程