2、调试工具硬件基础:常用调试接口(JTAG/SWD/UART)、电平转换电路、隔离保护设计

做嵌入式开发这么多年,我调试过的板子少说也有上百块了。每次拿到一块新板子,第一件事就是看它的调试接口怎么接的。说白了,调试接口就是你和芯片对话的「窗口」。窗口开得好不好,直接决定了你后面调试时是舒舒服服还是抓耳挠腮。

这一章,我就把调试工具硬件这块最核心的三个东西掰开揉碎讲清楚:调试接口电平转换隔离保护。这三个东西,任何一个出问题,你的调试器都可能「罢工」甚至「烧板子」。

2.1 三大调试接口:JTAG、SWD、UART

先说说最常见的三种接口。你想想看,一个嵌入式工程师,90%的调试工作都离不开它们。

2.1.1 JTAG接口

JTAG是老祖宗级别的接口了。它用5根线:TMS、TCK、TDI、TDO、TRST(有的板子把TRST省了)。

我个人习惯,只要芯片支持JTAG,我第一版设计一定会把它引出来。为什么?因为JTAG可以边界扫描,能帮你查PCB焊接问题。我记得有一次,一块四层板的BGA芯片虚焊了,用万用表量了半天没找到问题,最后用JTAG边界扫描,两分钟就定位到了。

JTAG的接线其实很简单:

// 标准20针JTAG连接器定义(常用)
// 1 - Vref   2 - VCC
// 3 - TRST   4 - GND
// 5 - TDI    6 - GND
// 7 - TMS    8 - GND
// 9 - TCK    10 - GND
// 11 - TDO   12 - GND
// 13 - RTCK  14 - GND
// 15 - RESET 16 - GND
// 17 - NC    18 - GND
// 19 - NC    20 - GND
我的小技巧: 如果板子空间紧张,至少把TMS、TCK、TDI、TDO、GND这5根线引到测试点上。我曾经吃过亏,板子做小了没留JTAG口,结果芯片第一次烧录就失败,只能飞线,那叫一个痛苦。

2.1.2 SWD接口

SWD是ARM公司搞出来的「精简版」调试接口。它只需要2根线:SWDIO和SWCLK。说白了,就是把JTAG的5根线压缩成了2根。

你可能会问:「2根线够用吗?」嗯,够用。SWD在功能上基本覆盖了JTAG的调试能力——下载、单步、断点、寄存器读写,全都能干。唯一的遗憾是它不支持边界扫描。

我在项目中遇到过这样的情况:一个产品已经量产了,但现场需要升级固件。硬件上只留了一个4针的插座(SWDIO、SWCLK、VCC、GND),用SWD接口配合一个十几块钱的CMSIS-DAP调试器,现场工程师几分钟就搞定了升级。要是用JTAG,光那个20针的座子就占地方。

特性 JTAG SWD
最少线数 5根 2根
调试速度 高(并行传输) 中(串行传输)
边界扫描 支持 不支持
占用引脚
适用场景 复杂系统、BGA焊接检测 量产产品、空间受限设计
重要提醒: 很多ARM芯片同时支持JTAG和SWD。你可以在PCB上把两种接口的引脚都引出来,用0欧电阻切换。我一般默认用SWD,但保留JTAG的焊盘,万一需要边界扫描时还能飞线救急。

2.1.3 UART调试接口

UART不是专门的调试接口,但它是我用得最多的「调试工具」。为什么?因为它简单到极致——TX、RX、GND三根线就能干活。

UART在调试中主要干两件事:

  • 打印日志: 芯片跑起来后,通过UART往PC端发调试信息。我习惯在代码里加一个宏开关,量产时关掉,调试时打开。
  • 命令行交互: 做一个简单的shell,可以在PC上输入命令,让芯片执行。比如读寄存器、改参数、跑测试用例。

我曾经在一个电机驱动项目里,芯片的SWD接口被占用了(因为要同时控制两个电机,GPIO不够用)。最后全靠UART做调试,写了一个小型的命令行解释器,所有参数都能在线调整。嗯,那段时间我深刻体会到了「UART是嵌入式工程师最后的救命稻草」这句话。

2.2 电平转换电路

好,接口选好了,接下来就是电平匹配的问题。你想想看,你的调试器可能是3.3V的,但目标芯片可能是1.8V或者5V的。直接连上去会怎样?轻则通信失败,重则烧毁芯片。

我刚开始做嵌入式时,就犯过这个错。一个1.8V的FPGA,我用3.3V的JTAG调试器直接怼上去,结果FPGA的JTAG引脚直接冒烟了...从那以后,电平转换成了我设计调试接口时的「必修课」。

2.2.1 常见电平标准

电平标准 VOH(输出高电平) VOL(输出低电平) VIH(输入高电平) VIL(输入低电平)
5V TTL ≥2.4V ≤0.4V ≥2.0V ≤0.8V
3.3V LVTTL ≥2.4V ≤0.4V ≥2.0V ≤0.8V
1.8V CMOS ≥1.35V ≤0.45V ≥1.17V ≤0.63V

注意看,3.3V TTL和5V TTL的输入阈值其实是一样的。所以3.3V器件驱动5V TTL输入,很多时候是可行的。但反过来,5V器件输出到3.3V输入,就可能超压。

2.2.2 常用电平转换方案

我常用的电平转换方案有三种,按推荐程度排序:

  1. 专用电平转换芯片: 比如TXS0102(2位)、TXS0104(4位)、SN74LVC1T45(1位)。这些芯片是自动双向的,不需要方向控制信号,用起来最省心。
  2. MOS管分立电路: 用N沟道MOS管(如2N7002)搭一个双向电平转换电路。成本低,但要注意上拉电阻的取值。
  3. 电阻分压: 只适用于单向信号(比如调试器输出到目标板输入)。简单粗暴,但不推荐用于高速信号。

我个人习惯,只要板子空间允许,优先用专用芯片。TXS0102大概一块钱左右,能省去很多调试时的麻烦。

避坑指南: 我曾经在一个项目里用MOS管搭电平转换,结果SWD时钟频率跑到10MHz时,信号波形已经严重畸变了。后来换成TXS0104,问题立刻解决。所以,如果你的调试速度超过1MHz,建议直接用专用芯片。

2.3 隔离保护设计

最后说说隔离保护。这个很多人容易忽略,觉得「不就是接几根线嘛,有什么好隔离的?」

嗯,等你遇到下面这些情况,你就知道隔离有多重要了:

  • 调试高压电路(比如电机驱动、开关电源)时,地线环路导致调试器烧毁
  • 现场调试时,调试器被静电打坏
  • 目标板意外短路,把电脑的USB口也带走了

我有个同事,就因为没做隔离,调试一个220V的变频器时,整个笔记本电脑的主板都烧了。从那以后,他做任何调试电路都先加隔离。

2.3.1 隔离等级划分

隔离等级 适用场景 实现方式 成本
基本隔离 同板不同电源域 磁耦隔离芯片(如ISO7240)
加强隔离 不同板卡之间 光耦 + DC-DC隔离电源
安全隔离 高压电路调试 隔离USB(如ADuM3160)+ 隔离电源

2.3.2 隔离电路设计要点

做隔离设计时,我一般遵循这几个原则:

  • 信号隔离和电源隔离要配套: 光隔离了信号,但电源还共地,那隔离就白做了。隔离侧必须用独立的隔离电源供电。
  • 注意隔离芯片的速率: SWD时钟如果跑到10MHz以上,普通光耦(如6N137)可能跟不上。这时候要用高速磁耦隔离芯片,比如ISO7221。
  • 地线要分开: 隔离两侧的地要彻底分开,不能有任何电气连接。PCB上要开槽(挖空铜皮),增加爬电距离。
我的经验: 如果你只是做普通的3.3V/5V系统调试,不需要上隔离。但如果你要调试电机驱动、变频器、开关电源这类电路,强烈建议在调试器和目标板之间加一个隔离模块。淘宝上几十块钱就能买到现成的隔离JTAG/SWD调试器,比自己搭省事多了。

2.3.3 保护电路设计

除了隔离,保护电路也很重要。我一般在调试接口上加这些东西:

  • TVS管: 在每根信号线上对地加一个TVS管(比如SMAJ5.0A),防止静电和浪涌。
  • 串联电阻: 在信号线上串一个22Ω~100Ω的电阻,限制电流。万一短路了,这个电阻能救命。
  • 上拉/下拉电阻: 防止调试器未连接时,芯片的调试引脚处于浮空状态。
// 一个典型的SWD接口保护电路
// 目标板侧
// SWDIO ---[22R]---|>--- 到芯片SWDIO引脚
//                   |
//                  [TVS] 到GND
//
// SWCLK ---[22R]---|>--- 到芯片SWCLK引脚
//                   |
//                  [TVS] 到GND
//
// 另外,SWDIO上拉10K到VCC,SWCLK下拉10K到GND

嗯,这一章的内容就这些。调试接口、电平转换、隔离保护,这三块是调试工具硬件的「地基」。地基打牢了,后面做调试工具软件时才能得心应手。下一章,我会讲讲调试工具的上位机软件架构,到时候咱们再聊。


公众号:蓝海资料掘金营,微信deep3321