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

描述

写嵌入式代码只是第一步,调试才是决定项目能不能顺利推进的关键。

MCU 不跑?外设不响应?代码跑飞?

没有合适的调试手段,排查问题就像摸黑找路。

本文带你搞懂三大调试利器 —— JTAG、SWD、串口打印。不仅对比优缺点,还提供实战操作步骤 + 代码示例,让你学完就能上手。

一、JTAG —— 复杂系统的“放大镜”

原理与特点

  • 接口:4~5 根信号线(TDI、TDO、TCK、TMS,可选 TRST)
  • 功能:单步运行、断点、寄存器查看、内存读写
  • 应用:Cortex-A、FPGA、复杂 SoC

Keil/MDK 操作步骤

  1. 接入 J-Link / ULINK 调试器
  2. 打开 Project → Options → Debug,选择 JTAG 调试
  3. 编译工程,点击 Download 烧写固件
  4. 按 F5 进入调试,支持:
  • 单步运行(F10/F11)
  • 查看寄存器
  • 内存监视

OpenOCD 命令行示例

  1. openocd -f interface/jlink.cfg -f target/stm32f4x.cfg

进入 GDB 调试:

  1. arm-none-eabi-gdb build/firmware.elf
  2. (gdb) target remote localhost:3333
  3. (gdb) monitor reset halt
  4. (gdb) load
  5. (gdb)continue

 小贴士:JTAG 引脚多,布线复杂,注意避免长线和交叉走线导致信号干扰。

二、SWD —— MCU 调试的首选

原理与特点

  • 接口:2 根线(SWDIO、SWCLK)
  • 功能:断点、寄存器访问、内存修改
  • 应用:STM32、NXP、Nordic 等 Cortex-M

Keil/MDK 操作步骤

  1. 接入 ST-LINK
  2. Project → Options → Debug → ST-Link Debugger
  3. Utilities → 选择 Use ST-LINK 作为编程器
  4. 按 F5 进入调试,支持断点、变量观察

代码断点示例

  1. int main(void){
  2.     HAL_Init();
  3.     MX_GPIO_Init();
  4.  
  5. int counter =0;
  6. while(1){
  7.         counter++;// 在这里设置断点,调试时观察 counter 值变化
  8. }
  9. }

 小贴士:用 SWD 调试时,可以结合 ITM/SWO 输出,打印实时日志而不占用 UART。

三、串口打印 —— 最接地气的调试方式

原理与特点

  • UART 将变量、状态输出到上位机
  • 本质:调试日志(printf 调试)
  • 应用:逻辑验证、状态监控、无调试器场景

实现步骤

  1. MCU 初始化 UART(波特率 115200 常见)
  2. 在 fputc 重定向 printf
  3. 打开 串口调试助手(SSC/Putty/Termite),选择对应 COM 口
  4. 查看输出调试日志

代码示例

  1. #include"stdio.h"
  2.  
  3. int fputc(int ch,FILE*f){
  4.     HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY);
  5. return ch;
  6. }
  7.  
  8. int main(void){
  9.     HAL_Init();
  10.     MX_USART1_UART_Init();
  11.  
  12. int value =42;
  13.     printf("Debug: value = %d\r\n", value);
  14.  
  15. while(1){
  16.         HAL_Delay(1000);
  17.         printf("Loop running...\r\n");// 在串口助手中观察输出
  18. }
  19. }

 小贴士:打印过多可能改变程序时序(海森堡效应),建议只保留关键日志。

四、三者对比表

调试方式接口线数功能范围优点缺点典型应用
JTAG4~5 根全面(断点、寄存器、内存)功能齐全,标准化引脚多,速度一般SoC、FPGA 调试
SWD2 根MCU 调试引脚少,速度快仅限 Cortex-MSTM32、Cortex-M
串口打印2 根程序流程、变量输出简单直观占资源,功能有限基础逻辑调试

五、如何选择?

  • 开发初期逻辑验证 → 串口打印
  • 常规 MCU 调试 → SWD
  • 复杂系统/SoC/FPGA → JTAG

最佳实践:组合使用

  • SWD 断点调试
  • 串口打印关键日志
  • JTAG 处理复杂系统问题

总结

  • JTAG 功能最全,适合复杂系统
  • SWD 精简高效,MCU 调试首选
  • 串口打印 简单直接,快速验证逻辑

熟练掌握并灵活组合三者,能让你的调试效率飞跃提升,少走弯路。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分