1. 调试基础与环境搭建:常用调试工具介绍(JTAG/SWD)、IDE调试环境配置(Keil/IAR)、调试器与目标板连接
调试,说白了就是给嵌入式系统「看病」。你写好了代码,下载到板子上,结果灯不亮、电机不转、串口没输出——这时候就得靠调试工具来「问诊」了。
我个人习惯,拿到一个新项目,第一件事不是写代码,而是先把调试环境搭稳。环境没搭好,后面出了问题你都不知道是代码的锅还是工具的锅。
1.1 调试接口:JTAG 与 SWD
调试器和目标板之间怎么通信?目前主流就两种:JTAG 和 SWD。
| 特性 | JTAG | SWD |
|---|---|---|
| 引脚数 | 5 根(TMS、TCK、TDI、TDO、nTRST) | 2 根(SWDIO、SWCLK) |
| 速度 | 最高可达几十 MHz | 与 JTAG 相当,略低 |
| 调试能力 | 支持边界扫描,可测试 PCB 互联 | 仅支持调试功能 |
| 硬件占用 | 占用引脚多,适合大型 FPGA/CPLD | 引脚少,适合 MCU |
| 主流调试器 | J-Link、ST-Link、ULINK | J-Link、ST-Link、DAP-Link |
你想想看,现在的 MCU 封装越来越小,引脚越来越金贵。SWD 只用两根线就能搞定调试,省下来的引脚可以接传感器、控制外设,何乐而不为?
我的经验: 除非你需要用边界扫描做 PCB 测试,否则 SWD 是更优选择。我在一个 STM32F103 项目上,硬是把 JTAG 的 5 根线改成了 SWD 的 2 根线,省出来的 3 个 GPIO 刚好接了一个 I²C 屏幕。
1.2 调试器选型与连接
调试器就是电脑和目标板之间的「翻译官」。常见的调试器有 J-Link、ST-Link、DAP-Link、ULINK 等。选哪个?看你的芯片和预算。
- J-Link:SEGGER 出品,兼容性最好,速度最快。支持几乎所有 ARM Cortex 内核芯片。我手头常备一个 J-Link Plus,用了五年没出过问题。
- ST-Link:ST 官方调试器,专为 STM32 系列优化。便宜,但只支持 ST 芯片。
- DAP-Link:ARM 官方开源方案,成本极低,适合批量产线使用。
- ULINK:Keil 官方调试器,与 MDK 集成度最高,但价格偏高。
连接调试器和目标板时,有几点要特别注意:
- 接线顺序:先接 GND,再接 SWDIO/SWCLK,最后接 VCC(如果调试器需要供电)。
- 线长控制:SWD 信号线不要超过 20cm,否则高速通信时容易出错。
- 上拉电阻:SWDIO 和 SWCLK 引脚通常需要 10kΩ 上拉电阻,部分调试器内置了,但有些没有。
我曾经踩过的坑: 有一次调试一块新板子,J-Link 死活连不上。折腾了半天,最后发现是 SWD 线太长(大概 30cm),信号衰减导致通信不稳定。换成 10cm 的杜邦线,一次就识别了。所以,线越短越好,别图省事。
1.3 IDE 调试环境配置(Keil / IAR)
环境配置是新手最容易卡住的地方。我见过太多人花了一整天装软件、配驱动,结果还是连不上调试器。其实步骤很简单,按顺序来就行。
Keil MDK 配置步骤
- 安装 Keil MDK 和对应芯片的 Pack 包(如 STM32F1xx_DFP)。
- 连接调试器到电脑,安装驱动(J-Link 驱动或 ST-Link 驱动)。
- 打开工程,点击 Project → Options for Target → Debug。
- 在「Use」下拉框中选择对应的调试器(如 J-Link / J-TRACE Cortex)。
- 点击 Settings,确认调试器已识别,SWD 模式,速度建议先选 1MHz(稳定后再调高)。
- 切换到 Flash Download 标签,勾选「Reset and Run」,这样下载完程序后芯片自动运行。
IAR EWARM 配置步骤
- 安装 IAR Embedded Workbench for ARM。
- 打开工程,右键项目名 → Options → Debugger。
- 在「Setup」标签的「Driver」下拉框中选择调试器(如 J-Link/J-Trace)。
- 点击 Download 标签,勾选「Use flash loader(s)」和「Override default.board file」。
- 回到 Debugger → J-Link/J-Trace → Connection,选择 SWD 接口,速度建议 1MHz。
关键检查点: 配置完成后,点击「OK」保存。然后按 Ctrl+F5(Keil)或 Ctrl+D(IAR)进入调试模式。如果看到汇编窗口或反汇编窗口,说明连接成功。如果弹出错误提示,八成是驱动没装好或接线有问题。
1.4 调试器与目标板连接实战
理论说完了,咱们来点实际的。下面是一个标准的 SWD 连接示意图:
实际连接时,我一般会准备一个 4 针的杜邦线排插,把 SWDIO、SWCLK、GND、VCC 分别标好颜色。红色 VCC、黑色 GND、黄色 SWCLK、白色 SWDIO——这是我的习惯,你也可以按自己的来,但一定要统一,不然接错线烧了芯片就麻烦了。
警告: 千万不要在目标板上电的情况下插拔调试器!我有个同事,为了省事,带电插拔了一次,结果调试器的 SWDIO 引脚直接烧了。正确的做法是:先断开目标板电源,插好调试器,再上电。
1.5 常见连接故障排查
环境搭好了,调试器也连上了,但 IDE 就是识别不到芯片。别急,按下面的清单排查:
- 驱动问题:打开设备管理器,看调试器是否出现在「通用串行总线设备」或「J-Link」条目下。如果有个黄色感叹号,重装驱动。
- 接线问题:用万用表量一下 SWDIO 和 SWCLK 到 MCU 引脚的连通性。我遇到过杜邦线内部断了的奇葩情况。
- 供电问题:目标板必须独立供电,或者调试器提供 3.3V 输出。电压不够,芯片不工作。
- 复位问题:部分芯片需要外部复位电路。如果 nRST 引脚悬空,调试器可能无法连接。
- SWD 引脚复用:有些芯片的 SWD 引脚默认被 GPIO 或其他功能占用了。需要检查芯片的 Option Bytes 或 Boot 配置。
我的排查习惯: 先用 J-Link Commander(命令行工具)测试连接。输入
connect 命令,如果能看到芯片 ID,说明硬件没问题,问题出在 IDE 配置上。如果连 ID 都读不到,那肯定是硬件或接线的问题。
嗯,调试基础这部分就这些。环境搭好了,后面才能安心做断点、看变量、分析堆栈。别嫌麻烦,前期多花十分钟把环境搞稳,后面能省下几个小时甚至几天的时间。