跳到主要内容

STM32 SWD 接口

介绍

SWD(Serial Wire Debug)是 ARM Cortex-M 微控制器中常用的一种调试接口。与传统的 JTAG 接口相比,SWD 只需要两根线(SWDIO 和 SWCLK)即可实现调试功能,节省了引脚资源,同时提供了高效的调试能力。STM32 微控制器广泛支持 SWD 接口,使其成为开发者在调试和编程时的首选工具。

在本教程中,我们将深入探讨 STM32 的 SWD 接口,包括其工作原理、配置方法以及实际应用场景。

SWD 接口的工作原理

SWD 接口使用两根信号线进行通信:

  1. SWDIO:双向数据线,用于传输调试数据。
  2. SWCLK:时钟信号线,用于同步数据传输。

SWD 接口通过这两根线实现了与调试器的通信,支持以下功能:

  • 读取和写入寄存器的值。
  • 控制 CPU 的运行状态(如暂停、继续、单步执行)。
  • 访问内存和外设。
备注

SWD 接口的时钟频率通常由调试器控制,常见的频率范围为 1 MHz 到 10 MHz。

SWD 接口的配置

在使用 SWD 接口之前,需要确保 STM32 微控制器的调试引脚已正确配置。通常,SWD 接口使用以下引脚:

  • PA13:SWDIO
  • PA14:SWCLK

在 STM32 的启动代码中,可以通过配置 GPIO 模式来启用 SWD 接口。以下是一个简单的配置示例:

c
#include "stm32f1xx_hal.h"

void SWD_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};

// 使能 GPIOA 时钟
__HAL_RCC_GPIOA_CLK_ENABLE();

// 配置 PA13 为 SWDIO
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

// 配置 PA14 为 SWCLK
GPIO_InitStruct.Pin = GPIO_PIN_14;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
提示

在实际项目中,通常不需要手动配置 SWD 引脚,因为 STM32 的启动代码会自动启用 SWD 接口。只有在特殊情况下(如引脚复用)才需要手动配置。

SWD 接口的实际应用

SWD 接口在 STM32 开发中有着广泛的应用,以下是几个常见的场景:

1. 调试程序

通过 SWD 接口,开发者可以使用调试器(如 ST-Link、J-Link)连接到 STM32 微控制器,实时监控程序的运行状态。例如,可以设置断点、查看变量值、单步执行代码等。

2. 烧录程序

SWD 接口不仅可以用于调试,还可以用于烧录程序。通过调试器,开发者可以将编译好的固件烧录到 STM32 的 Flash 存储器中。

3. 读取芯片信息

通过 SWD 接口,可以读取 STM32 微控制器的芯片信息,如芯片型号、Flash 大小、UID 等。以下是一个读取芯片 UID 的示例代码:

c
uint32_t GetChipUID(void) {
return *(uint32_t*)0x1FFFF7E8; // STM32F1 系列的 UID 地址
}
警告

不同系列的 STM32 微控制器,其 UID 地址可能不同。请参考具体芯片的数据手册。

总结

SWD 接口是 STM32 微控制器调试和编程的重要工具。通过本教程,您已经了解了 SWD 接口的工作原理、配置方法以及实际应用场景。希望这些知识能够帮助您更好地使用 STM32 进行开发。

附加资源

练习

  1. 尝试使用 SWD 接口连接 STM32 微控制器,并使用调试器设置断点。
  2. 编写一个程序,通过 SWD 接口读取 STM32 的芯片 UID,并打印到串口。
  3. 研究如何在 STM32 中禁用 SWD 接口,并尝试恢复其功能。