4. 目标板 JTAG/SWD 接口定义
做嵌入式调试这么多年,我见过最多的坑,其实不是调试器本身,而是接口没接对。你想想看,花了大几千买的调试器,结果连不上目标板,十有八九是引脚定义搞混了。今天咱们就把最常见的几种接口标准掰开揉碎了讲清楚。
4.1 标准 20-pin JTAG 接口
这是 ARM 公司最早定义的调试接口标准,也是目前最通用的。我在项目里见过最多的就是这种 2×10 的排针布局。说白了,它就是 JTAG 协议的物理载体。
| 引脚 | 信号名 | 方向 | 说明 |
|---|---|---|---|
| 1 | VTref | 输入 | 目标板参考电压,用于电平匹配 |
| 2 | VCC | 输出 | 调试器提供的 3.3V 电源(可选) |
| 3 | nTRST | 输出 | JTAG 测试复位(低有效) |
| 4 | GND | - | 地 |
| 5 | TDI | 输出 | 数据输入到目标芯片 |
| 6 | GND | - | 地 |
| 7 | TMS | 输出 | 模式选择 |
| 8 | GND | - | 地 |
| 9 | TCK | 输出 | 时钟信号 |
| 10 | GND | - | 地 |
| 11 | RTCK | 输入 | 目标返回时钟(自适应时钟用) |
| 12 | GND | - | 地 |
| 13 | TDO | 输入 | 数据从目标芯片输出 |
| 14 | GND | - | 地 |
| 15 | nSRST | 输出 | 系统复位(低有效) |
| 16 | GND | - | 地 |
| 17 | DBGRQ | 输出 | 调试请求(很少用) |
| 18 | GND | - | 地 |
| 19 | DBGACK | 输入 | 调试应答(很少用) |
| 20 | GND | - | 地 |
我的习惯: 不管目标板用不用,我都会把 VTref 接上。有一次我偷懒没接,结果调试器死活不认目标板,折腾了半天才发现是电平检测没通过。
4.2 10-pin SWD 接口
SWD 是 JTAG 的简化版,只用了两根线:SWDIO 和 SWCLK。我最早接触 SWD 是在做 Cortex-M0 项目的时候,板子空间紧张,20-pin 根本放不下。10-pin 接口就成了救星。
| 引脚 | 信号名 | 方向 | 说明 |
|---|---|---|---|
| 1 | VTref | 输入 | 目标板参考电压 |
| 2 | SWDIO | 双向 | 数据线 |
| 3 | GND | - | 地 |
| 4 | SWCLK | 输出 | 时钟线 |
| 5 | GND | - | 地 |
| 6 | SWO | 输入 | 串行输出(可选,用于 ITM 调试) |
| 7 | NC | - | 悬空 |
| 8 | NC | - | 悬空 |
| 9 | GND | - | 地 |
| 10 | nSRST | 输出 | 系统复位(低有效) |
注意: SWO 不是所有调试器都支持。我手头有个便宜的调试器,SWO 引脚根本没接出来,想用 ITM 打印日志?没门。选型的时候一定要确认清楚。
4.3 Cortex-M 标准 SWD 接口(最小系统)
如果你板子空间实在紧张,可以只用 4 根线。这是 Cortex-M 系列芯片调试的最小配置。我做过一个可穿戴设备,板子只有指甲盖大小,用的就是这种接法。
最小 SWD 接口(4-pin):
- SWDIO — 数据线,双向
- SWCLK — 时钟线,调试器输出
- GND — 地
- VTref — 参考电压(有些调试器可以省略,但我不建议)
为什么会这样?因为 Cortex-M 芯片内部集成了 SWD 协议控制器,只需要这两根信号线就能完成所有调试操作:读写内存、设置断点、单步执行等等。
4.4 接口对比与选型建议
我个人习惯这样选:
- 开发阶段: 用 20-pin JTAG,兼容性最好,信号完整
- 产品原型: 用 10-pin SWD,省空间,够用
- 量产板: 用 4-pin SWD 加测试点,成本最低
记得有一次,我给一个客户做方案评审,他们量产板用了 20-pin 接口。我说你们这板子成本至少多 5 毛钱,而且占地方。后来改成 4-pin 测试点,焊接的时候用弹簧针顶住就行,省事多了。
4.5 信号说明与注意事项
这里有几个关键信号,我得重点说一下:
- VTref: 调试器通过这个引脚检测目标板的工作电压。我遇到过调试器死活连不上,最后发现是 VTref 没接,调试器以为目标板没上电。
- nSRST: 系统复位信号。有些芯片需要复位后才能进入调试模式。我曾经用过一个国产 MCU,必须拉低 nSRST 才能识别 SWD 设备。
- SWO: 这是 SWD 的附加功能,可以输出调试信息。说白了就是个串口,但速度比普通 UART 快得多。
避坑指南: 我曾经在一个项目里把 SWDIO 和 SWCLK 接反了,结果调试器能识别到目标芯片,但一读写内存就报错。查了两天才发现是线序问题。所以,焊接前一定用万用表量一下,别信自己的记忆。
嗯,接口定义这块就这些。记住一句话:VTref 必须接,GND 必须共,信号线别搞反。做到这三点,90% 的连接问题都不会出现。