在嵌入式系统开发中,JTAG(Joint Test Action Group)接口作为标准的调试接口,已经成为ARM处理器调试不可或缺的一部分。JTAG接口通过边界扫描技术,使开发者能够访问和控制处理器内部状态,实现代码调试、内存查看和寄存器修改等功能。然而,要充分发挥JTAG调试的优势,合理的复位信号设计至关重要。
ARM处理器通常配备两种复位信号:系统复位信号(如nRESET、BnRES或HRESET)和JTAG TAP控制器复位信号(nTRST)。系统复位信号负责重置整个处理器核心,而nTRST则专门用于重置JTAG调试逻辑。在实际应用中,许多开发者容易忽视这两种复位信号的区别,将它们简单地连接在一起,这种做法会导致调试过程中出现各种问题。
RealView ICE作为ARM官方调试工具,通过JTAG接口与目标系统通信,其稳定性和可靠性很大程度上取决于目标板上的复位电路设计。一个常见的误区是将nTRST与系统复位信号直接相连,这样当系统复位时,JTAG调试逻辑也会被重置,导致之前设置的断点丢失,调试会话中断。
系统复位信号是ARM处理器的主复位输入,不同型号的处理器可能使用不同的命名(nRESET、BnRES或HRESET),但其功能相同。这个信号有效时(通常为低电平),会将整个处理器核心重置到初始状态。系统复位可以由多种条件触发:
在电路设计中,系统复位信号通常由一个复位管理芯片(如MAX823)产生,该芯片监控电源电压,在电压不稳定时产生复位信号。此外,手动复位按钮也会连接到复位管理芯片,允许开发者手动触发系统复位。
nTRST是JTAG接口的专用复位信号,它只影响JTAG调试逻辑,包括:
与系统复位不同,nTRST通常只由JTAG调试器(如RealView ICE)控制,用于在调试会话开始时初始化JTAG状态机。在正常工作模式下,nTRST应保持无效状态(高电平),只有在需要重新初始化JTAG逻辑时才由调试器短暂激活。
重要提示:nTRST信号必须与系统复位信号分开处理。如果将它们连接在一起,系统复位会导致JTAG调试逻辑也被重置,这将中断正在进行的调试会话,并丢失所有已设置的断点。
RealView ICE通过JTAG接口提供两个复位信号与目标系统交互:
nTRST输出:驱动ARM处理器的nTRST信号。当RealView ICE软件需要重新初始化目标系统的调试接口时,会激活这个信号。这是一个单向输出信号,目标板上必须提供上拉电阻(推荐值4.7kΩ)。
nSRST信号:这是一个双向信号,既可以驱动目标系统的复位信号,也可以检测目标系统的复位状态。当调试器需要重置目标系统时,会将这个信号驱动为低电平。目标板上同样需要上拉电阻(推荐值4.7kΩ)。
RealView ICE内部对这两个信号的处理有所不同:
RealView ICE的复位信号驱动能力如下:
这种设计允许复位信号可以被其他源(如电源监控芯片或手动复位按钮)覆盖,实现"线或"(wire-OR)逻辑。当多个设备可以驱动同一个复位信号时,只要有一个设备将信号拉低,整个系统就会复位。
图1展示了一个基本的ARM处理器复位电路设计。这个设计中,系统复位(nRESET)和JTAG复位(nTRST)是独立处理的:
code复制+V
+V
+V
nReset1
PushButtonReset
PowerOnReset
TRST
System Reset to
other logic on board
BnRES or
nRESET or
HRESET
ARM
processor
nTRST
nTRST
nSRST
nTRST and nSRST pins on RealView ICE JTAG connector
15
3
Gnd
Gnd
关键设计要点:
对于更复杂的系统,建议使用专门的电源监控IC(如MAX823)来产生系统复位信号,如图2所示:
code复制ARM
processor
System Reset to
other logic on board
nSRST
nTRST
Push button
reset
Gnd
+V
3
15
MR
RESET
MR
RESET
MAX823
MAX823
BnRES or
nRESET or
HRESET
nTRST
nTRST and nSRST pins on RealView ICE JTAG connector
这种设计的优势包括:
除了复位信号外,JTAG接口的其他信号也需要适当的上拉或下拉电阻:
| 信号 | 要求 | 推荐电阻值 | 说明 |
|---|---|---|---|
| TMS | 上拉 | 10kΩ | 确保在没有连接时的稳定状态 |
| TDI | 上拉 | 10kΩ | 确保在没有连接时的稳定状态 |
| TDO | 上拉 | 10kΩ | 确保在没有连接时的稳定状态 |
| TCK | 下拉 | 10kΩ | 防止浮空导致意外时钟 |
| RTCK | 下拉 | 10kΩ | 用于非可综合核的调试 |
| DBGRQ | 下拉 | 10kΩ | 防止核心意外进入调试状态 |
| DBGACK | 下拉 | 10kΩ | 默认显示核心不在调试状态 |
为了确保JTAG信号的完整性,PCB布局应遵循以下原则:
当使用长电缆连接RealView ICE和目标板时,信号完整性可能成为问题。以下是几种解决方案:
对于短电缆连接:
对于中等长度电缆:
对于长距离调试:
问题现象:当目标系统复位时,调试会话中断,所有断点丢失。
原因分析:这通常是因为nTRST信号与系统复位信号连接在一起,导致系统复位时JTAG逻辑也被重置。
解决方案:
问题现象:RealView ICE报告"Target Not Present"错误。
可能原因:
排查步骤:
问题现象:在高TCK频率下,JTAG通信不稳定,出现错误。
解决方案:
自适应时钟(Adaptive clocking)是一种解决长电缆传播延迟的技术。在这种模式下:
要使用自适应时钟,目标处理器必须支持RTCK信号(如ARM966E-S等-S系列核心)。在电路设计上,需要:
对于包含多个JTAG设备的ASIC设计,可以采用以下两种方式连接TAP控制器:
内部串行链:
外部串行链:
如果使用JTAG边界扫描进行生产测试,可能需要:
这种混合方法可以在不增加专用测试引脚的情况下,提供生产测试所需的灵活性。
在实际项目中设计JTAG调试接口时,我总结了以下几点经验:
复位信号隔离:始终坚持将nTRST与系统复位信号分开处理。我曾经在一个项目中为了节省PCB空间将它们连接在一起,结果导致每次看门狗复位都会中断调试会话,大大降低了开发效率。
上拉电阻选择:虽然10kΩ是常见的上拉电阻值,但在驱动TTL逻辑或长电缆时,可能需要使用更低的值(如1kΩ)以确保信号质量。我曾经遇到过一个案例,使用10kΩ上拉导致TCK信号上升沿不够陡峭,在高频率下出现通信错误。
信号走线优化:将JTAG接头尽可能靠近处理器放置,并优先布线TCK和TMS信号。在一个高速设计中,TCK走线过长导致了信号反射,通过缩短走线并添加串联终端电阻解决了问题。
电源监控的重要性:不要依赖简单的RC电路作为复位源。使用专门的电源监控IC(如MAX823)可以大大提高系统可靠性。我曾经调试过一个现场故障,最终发现是简单的RC复位电路在低温环境下无法可靠工作。
测试所有调试功能:在PCB原型阶段,务必全面测试所有调试功能,包括:
早期发现并解决调试接口问题可以节省大量后期开发时间。