news 2026/4/22 10:29:46

STM32F1项目实战:当I2C引脚不够用,如何安全“征用”SWD的PA13-PA15和PB3-PB5?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32F1项目实战:当I2C引脚不够用,如何安全“征用”SWD的PA13-PA15和PB3-PB5?

STM32F1引脚资源紧张?安全复用SWD引脚的工程实践指南

在嵌入式开发中,STM32F1系列因其性价比优势广受欢迎,但GPIO资源紧张的问题也时常困扰开发者。当项目需要更多I2C、SPI或普通GPIO时,那些被SWD/JTAG占用的引脚(PA13-PA15, PB3-PB5)就成了"看得见却用不了"的资源。本文将从实际工程角度,分享如何在不影响后续调试和固件更新的前提下,安全地复用这些宝贵引脚。

1. 理解SWD引脚复用的核心挑战

STM32F1的调试接口默认占用PA13(SWDIO)、PA14(SWCLK)、PA15(JTDI)、PB3(JTDO)和PB4(JTRST)等引脚。许多开发者尝试直接将这些引脚配置为GPIO时,会遇到两个典型问题:

  1. 硬件层面:即使代码中将引脚设置为GPIO模式,实际测量发现引脚状态异常
  2. 开发流程:禁用调试接口后,如何继续烧录和调试程序

问题的根源在于STM32的引脚复用优先级机制。调试接口的优先级高于普通GPIO,必须通过AFIO(Alternate Function I/O)寄存器明确配置才能释放这些引脚。

关键提示:在项目初期不建议立即禁用调试接口,应保留SWD功能直到主要功能开发完成

2. HAL库中的配置选项解析

HAL库提供了四个关键的宏定义来控制调试接口配置:

#define __HAL_AFIO_REMAP_SWJ_ENABLE() // 默认状态,启用全部JTAG+SWD #define __HAL_AFIO_REMAP_SWJ_NONJTRST() // 禁用NJTRST引脚(PB4) #define __HAL_AFIO_REMAP_SWJ_NOJTAG() // 禁用JTAG但保留SWD #define __HAL_AFIO_REMAP_SWJ_DISABLE() // 完全禁用JTAG和SWD

这些宏对应的实际配置如下表所示:

配置选项JTAG-DPSW-DP释放引脚适用场景
ENABLE启用启用默认状态,完整调试功能
NONJTRST启用(无NJTRST)启用PB4需要PB4作GPIO时
NOJTAG禁用启用PA15,PB3,PB4需要JTAG引脚但保留SWD调试
DISABLE禁用禁用全部需要最大GPIO资源时

实际项目选择建议

  • 开发阶段使用NOJTAG模式,保留SWD调试能力
  • 量产固件可使用DISABLE模式,但必须确保留有其他更新方式

3. 分阶段实施的工程实践

3.1 开发阶段:保留调试能力

在功能开发期间,建议采用以下配置:

void GPIO_Init(void) { __HAL_RCC_AFIO_CLK_ENABLE(); __HAL_AFIO_REMAP_SWJ_NOJTAG(); // 禁用JTAG但保留SWD // 配置PA15,PB3,PB4为所需功能 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 其他初始化代码... }

这种配置下:

  • 仍可通过SWD接口(PA13,PA14)进行调试
  • PA15,PB3,PB4可用作普通GPIO
  • 开发流程不受影响

3.2 稳定阶段:完全释放引脚

当功能稳定准备量产时,可考虑完全释放所有调试引脚:

void GPIO_FullRelease(void) { __HAL_RCC_AFIO_CLK_ENABLE(); __HAL_AFIO_REMAP_SWJ_DISABLE(); // 完全禁用调试接口 // 配置所有原调试引脚 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // PB3-PB4配置 GPIO_InitStruct.Pin = GPIO_PIN_3 | GPIO_PIN_4; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); }

重要注意事项

  1. 执行此操作后,常规SWD调试将不可用
  2. 必须确保留有其他固件更新方式,如:
    • 通过UART的Bootloader
    • 预留硬件复位进入系统存储区的方式
    • 使用NRST引脚强制进入编程模式

3.3 固件更新策略

禁用SWD后,可靠的固件更新机制尤为关键。以下是几种常用方案对比:

更新方式所需资源速度可靠性实现复杂度
UART BootloaderUART+特定引脚
USB DFUUSB接口
IAP(应用内编程)任意通信接口取决于接口
SPI Flash编程SPI接口+外部存储

推荐组合方案:

  1. 主应用程序通过UART实现IAP功能
  2. 备份Bootloader存储在系统存储区
  3. 通过特定引脚组合触发更新模式

4. 常见问题与调试技巧

4.1 引脚状态异常排查

当复用引脚不按预期工作时,建议按以下步骤排查:

  1. 确认时钟配置

    __HAL_RCC_AFIO_CLK_ENABLE(); // 必须开启AFIO时钟 __HAL_RCC_GPIOx_CLK_ENABLE(); // 开启对应GPIO组时钟
  2. 检查复用优先级

    • 调试接口 > GPIO
    • 确保已调用正确的__HAL_AFIO_REMAP_SWJ_xxx
  3. 验证硬件连接

    • 确认没有外部电路影响引脚状态
    • 检查复位电路是否正常工作

4.2 开发调试技巧

  • 条件编译管理:使用宏控制不同阶段的配置

    #define DEVELOPMENT_MODE 1 void Init_DebugPins(void) { #if DEVELOPMENT_MODE __HAL_AFIO_REMAP_SWJ_NOJTAG(); #else __HAL_AFIO_REMAP_SWJ_DISABLE(); #endif }
  • 版本回退机制:在代码中保留硬件复位恢复SWD的功能

    if(HAL_GPIO_ReadPin(BUTTON_GPIO_Port, BUTTON_Pin) == GPIO_PIN_RESET) { // 长按按键时恢复默认调试配置 __HAL_AFIO_REMAP_SWJ_ENABLE(); NVIC_SystemReset(); // 系统复位 }

5. 工程实例:复用SWD引脚实现多路I2C

以下是一个实际项目中复用PA15和PB3作为I2C接口的完整示例:

// i2c_sw.c #include "stm32f1xx_hal.h" #define USE_DEBUG_PINS_AS_I2C 1 void I2C_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; // 1. 启用必要时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_AFIO_CLK_ENABLE(); // 2. 根据模式配置调试引脚 #if USE_DEBUG_PINS_AS_I2C __HAL_AFIO_REMAP_SWJ_NOJTAG(); // 开发阶段保留SWD // 3. 配置PA15(SCL)和PB3(SDA)为开漏输出 GPIO_InitStruct.Pin = GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_3; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); #endif // 软件I2C初始化代码... } // 量产版本切换为完全释放模式 void I2C_ReleaseFull(void) { __HAL_AFIO_REMAP_SWJ_DISABLE(); // 重新初始化所有引脚 I2C_Init(); }

在项目开发中,我们通过这种分阶段的方式,既保证了开发效率,又能在最终产品中最大化利用GPIO资源。实际测试发现,复用后的I2C接口稳定性与常规GPIO实现的I2C无明显差异,通信速率可达400kHz。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 10:22:47

别死记硬背了!用这5个趣味小项目拆解PCEP Python认证核心考点

别死记硬背了!用这5个趣味小项目拆解PCEP Python认证核心考点 当Python初学者面对PCEP认证考试时,厚厚的考试大纲和枯燥的概念解释往往让人望而生畏。但谁说备考就一定要对着教材死记硬背?本文将带你通过5个趣味小项目,在动手实践…

作者头像 李华
网站建设 2026/4/22 10:21:45

深度解析Onekey:探索Steam清单自动化下载的技术架构与实战应用

深度解析Onekey:探索Steam清单自动化下载的技术架构与实战应用 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 在Steam游戏生态系统中,Depot清单文件的管理一直是开发者、…

作者头像 李华
网站建设 2026/4/22 10:21:20

3分钟搞定网盘限速烦恼:LinkSwift八大网盘直链下载完整指南

3分钟搞定网盘限速烦恼:LinkSwift八大网盘直链下载完整指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 /…

作者头像 李华
网站建设 2026/4/22 10:18:52

终极指南:3步实现Rhino到Blender的3D模型无缝导入

终极指南:3步实现Rhino到Blender的3D模型无缝导入 【免费下载链接】import_3dm Blender importer script for Rhinoceros 3D files 项目地址: https://gitcode.com/gh_mirrors/im/import_3dm 还在为Rhino 3D模型无法在Blender中使用而烦恼吗?impo…

作者头像 李华