当前位置: 首页 > news >正文

【STM32】JTAG / SWD 调试原理简析

JTAG / SWD 调试原理简析(以 STM32F10x 为例)

(调试代码配合文章可使用,已经上传至我的资源中,下载打开即可使用。)

一、内核调试模块(Debug Module)的作用

STM32F10x 搭载的是 ARM Cortex-M3 内核,该内核内建硬件调试模块(如 DWT、FPB、ITM、NVIC),支持以下功能:

功能说明
设置断点指令断点(Break on PC)或数据断点(Watchpoint)
单步执行一条条地执行代码,便于调试
查看寄存器中断时可查看 CPU 寄存器、栈、变量等
读取/写入内存可在运行中修改变量值
调试不中断外设即使 CPU 停止,外设(如 UART)仍可运行(可配置)

在线仿真主要是借助ARM Cortex-M3 内核中的调试系统,在单片机当中,内核跟随原厂在设计之初自带的调试系统,使用调试系统可以知道单片机内核的实时运行情况,以及我们能够通过这个调试系统找寻到单片机在运行中发生的BUG。这篇文章是尝试使用这个调试系统来讲解如何控制单片机,并通过调试系统掌握单片机的运行状况。

请添加图片描述

二、调试通信接口(JTAG 与 SWD)

Cortex-M3 内核支持两种调试接口:

接口引脚特点
JTAG4~5 根线(TCK、TMS、TDI、TDO、TRST)功能丰富,支持链式连接多个设备
SWD(Serial Wire Debug)2 根线(SWDIO、SWCLK)ARM 推出的简化调试接口,占用少,主流

💡 STM32F10x 支持 JTAG / SWD 二选一,多数开发板默认使用 SWD,用于连接 ST-Link 或 J-Link。

在这里插入图片描述

使用ST-LINK连接开发板进行烧录和调试代码+ 仿真:(此处使用 SWD(Serial Wire Debug)方式,连接 2 根线(SWDIO、SWCLK)+ 一根 GND)

图一:
在这里插入图片描述
图二:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
JTAG/SWD模式设置库函数(在文件stm32f10x_gpio.c中):

void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)

三、调试过程简述

[开发板] <—(SWD/JTAG)—> [调试器:ST-Link、J-Link等] <—USB—> [主机:Keil/IAR]

调试器连接 MCU 后:1.初始化内核调试模块2.设置断点、观察点、调试寄存器3.停止 CPU 执行(可查看状态)4.继续运行或重启 CPU

在停止状态下,内核状态、外设状态都可查询,完成调试后可继续程序执行,不中断系统全局状态。

具体操作详情:

第一步:安装一下ST-Link的驱动:
在这里插入图片描述
第二步:连接上 ST-Link,给单片机供上电:如图一图二所示。

第三步(你自行选择任意项目调试即可,如有需要,也可以使用我在资源中提供的代码示例进行调试):调试代码示例。

点击魔法棒工具 ——> 选择 Debug ——> 选择ST-Link Debugger ——> 点击Setting

在这里插入图片描述

进入后可以看见 SWDIO 显示所连接单片机的ID:
在这里插入图片描述

选择仿真模式:(用keil软件模拟单片机运行的过程)
在这里插入图片描述
调试器常用功能(Keil / IAR 中):

功能实现方式
设置断点使用 FPB(Flash Patch & Breakpoint)模块
单步执行控制 PC(程序计数器)
查看变量通过 DAP 读取内存
写入变量在线修改变量值
查看寄存器NVIC/DWT 等模块
查看堆栈读取 PSP/MSP 栈指针

需要注意的事项:

SWD 模式调试时,PA13(SWDIO)、PA14(SWCLK) 会被占用,不可用于普通 IO。
若使用 JTAG 模式,占用更多引脚(一般不推荐)。
芯片若设置为“读保护”或“调试锁定”,调试器可能无法连接。
在低功耗模式下,部分芯片调试功能可能会失效,需要特别配置。

然后我们进入调试功能:
在这里插入图片描述
在这里插入图片描述

上面那一行用于调试的工具条:
在这里插入图片描述

运行代码,开启仿真,我们可以看见PC7产生了电平跳变,而PC8没有产生电平跳变:
在这里插入图片描述
在这里插入图片描述

接下来,我们将bug修改正确后,再次运行代码。这次,如果我们在写代码的过程中发现某个变量的值不对,我们可以将这个变量添加到 Watch 窗口,观测这个值在运行中的变化过程:(同时,可以打开逻辑分析仪,看见数值变化的过程)
在这里插入图片描述

以上,便是Keil MDK(Microcontroller Development Kit)进行嵌入式开发时,程序调试软件仿真的方法。


接下来,我们需要进行硬件的仿真方式:

为此新增一个按键(PC0)按键来控制蓝灯(PC6)的亮灭:
请添加图片描述
新增后记得将 PC6 初始化,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
因为硬件仿真没有软件仿真那样电平跳变的直观图,所以我们主要打开逻辑分析仪查看程序运行中的数值变化,

Keil 的调试方式对比:软件仿真 vs 硬件仿真
项目软件仿真(Software Simulator)硬件仿真(Hardware Debugger)
依赖硬件❌ 无需真实芯片✅ 依赖真实芯片和调试器(如 ST-Link、J-Link)
运行环境PC 上模拟执行在真实 MCU 上运行
调试精度逻辑级仿真,模拟部分外设精准反映芯片真实状态
外设支持部分支持(如 GPIO、定时器、串口)全部真实外设
速度可加快、暂停、单步实时运行,速度真实
中断响应模拟中断实时中断响应
适用阶段初期代码验证、无硬件时联调验证、系统调试
优点快速、便捷、无需硬件准确、全面、可检测硬件问题
缺点与真实芯片有差异需要烧录器与板子连接

软件仿真(Software Simulator)

✅ 特点:
不需要连接目标硬件
在 PC 上通过 Keil 内置模拟器运行代码
支持:寄存器查看单步、断点波形查看(Logic Analyzer)
部分外设支持,如:GPIO、UART、定时器(部分型号)🚫 不支持的内容:真正的 ADC 采样、电平变化实时中断延迟行为精确的外设时序📌 启用方式:1.打开 Options for Target2.选择 Debug 页面3.选择 Use Simulator4.点击 Start/Stop Debug 进入仿真

硬件仿真(Hardware Debugging)

✅ 特点:
通过 JTAG/SWD 接口 与目标板连接
依赖调试器设备,如:ST-Link(STM32官方)J-Link(Segger)CMSIS-DAP 调试器
在真实 MCU 芯片上运行和调试程序🔍 支持功能:
在线烧录程序
设置断点、单步执行
实时查看变量、内存、寄存器
外设调试(定时器、ADC、串口等)
Flash 断点(FPB)与中断嵌套调试📌 启用方式:
1.打开 Options for Target
2.Debug 选项卡中选择:ST-Link DebuggerJ-Link Debugger
3.点击 Start Debug 进入硬件调试

选择建议(实际开发中)

初学者练习、无开发板			软件仿真
学习 STM32 架构、验证逻辑		软件仿真
外设调试、硬件测试				硬件仿真
实时性分析、功耗测试			硬件仿真
RTOS 调度分析				硬件仿真

软件仿真适合无硬件时快速验证程序逻辑,硬件仿真是真实调试的必备手段,能精准反映 MCU 的运行状态和外设行为。

Cortex-M3 的内核调试模块提供了强大的调试能力,STM32F103 可通过 JTAG 或 SWD 接口与调试器通信,实现断点、单步、变量观察等功能,而 SWD 是更主流、更节省 IO 资源的调试方式。

以上,欢迎有从事同行业的电子信息工程、互联网通信、嵌入式开发的朋友共同探讨与提问,我可以提供实战演示或模板库。希望内容能够对你产生帮助!

http://www.lryc.cn/news/574512.html

相关文章:

  • IN子查询与JOIN的区别理解
  • 数据赋能(319)——安全与合规——数据安全可控
  • 烟花爆竹生产企业库房存储安全风险预警系统
  • 前端如何让用户回到上次阅读的位置?
  • 医学数据分析实战:冠心病发病因素可视化
  • vue3+echarts实现tab切换多个图表
  • 微信小程序节点相关总结
  • 服务器常见问题以及解决方案
  • 学习threejs,使用kokomi、gsap实现图片环效果
  • 【AI落地应用实战】Chaterm:重新定义终端操作的AI智能工具
  • mapbox基础,导出地图
  • 打表法从原理到实战详解
  • RabbitMQ + JMeter 深度集成指南:中间件性能优化全流程解析!
  • uniapp/Vue/微信小程序瀑布流,小红书瀑布流,豆瓣瀑布流,淘宝瀑布流布局
  • 微信小程序如何实现通过邮箱验证修改密码功能
  • ORACLE表空间扩容
  • jmeter接口测试
  • Github 2025-06-24Python开源项目日报 Top10
  • PyTorch topk() 用法详解:取最大值
  • Gym安装
  • 数据结构day2
  • 数组题解——​合并区间【LeetCode】
  • 使用 PyAEDT 设计参数化对数周期偶极子天线 LPDA
  • 如何解决TCP传输的“粘包“问题
  • HTTP面试题——缓存技术
  • Qt面试题汇总
  • 记录一下小程序城市索引栏开发经历
  • ✨从零搭建 Ubuntu22.04 + Python3.11 + PyTorch2.5.1 GPU Docker 镜像并上传 Docker Hub
  • Rocky8使用gvm配置Go多版本管理的微服务开发环境
  • uni-app项目实战笔记24--uniapp实现图片保存到手机相册