STM32Fxx JTAG/SWD复用功能重映射

本文探讨了STM32开发过程中遇到的问题:在使用JTAG接口时,部分引脚作为GPIO输出时出现异常。通过分析发现,未正确配置JTAG模式导致了这一现象。文中详细介绍了如何在STM32F103和STM32F407中正确配置JTAG以避免此类问题,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

 

         在实验室调车过程中,遇到的一个问题:为了每次下载程序方便,队员们往往会把Jlink插在板子上,可是在调车过程中发现,有时程序会莫名死掉,而同样的程序,把Jlink拔了,却不会出现此问题。且设置PB3,PB4均为输出口,且输出高电平,用万用表测量,PB4为高,PB3不是高电平,在看MDK 中的寄存器值,PB3,PB4都是高啊?寄存器的值怎么和实际的值不一样了?

 

      经过仔细研究找到了症结所在:

查看手册后发现在在复位后JTAG接口的PB3被设置为浮空(如果在该引脚悬空的情况下,读取该端口的电平是不确定的。)了,所以读回来的电平也是不确定的。

 

      STM32 的 PA13/PA14/PA15 PB3/PB4 主要是用来JTAG调试用的,于是在默认下是启动后为JTAG模式,项目程序中用到这几个引脚作为了普通I/O口,但却并没有对其进行I/O模式配置初始化。因此对于不需要JTAG,而需要充分利用GPIO口时,就需要将JTAG关闭,使能SWD,此时PA15/PB3/PB4便可作为普通IO用了。

 

 

STM32F103的用法


/*--JTAG-DP禁止,SW-DP允许, PA13, PA14用于调试仿真。PA15, PB3, PB4可用于SPI3--*/
    AFIO->MAPR &= 0x00FFFFFF; //
    AFIO->MAPR |= 0x02000000;


 

//关闭JTAG,保留SWD
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

 

工程代码实例:

 

 

STM32F407的用法

 

      使用STM32F系列,会遇到将JTAG口复用为SPI1或直接用做普通IO。

针对于F1系列,需要先禁止使能 JTAG,然后将其复用为其他口或者普通IO。 
针对F4系列,STM32F4库函数中,已经取消了GPIO_*PinRemapConfig()函数,对于复用功能使用GPIO*_PinAFConfig()函数了! 
但是在GPIO_PinAFConfig()函数已经没有禁止JTAG/SW等选项了,而是复用到AF0~AF15线上,其中AF0是系统功能(也是复位初始功能)。STM32F4复位后JTAG对应的管脚的对应的功能就是AF0,(GPIO_AF_MCO=0) 所以这句可以不用:GPIO_PinAFConfig( ,,GPIO_AF_MCO);

直接配置GPIOx_MODER为输出,或输入模式即可,但是注意:STM32F4复位后JTAG对应的管脚的GPIOx_MODER值是0x02,即 复用功能!所以直接配置GPIOx_MODER为所需的模式就可以了!
其中调试接口就是系统功能,这样需要禁用JTAG功能只需把引脚复用到AF1~AF15中的一个就行了。 

注:
1.直接复用就可使用相应的复用功能,不用想着失能JTAG了。 
2.最好不要 将JTAG复用为普通IO。 
3.PB3 PB4将其作为普通IO输出也可以,不过调试下载需要使用SWD下载调试。 
4.如果将所有的JTAG口作为GPIO使用,将会导致无法找到JTAG和SW设备,板子下不进去程序。

 

拓展:

STM32在程序中禁用JTAG功能后会出现不能进行JTAG仿真的现象。

在程序中,通常禁止JTAG的函数如下所示:

 //改变指定管脚的映射  GPIO_Remap_SWJ_Disable SWJ 完全失能(JTAG+SW-DP)

 GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);

 //改变指定管脚的映射 GPIO_Remap_SWJ_JTAGDisable JTAG-DP 失能 + SW-DP使能

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

当设置了以上语句后,当运行了这两个语句后,JTAG仿真就与目标失去去联系。

解决办法有:

1、设置启动模式为ISP模式(BOOT0=1、BOOT1=0)或设置启动模式为RAM运行模式(BOOT0=1、BOOT1=1)。

将开发板断电后重新上电,此时就因不是在用户程序模式,因此就不会执行禁用JTAG的语句,JTAG功能也就可以正常使用。

2、设置启动模式为ISP模式(BOOT0=1、BOOT1=0),用ISP程序将STM32的FLASH擦除,之后就可恢复JTAG功能。

3、如果你的仿真器支持SWD仿真模式,如IAR下用JLINK、MDK下用ULINK2。直接将仿真器的模式设为SWD模,就可以不受这个禁止JTAG功能的影响了。

 

参考资料来源:

STM32小问题-复用调试接口JTAG/SWD为普通GPIO

http://blog.youkuaiyun.com/wg1194024093/article/details/54849686

STM32常用管脚重定义外设

http://blog.sina.com.cn/s/blog_a07a3f180101e6ow.html

STM32f1 中JTAG引脚作为普通IO口设置方法以及STM32f4中的方法的不同

http://blog.youkuaiyun.com/wangyinyun1/article/details/48239725

### STM32 PB3 和 PB4 引脚重映射配置 对于 STM32 微控制器系列中的特定型号,如 STM32F103,可以对某些引脚执行重映射操作以改变其默认功能。针对 PB3 和 PB4 引脚的重映射主要涉及禁用 JTAG 接口并重新分配这些引脚的功能。 #### 开启 AFIO 时钟 为了能够访问和修改与重映射相关的寄存器,首先需要使能自动外设输入/输出 (AFIO) 外设的时钟。这可以通过调用 `RCC_APB2PeriphClockCmd` 函数来完成: ```c // 启用 APB2 总线上的 AFIO 周边设备时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); ``` #### 配置 GPIO 端口重映射 接下来,在完成了必要的初始化之后,通过设置相应的位域值于 `GPIO_PinRemapConfig` 或者直接写入控制状态寄存器(CSR),可以选择性地启用或关闭不同的重映射选项。具体来说,要实现仅保留 SWD 调试接口而将其他信号作为通用 I/O 使用的效果,则应选择如下方式之一来进行配置: - **使用库函数** ```c // 只保留SWD调试模式,即禁用了完整的JTAG连接, // 并使得PB3(PA15), PB4变更为普通I/O端口。 GPIO_Remap_SWJ_Disable(); ``` - **手动编写代码** 如果不依赖标准固件库而是更倾向于底层编程的话,可以直接操纵 CSR 寄存器内的相应字段达到相同目的: ```c // 手动清除相关位以取消全 JTAG 功能, // 实现只保留 SWD 的效果. AFIO->MAPR &= ~((uint32_t)(AFIO_MAPR_SWJ_CFG_Msk)); AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE; ``` 上述两种方法都可以有效地让 PB3 和 PB4 不再用于 JTAG 协议通信,转而成为普通的 GPIO 引脚供应用程序自由支配[^2]。 #### 初始化 GPIO 模式 最后一步是对新获得的 GPIO 引脚进行常规初始化,比如设定它们的工作模式(推挽输出、开漏输出等)、上下拉电阻属性以及初始电平状态等参数。这部分工作通常借助 HAL 库或其他高级 API 来简化开发流程。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值