【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 内核支持两种调试接口:
接口 | 引脚 | 特点 |
---|---|---|
JTAG | 4~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 资源的调试方式。
以上,欢迎有从事同行业的电子信息工程、互联网通信、嵌入式开发的朋友共同探讨与提问,我可以提供实战演示或模板库。希望内容能够对你产生帮助!