尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

嵌入式工程师必懂:JTAG调试接口原理、排查技巧与安全禁用

嵌入式工程师必懂:JTAG调试接口原理、排查技巧与安全禁用 做嵌入式这些年我越来越觉得JTAG像一门语言每一块芯片都在讲它调试器也在讲它但真正能流利“说”JATG的工程师并没有想象中那么多。很多次被人拉去救火现象无非是调试器连不上、程序烧不进去、板子变砖绕了一大圈根因都落在JTAG的几个细节上。这篇文章不打算做成IEEE 1149.1的翻译稿而是想从一个常年跟JTAG打交道的工程师视角把这门“语言”的语法、词汇、连线和那些坑讲透看完你至少能回答三个问题JTAG到底怎么工作连不上时怎么一步步定位怎么安全地关掉JTAG而不把自己锁死1. 重新认识JTAG它不是为调试而生的调试口1.1 从边界扫描测试说起很多人默认JTAG是“调试下载口”这其实是把结果当成了原因。JTAG标准IEEE 1149.1最初由联合测试行动组提出目的非常朴素电路板复杂了以后物理探针很难覆盖每一个芯片引脚尤其是BGA封装焊在板子上引脚在肚子底下想测开路短路根本无从下手。于是大家想了一个办法——在芯片每个IO引脚和内部逻辑之间串联一个移位寄存器单元外部通过专用测试接口把数据“扫”进去读出来就像给整块板子做了一次CT扫描。这套机制叫边界扫描它能让你不依赖物理探针只靠一根串行链路把所有引脚状态看清楚。所以JTAG名字里的“Test”才是它的本行。后来芯片厂商发现这套串行接口不仅能测引脚还能访问芯片内部调试逻辑于是把在线调试、Flash编程、熔丝配置这些功能全挂在了同一条链路上。这才有了我们今天熟悉的“JTAG下载器”“JTAG调试口”。1.2 今天的JTAG到底能干什么以我手头常用的几类芯片为例JTAG的能力可以分四层边界扫描测试用EXTEST、SAMPLE等指令读引脚电平做板级互连测试。产线ICT设备覆盖不到的地方就靠它补。在线调试读写内核寄存器、断点单步、查看内存这是ARM、RISC-V等内核最常用的调试通道。Flash编程通过JTAG把固件灌进Nor Flash、NAND Flash或者芯片内部FlashJTAG口因此成了烧录器的主力接口。安全控制读写选项字节、配置读保护等级、熔断JTAG本身。量产保护、防抄板都是在这一层做文章。这里想强调一个认知JTAG不只是一根线、一个连接器它是一套完整的串行协议状态机寄存器体系。理解这个体系才有资格说“会讲JTAG”。否则你只是会用软件点几个按钮一旦出问题连问题出在哪个环节都说不清。1.3 为什么“会用下载器”不等于“会JTAG”我见过不少工程师IDE里选好芯片型号点下载能烧进去就算完事。可一旦换了新板子、新芯片、新调试器各种怪问题就冒出来了要么提示找不到目标要么读IDCODE全FF要么烧一半报错。这些问题的根源往往不是软件设置错了一个复选框而是你对JTAG链路上的信号行为没有概念。打个比方你用微信发消息不需要懂TCP/IP但网络断了你要能判断是Wi-Fi问题、运营商问题还是对端关机。JTAG也一样图形化工具替你屏蔽了协议细节但它屏蔽不了物理世界的不确定性。所以我建议每个做嵌入式、做FPGA、做板级硬件的人都花点时间把JTAG的状态机和时序搞明白。这篇文章后面几章就是按这个思路展开的。2. JTAG的工作机制状态机是语法寄存器是词汇2.1 TAP状态机一次对话的完整流程JTAG的所有操作都离不开一个叫TAPTest Access Port测试访问端口的状态机。它有16个状态在TCK时钟沿到来时根据TMS引脚的电平跳转。你可以把它理解成两个人对话时的流程控制什么时候该听、什么时候该说、什么时候结束都由状态机决定。核心状态就五个其他都是过渡Test-Logic-Reset上电或复位后的默认状态此时JTAG逻辑不工作。Run-Test/Idle空闲状态等待指令。Shift-IR移入指令位。Shift-DR移入或移出数据位。Update-IR / Update-DR把移位寄存器里的内容锁存到实际指令寄存器或数据寄存器。想对一个芯片JTAG TAP做操作标准流程是进入Shift-IR把指令bit一位一位从TDI送进去然后Enter Shift-DR根据指令要求移入/移出数据。我用一个“读IDCODE”的典型TMS序列来演示这一串电平就是JTAG的“一句话”状态迁移段TMS序列说明Test-Logic-Reset - Run-Test/Idle0离开复位态Run-Test/Idle - Select-DR-Scan1进入扫描选择Select-DR-Scan - Select-IR-Scan1选择指令扫描Select-IR-Scan - Capture-IR0捕获当前指令状态Capture-IR - Shift-IR0进入移位Shift-IR移4位指令 - Exit1-IR1例如指令IDCODE1001最低位先送Exit1-IR - Update-IR1锁存指令Update-IR - Select-DR-Scan1转去数据扫描Select-DR-Scan - Capture-DR0捕获数据Capture-DR - Shift-DR0进入数据移位Shift-DR移32位 - Exit1-DR1读32位IDCODE最低位先出Exit1-DR - Update-DR1完成Update-DR - Run-Test/Idle0回空闲看见没有整段对话就是在IR和DR之间来回切换。只要TAP状态机卡住后面所有操作都会失败。这也是为什么JTAG连接不上时我会先看TCK上有没有时钟、TMS能不能把状态机推到Shift状态——那是在给JTAG“试音”。2.2 指令和数据寄存器JTAG的词汇表TAP状态机决定了“怎么说”指令寄存器决定“说什么”。标准里有一些必选指令厂商又各自扩展BYPASS旁路指令把当前芯片的数据寄存器旁路为1位让JTAG链快速穿过当前器件去访问链上其他器件。多片级联时特别重要。IDCODE读32位标识码包含版本号、厂商JEDEC编号、器件编号。调试器连不上时先读IDCODE也是最基本的探活手段。EXTEST外部测试捕获引脚输入状态同时向引脚输出指定电平用来测板级开路短路。SAMPLE/PRELOAD边采样边预装载不影响芯片正常运行常用于在线观测。厂商私有指令比如ARM的DPACC/APACC访问Debug Port和Access Port、FPGA的JPROGRAM/JSTART、Flash的编程指令等。数据寄存器则是跟着指令走的最简单的BYPASS寄存器只有1位IDCODE寄存器32位ARM调试的DP/AP寄存器33位带1位奇偶校验。你操作的是哪条指令就决定了移位寄存器链上有多少位。很多新手烧录失败其实就是指令和DR长度没对齐数据移错位了。2.3 为什么调试器能“认识”你的芯片调试器第一次连接一片未知芯片时做的事情和人类搭讪很像先发一个IDCODE指令从TDO收32位数据。这32位里包含了JEDEC厂商号、器件号、版本号调试器软件拿它和内置的芯片数据库比对对上了就自动加载对应的target配置。比对不上就报“Unknown target”或者“Cannot find IDCODE”。知道这个机制很多问题就有了排查方向。比如你连上一块板子调试器显示IDCODE全1或全0基本可以判断TDO线上没有有效数据——要么TAP没跑起来要么芯片根本没进入JTAG模式。如果IDCODE是另一个芯片的编号比如你手上明明是A品牌MCU读出来却是B品牌的说明你的TDI/TDO串到别的器件上了或者链上有多片芯片而你没有正确旁路前面的。这一章的内容建议配合逻辑分析仪实操一遍抓一次IDCODE读取全过程亲眼看看TMS怎么跳、TDI怎么进、TDO怎么出。一旦建立起这个“波形图像”以后排查JTAG问题你会比靠猜的人快十倍。3. 引脚定义与硬件连接从原理图到实物之间的坑3.1 标准四线加附件TCK、TMS、TDI、TDOJTAG最核心的信号其实只有四个TCK测试时钟由调试器输出给TAP状态机提供节拍。TMS测试模式选择由调试器输出决定状态机的跳转路径。TDI测试数据输入由调试器输出在TCK上升沿被目标采样。TDO测试数据输出由目标输出在TCK下降沿更新数据。这四根线是任何JTAG接口都跑不掉的。此外常见的还有TRST测试复位可选项、SRST系统复位可选项、VTREF参考电压用来检测目标板电平、RTCK返回时钟目标板时钟慢时让调试器自适应。选型时要记住一个原则TCK是时钟TMS/TDI在TCK沿采样TDO在另一个沿输出这保证了数据不会在同一个沿竞争。真正的JTAG设备对时序要求不算苛刻但如果你用杜邦线飞了20厘米还把TCK频率拉高到10MHz波形沿会变差出现概率性连接失败非常正常。3.2 常见的连接器封装不同ARM芯片、FPGA、CPUJTAG连接器长得不一样但信号本质相同。我用得最多的是ARM 20-pin标准定义如下引脚信号引脚信号1VCC2VCC3TRST4GND5TDI6GND7TMS8GND9TCK10GND11RTCK12GND13TDO14GND15SRST16GND17NC(DBGRQ)18GND19NC(DBGACK)20GND注意偶数脚基本都是地这是故意设计的相邻信号之间用地隔开减少串扰也方便手工飞线。很多国产调试板、开发板用的是10-pin或者14-pin简化座但信号排列逻辑类似。3.3 引脚连接里最容易翻车的三个点TDI/TDO方向搞反。TDI是进芯片的TDO是出芯片的。调试器和目标板之间必须TDI接TDI、TDO接TDO。有些转接板内部已经做了交叉有些人手工飞线没注意结果就是数据完全对不上。参考电压VTREF必须接对。很多调试器通过VTREF检测目标板电平决定输出脚的电平标准。目标板是3.3V你却把VTREF悬空调试器可能输出错误电平甚至不启动。我调试一块5V供电的老ARM9板子时调试器一开始怎么都连不上最后发现VTREF被接到5V而调试接口的IO只有3.3V耐压——不仅连不上再久一点可能烧IO。TCK/TMS上拉的问题。标准JTAG建议TCK有下拉、TMS有上拉保证复位时TAP落在确定状态。但实际很多廉价开发板为了省电阻把这些上下拉省了。如果你的板子在调试器连接前TMS悬空上电瞬间TAP可能在任意状态需要调试器多做几次状态机复位才能连上。遇到“连接一轮失败、重试一次成功”的怪现象优先查这个。3.4 SWDARM系特有的“精简版JTAG”值得单独提一下SWD。ARM从Cortex-M内核开始把JTAG精简成了两线SWCLK和SWDIO。SWCLK就是TCKSWDIO复用TMS数据线变成双向。两线占的引脚少速度快还能在低引脚数封装上省出宝贵的IO。不少人以为SWD是另一套东西其实它的底层依然是JTAG那套思想一个状态机移指令移数据。只不过ARM做了优化把指令寄存器变成5位还加了线协议上的序列握手比如先发送16位的JTAG-to-SWD切换序列。理解这一点你就能明白为什么ST-Link既能用JTAG又能用SWD而且SWD连接时看到的寄存器访问和JTAG完全一致。做Cortex-M开发时我默认用SWD只在需要边界扫描或同时调试多个TAP时切回JTAG。4. 实战排查调试器识别不到目标的完整链路4.1 先把自己的工具排除掉每次有人问我“软件怎么连不上板子”我第一句话都是先别怀疑目标板把调试器本身验证一遍。做法很简单找一个确定能正常跑的开发板用同一根线、同一个调试器看能不能连接。如果开发板也连不上问题大概率在调试器、线缆、驱动或软件配置上。这一步很多人嫌麻烦跳过结果折腾半天发现是杜邦线内部断了、或者调试器固件掉了。我自己的习惯是手边常备一块“探活板”只要是调试接口相关的活先在这块板上验证工具链。4.2 目标板硬件层面的五步排查排除工具之后按这个顺序查目标板供电。用万用表量核心电源电压尤其是有多路电源的板子。JTAG逻辑通常在核心电源域如果核心供电没起来TAP不可能工作。我之前排查过一块板子3.3V正常但1.8V内核电压没出调试器死活连不上最后发现是电源芯片使能脚被一个GPIO拉低了。时钟。JTAG本身是异步的但目标芯片的调试逻辑往往依赖系统时钟或独立调试时钟。用示波器看晶振是否起振。FPGA更是如此没有配置时钟或者时钟不稳定JTAG识别也会时好时坏。复位。SRST如果一直被外部拉低整个芯片处于复位状态JTAG自然无法访问。检查复位芯片输出、复位按键、RC复位电路用示波器看复位脚上电波形是否有一个由低到高的跳变。JTAG四线电平。用万用表量TCK、TMS、TDI在调试器连接时的电平。正常情况下TCK连接后会有方波TMS/TDI会被拉高到目标板IO电平TDO在未通信时可能是高阻。如果TCK一直为0或为1说明调试器没有把时钟送进来查连接器和线缆。关键信号是否有短接或虚焊。用万用表蜂鸣档量JTAG座子与芯片引脚之间是否导通再量相邻引脚是否短路。TDI对地短路、TDO虚焊是我见过最多的两种。4.3 高云FPGA识别不到的案例复盘群里经常有人问高云FPGA“JTAG识别不到”我遇到过几次原因各不相同但有几个高频点。先说高云GW1N/GW1NR系列JTAG引脚是TCK、TMS、TDI、TDO和普通IO复用上电时由芯片内部配置决定引脚功能。识别不到时按下面的优先级去查。第一MODE引脚M0/M1/M2有没有设对。高云FPGA靠模式引脚决定配置方式比如从SPI Flash配置、从JTAG配置、还是主动配置。如果MODE设成了SPI启动而上电后Flash里没有有效配置芯片可能进入非JTAG可用状态。把模式调到JTAG优先通常是M00、M10、M21这种组合具体看对应型号手册再试扫描。第二TCK频率太高。高云一些型号对TCK上限有要求特别是用第三方下载器时默认频率可能过高。在Gowin Programmer里把频率降到1MHz以下识别成功率会明显提升。这就是典型的“信号没问题但时序裕量不够”。第三下载器驱动和软件版本。高云官方下载器用起来还算省心但如果用CMSIS-DAP或者J-LINK兼容模式要确保软件里选的型号匹配并且下载器固件支持高云FPGA的IDCODE。识别不到时先开“Scan”功能看能不能枚举到链上设备如果扫描结果空白说明TDO没有返回有效ID往硬件链路查。第四之前烧录了加密或保护配置。高云FPGA支持OTP加密、禁止回读、禁止再次配置这类安全位。一旦配置过调试器可能连IDCODE都读不到。这种情况通常只能更换芯片所以量产前要非常谨慎地评估保护策略。4.4 软件侧连接模式和芯片型号的坑硬件都没问题却还是连不上十有八九是软件配置里的芯片型号选错或者连接模式选错。调试器通过IDCODE识别芯片但有些软件在你手动指定型号后会跳过IDCODE比对直接按你选的型号建立会话。如果你选的是同系列但Flash大小不同的型号有可能连上但读写Flash地址错乱。另外连接模式要正确。ST-Link连STM32时有“Normal”“Connect Under Reset”“Hot-Plug”几种模式。芯片已经把SWD引脚复用为普通IO时Normal模式连不上必须用Connect Under Reset在复位期间抢先把调试口接管过来。类似的J-Link也有连接时序选项。遇到“一开始能连跑一次程序后就再也连不上”的情况优先怀疑程序把调试引脚复用掉了换复位连接模式重试。4.5 用逻辑分析仪做一次“对波形说话”如果你手头有逻辑分析仪排查JTAG识别问题可以非常直观。把CH1接TCK、CH2接TMS、CH3接TDI、CH4接TDO触发条件设为TCK上升沿然后在软件里点一次连接。抓到的波形就是调试器完整的一次“搭讪”过程。看波形时重点确认三件事TCK有没有连续时钟TMS序列是否把TAP从Test-Logic-Reset推到了Shift-IRTDO在Shift-IR阶段有没有随TCK变化。如果TDO纹丝不动说明目标TAP没有回应你的指令——要么引脚没接对、要么芯片没进入JTAG模式、要么TAP被安全机制锁了。这一招能把问题从“模糊的连不上”变成“明确的一侧故障”。5. 禁用JTAG与安全保护锁门之前先想好怎么开锁5.1 为什么有人要关掉JTAGJTAG是调试利器也是破解者的后门。通过JTAG可以读Flash、剥固件、改配置所以很多产品在量产时会把JTAG禁掉或加上读保护。这里“禁用”其实是两个层次一是把JTAG引脚复用为普通GPIO接口物理上失效二是开启芯片的安全等级让即使JTAG物理还在也无法访问敏感资源。做这件事之前必须想清楚禁用了之后怎么恢复如果没有任何恢复通道板子一旦出问题就只能报废这是很多团队交过的学费。正确的思路是开发期保留完整调试能力量产前再评估要不要锁、锁到哪个级别、是否保留返修通道。5.2 STM32的JTAG禁用操作与恢复STM32的JTAG和SWD引脚是复用的标准映射是PA13SWDIO、PA14SWCLK、PA15JTDI、PB3JTDO、PB4JNTRST。禁用JTAG通常用两种方式。第一种软件上把SWJ引脚重映射为GPIO。在STM32F1系列里通过修改AFIO_MAPR寄存器的SWJ_CFG字段实现。HAL库或标准库对应的函数是// 关闭JTAG-DP使能SW-DP释放PA15、PB3、PB4 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // 完全关闭SWJPA13/PA14也变普通GPIO此时只能靠ISP或其它方式恢复 GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);第二种开启读保护RDP。RDP分三个等级Level 0无保护Level 1禁止调试口访问Flash和备份寄存器但内核还能通过调试口运行Level 2彻底禁用调试口且不可逆。量产产品常用Level 1既能防止通过SWD/JTAG直接读Flash又保留了一定返修空间。恢复STM32被禁用JTAG/开读保护的手段有讲究如果只是GPIO复用导致连不上用Connect Under Reset模式连接在复位释放瞬间抢占调试口。如果是RDP Level 1用ST-Link连接时会提示“Read protection is enabled”此时执行“解除保护”操作调试器会先全片擦除再降级到Level 0。注意解除Level 1会擦除整个用户Flash所以这一步本质上是“格式化”而不是“解锁”。如果是RDP Level 2调试口永久失效无法通过SWD/JTAG恢复。可以尝试把BOOT0拉高从系统存储器启动用串口ISP连接STM32的ISP是USART1ISP同样受RDP保护限制Level 2下ISP也不可用只能换芯片。我的建议是开发板绝不设Level 2量产板如果要上Level 2必须有严格的烧录流程保证烧录校验完成后才锁死并且留出足够多的验证样品。5.3 S32K的JTAG保护车规MCU的生命周期管理S32K这类车规MCU对调试口的管理比普通MCU严格得多因为车载ECU一旦被刷写或读取直接关系到安全和法规合规。S32K1系列引入了生命周期Life Cycle的概念和DCFDevice Configuration File机制。芯片在不同生命周期状态下的调试权限不一样比如在工厂初始态BLANK/FRESH调试口完全开放进入产品生命周期IN_FIELD后调试口默认关闭或者只允许通过安全认证的调试器访问。具体操作上S32K3还支持Debug Authentication也就是“调试认证”调试器要和芯片之间做一次基于证书的握手验证通过后才能获得调试权限。这已经不像传统JTAG那样“插上就能连”而是把JTAG入口和访问控制分离了。如果你做S32K量产配置建议先明确产品需要哪个级别的调试访问。如果只需要出厂前烧录那就在烧录完成后直接切到IN_FIELD并锁定调试口如果售后需要返修调试就得设计一套基于认证的调试流程而不是简单地把JTAG焊掉。这块配置错了轻则无法返修重则整个批次报废真不是开玩笑的。5.4 ARM9内核的JTAG保护特点老一点的ARM9内核比如ARM926EJ-S没有SWD口调试全靠标准JTAG。它的调试逻辑叫EmbeddedICE-RT支持硬件断点和实时跟踪。禁用ARM9的JTAG通常不是在核内软件设置的而是SoC层面的引脚复用、熔丝方案或者外部设计。很多ARM9平台的JTAG引脚同时也可复用为GPIOBootloader初始化时把引脚切到GPIO模式JTAG就失效了。这种情况下恢复难度很大因为JTAG自己不能动了只能靠1外部把JTAG引脚强制拉回调试模式如果有专用配置引脚2用Boot ROM的下载通道比如SD卡升级、串口下载先改掉Bootloader配置3如果SoC有熔丝把JTAG彻底熔断那就没有恢复路径了。所以针对ARM9以及类似的旧内核平台我的经验是不要把JTAG禁用写死在产品代码里而要和量产烧录流程解耦。调试口关闭应该是一个独立步骤由产线工具执行而不是跟随业务固件发布。这样开发人员手上跑的固件依然可以调试产线出厂的版本则是锁定状态。6. 进阶玩法边界扫描、JTAG链与OpenOCD实操6.1 边界扫描在生产测试里的位置JTAG前面提到的EXTEST等指令在现代生产中仍然有大量应用。板级互连测试有两种主流路径一种是ICTIn-Circuit Test需要针床接触测试点另一种就是边界扫描不需要物理接触只要板上的芯片都支持JTAG把它们串成链就能测出引脚之间的开路短路。边界扫描的做法是先通过SAMPLE/PRELOAD把边界扫描寄存器预装载成已知电平再切到EXTEST让芯片引脚输出这个电平同时捕获相邻芯片的引脚输入。如果本来应该连在一起的两个引脚一个输出高一个读到低就说明这条网络有开路如果应该互相隔离的引脚读到短接就说明有桥连。和飞针测试比边界扫描最大的优势是“不用扎针”对BGA、QFN这种引脚藏在封装底下的芯片特别友好。想用好边界扫描需要拿到每个器件的BSDL文件它是芯片边界扫描行为的“说明书”。软件工具会根据BSDL生成测试向量所以BSDL版本必须和芯片实际版本一致否则测出来的结果会误导你。6.2 多片级联的JTAG链设计板上有多个JTAG器件时可以把它们串成一条链前一颗的TDO接下一颗的TDITCK和TMS共享。调试器访问整条链时移入的指令是链上所有器件IR长度的总和移入的数据是所有DR长度的总和。这就是为什么链上器件多了以后操作响应会变慢也容易出现“差一位”的问题。设计JTAG链要注意几点链上每个器件的IR长度可能不同有的4位有的5位需要软件里配置对不操作的器件必须置为BYPASS这样它的DR只有1位不会拖慢整条链链的首尾要留测试点方便产线单独验证TCK走线要短负载重了还要加缓冲器。很多FPGA和CPLD的下载链就是典型的JTAG链CPU、FPGA、CPLD三颗串在一起很常见。6.3 用OpenOCD和JTAG直接对话如果你不想依赖厂商IDEOpenOCD是学习JTAG协议最好的工具。它开源支持大量调试器和target更重要的是它把JTAG操作公开成了命令行你可以直接对TAP发指令。启动OpenOCD连接一块STM32F1板子最简单的命令是openocd -f interface/stlink.cfg -f target/stm32f1x.cfg启动后在另一个终端连上telnet或使用gdb就能敲命令操作目标。常用命令halt # 暂停内核 mdw 0x08000000 # 读一个字内存 flash write_image erase unlock app.hex dump_image backup.bin 0x08000000 0x10000 # 备份FlashOpenOCD还允许直接操作JTAG TAP比如查看当前链上的tapjtag tapdisable 0 jtag tapenable 0 jtag newtap target cpu -irlen 4 -expected-id 0x3ba00477第一次跑通OpenOCD时建议加-d参数打开调试日志你会看到OpenOCD初始化时逐条发送的JTAG命令以及从TDO读回的原始bit串。把这些日志和逻辑分析仪波形对照是理解JTAG最直观的路径。6.4 用JTAG做固件备份与恢复的边界意识JTAG能读Flash也能写Flash。这既是便利也是风险。做固件备份时如果芯片开了RDP Level 1读出来会是全FF或者乱码而不是你想要的明文如果开了Level 2连接都建立不了。反过来如果你拿到一片二手芯片想通过JTAG擦除重写也先确认保护级别免得白忙一场。我自己的原则是涉及他人产品和生产设备的操作只做职责范围内的备份与恢复自己设计的板子调试口访问权限要写进设计文档谁可以开、谁可以锁、锁了怎么解锁都提前约定清楚。JTAG是一把万能钥匙能开很多锁但你得知道哪些锁是你能开的哪些不该开。实操中还有个很实用的小技巧如果你要长期调试一块板子又怕调试口被误配置成GPIO可以在电路上给TCK/TMS加一对0欧电阻的跳线调试时焊上产品化后摘掉。这样既不影响开发效率又能防止误禁用JTAG后没有恢复入口。成本几乎为零却能在关键时刻救你一命。回到题目那句话Do You Speak JTAG我的回答是不一定要背得出每一个寄存器的位定义但你要能在波形上认出TAP状态机的步伐在连不上时知道往哪个方向查在需要关闭调试口时清楚恢复路径。把这几件事做到位你就算真正会讲这门语言了。
返回列表