写嵌入式代码只是第一步,调试才是决定项目能不能顺利推进的关键。
MCU 不跑?外设不响应?代码跑飞?
没有合适的调试手段,排查问题就像摸黑找路。
本文带你搞懂三大调试利器 ——JTAG、SWD、串口打印。不仅对比优缺点,还提供实战操作步骤 + 代码示例,让你学完就能上手。
一、JTAG —— 复杂系统的“放大镜”
原理与特点
Keil/MDK 操作步骤
- 单步运行(F10/F11)
- 查看寄存器
- 内存监视
OpenOCD 命令行示例
- openocd-f interface/jlink.cfg-f target/stm32f4x.cfg
进入 GDB 调试:
- arm-none-eabi-gdb build/firmware.elf
- (gdb)target remote localhost:3333
- (gdb)monitor reset halt
- (gdb)load
- (gdb)continue
小贴士:JTAG 引脚多,布线复杂,注意避免长线和交叉走线导致信号干扰。
二、SWD —— MCU 调试的首选
原理与特点
- 接口:2 根线(SWDIO、SWCLK)
- 功能:断点、寄存器访问、内存修改
- 应用:STM32、NXP、Nordic 等 Cortex-M
Keil/MDK 操作步骤
- 接入 ST-LINK
- Project → Options → Debug → ST-Link Debugger
- Utilities → 选择Use ST-LINK作为编程器
- 按F5进入调试,支持断点、变量观察
代码断点示例
- intmain(void){
- HAL_Init();
- MX_GPIO_Init();
- intcounter=0;
- while(1){
- counter++;// 在这里设置断点,调试时观察 counter 值变化
- }
- }
小贴士:用 SWD 调试时,可以结合ITM/SWO 输出,打印实时日志而不占用 UART。
三、串口打印 —— 最接地气的调试方式
原理与特点
- UART 将变量、状态输出到上位机
- 本质:调试日志(printf 调试)
- 应用:逻辑验证、状态监控、无调试器场景
实现步骤
- MCU 初始化 UART(波特率 115200 常见)
- 在fputc重定向printf
- 打开串口调试助手(SSC/Putty/Termite),选择对应 COM 口
- 查看输出调试日志
代码示例
- #include"stdio.h"
- intfputc(intch,FILE*f){
- HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,HAL_MAX_DELAY);
- returnch;
- }
- intmain(void){
- HAL_Init();
- MX_USART1_UART_Init();
- intvalue=42;
- printf("Debug: value = %d\r\n",value);
- while(1){
- HAL_Delay(1000);
- printf("Loop running...\r\n");// 在串口助手中观察输出
- }
- }
小贴士:打印过多可能改变程序时序(海森堡效应),建议只保留关键日志。
四、三者对比表
| 调试方式 | 接口线数 | 功能范围 | 优点 | 缺点 | 典型应用 |
|---|---|---|---|---|---|
| JTAG | 4~5 根 | 全面(断点、寄存器、内存) | 功能齐全,标准化 | 引脚多,速度一般 | SoC、FPGA 调试 |
| SWD | 2 根 | MCU 调试 | 引脚少,速度快 | 仅限 Cortex-M | STM32、Cortex-M |
| 串口打印 | 2 根 | 程序流程、变量输出 | 简单直观 | 占资源,功能有限 | 基础逻辑调试 |
五、如何选择?
- 开发初期逻辑验证→ 串口打印
- 常规 MCU 调试→ SWD
- 复杂系统/SoC/FPGA→ JTAG
最佳实践:组合使用
- SWD 断点调试
- 串口打印关键日志
- JTAG 处理复杂系统问题
总结
- JTAG功能最全,适合复杂系统
- SWD精简高效,MCU 调试首选
- 串口打印简单直接,快速验证逻辑
熟练掌握并灵活组合三者,能让你的调试效率飞跃提升,少走弯路。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
JTAG
+关注
关注
6文章
411浏览量
74622 -
嵌入式开发
+关注
关注
18文章
1103浏览量
49853 -
SWD
+关注
关注
1文章
59浏览量
12576 -
串口打印
+关注
关注
0文章
11浏览量
3312
发布评论请先 登录
相关推荐
热点推荐
基于ARM的嵌入式开发
基于ARM的嵌入式开发:华清远见/孙天泽基于ARM的嵌入式开发内容有:ARM简介,基于ARM的嵌入式产品,ARM架构,基于ARM的嵌入式开发。
发表于 10-04 08:49
•83次下载
嵌入式软件的打印调试信息的方法
在我们的嵌入式开发中,常常把printf重定向到MCU的串口外设,再配合上位机界面软件,通过打印调试信息的方式来调试我们的
下载调试接口SWD和JTAG的区别
作为嵌入式工程师,下载调试器都应该知道,但你真正了解其 SWD 和 JTAG 接口的含义和区别吗? 1、什么是下载调试器 简单来说,下载
嵌入式开发(一):嵌入式开发新手入门
嵌入式开发环境及交叉编译环境,开发完成后,编译得到bin文件,然后在Windows下将bin文件通过串口或网络下发到嵌入式板卡,程序在嵌入式
发表于 10-14 10:58
•79次下载
嵌入式开发资料免费分享
嵌入式开发资料免费分享嵌入式工程师经验分享:如何学习嵌入式开发截取文档部分学习嵌入式工程师经验分享的资料分享给大家,文档上从、嵌入式系统的概
发表于 10-21 11:07
•47次下载
嵌入式开发过程中的一点调试经验
嵌入式开发过程中的一点调试经验嵌入式开发最麻烦的在现场调试过程中或实际运营过程中出现问题很难定位。我在实际开发过程中一点经验分享给大家
发表于 11-02 18:06
•15次下载
嵌入式开发(一):嵌入式开发新手入门(转载后续需要修改补充)
嵌入式开发环境及交叉编译环境,开发完成后,编译得到bin文件,然后在Windows下将bin文件通过串口或网络下发到嵌入式板卡,程序在嵌入式
发表于 11-02 20:06
•17次下载
jtag接口和swd接口区别
jtag接口和swd接口区别 JTAG (Joint Test Action Group) 接口和 SWD (Serial Wire Debug) 接口是两种用于

嵌入式开发调试神器全解析:JTAG、SWD、串口打印
评论