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
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焊接检测 | 量产产品、空间受限设计 |
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 常用电平转换方案
我常用的电平转换方案有三种,按推荐程度排序:
- 专用电平转换芯片: 比如TXS0102(2位)、TXS0104(4位)、SN74LVC1T45(1位)。这些芯片是自动双向的,不需要方向控制信号,用起来最省心。
- MOS管分立电路: 用N沟道MOS管(如2N7002)搭一个双向电平转换电路。成本低,但要注意上拉电阻的取值。
- 电阻分压: 只适用于单向信号(比如调试器输出到目标板输入)。简单粗暴,但不推荐用于高速信号。
我个人习惯,只要板子空间允许,优先用专用芯片。TXS0102大概一块钱左右,能省去很多调试时的麻烦。
2.3 隔离保护设计
最后说说隔离保护。这个很多人容易忽略,觉得「不就是接几根线嘛,有什么好隔离的?」
嗯,等你遇到下面这些情况,你就知道隔离有多重要了:
- 调试高压电路(比如电机驱动、开关电源)时,地线环路导致调试器烧毁
- 现场调试时,调试器被静电打坏
- 目标板意外短路,把电脑的USB口也带走了
我有个同事,就因为没做隔离,调试一个220V的变频器时,整个笔记本电脑的主板都烧了。从那以后,他做任何调试电路都先加隔离。
2.3.1 隔离等级划分
| 隔离等级 | 适用场景 | 实现方式 | 成本 |
|---|---|---|---|
| 基本隔离 | 同板不同电源域 | 磁耦隔离芯片(如ISO7240) | 低 |
| 加强隔离 | 不同板卡之间 | 光耦 + DC-DC隔离电源 | 中 |
| 安全隔离 | 高压电路调试 | 隔离USB(如ADuM3160)+ 隔离电源 | 高 |
2.3.2 隔离电路设计要点
做隔离设计时,我一般遵循这几个原则:
- 信号隔离和电源隔离要配套: 光隔离了信号,但电源还共地,那隔离就白做了。隔离侧必须用独立的隔离电源供电。
- 注意隔离芯片的速率: SWD时钟如果跑到10MHz以上,普通光耦(如6N137)可能跟不上。这时候要用高速磁耦隔离芯片,比如ISO7221。
- 地线要分开: 隔离两侧的地要彻底分开,不能有任何电气连接。PCB上要开槽(挖空铜皮),增加爬电距离。
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