STM32笔记之 SWJ(JTAG-DP和 SW-DP)

写在前面:
本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。

 

目录

一、调试支持(DBG)

二、调试端口(serial wire and JTAG)

三、JTAG-DP和 SW-DP切换

四、JTAG/SWD复用功能重映射

五、跟踪引脚分配

六、释放 PA15、PB3、PB4作为 GPIO口使用


 

一、调试支持(DBG)

在 STM32F10x中,支持两种调试接口:1、串行接口;2、JATAG调试接口

其调试框图如下:

由以下几部分组成:

  • SWJ-DP:串行/JTAG调试端口
  • AHP-AP:AHB访问端口
  • ITM:执行跟踪单元
  • FPB:闪存指令断点
  • DWT:数据触发
  • TPUI:跟踪单元接口(仅较大封装的芯片支持)
  • ETM:嵌入式跟踪微单元(在较大的封装上才有支持此功能的引脚)

 

二、调试端口(serial wire and JTAG)

STM32F10xxx内核集成了串行/ JTAG调试接口 (SWJ-DP)。这是标准的 ARM CoreSight调试接口,包括 JTAG-DP接口(5个引脚)和 SW-DP接口(2个引脚)。

  • JTAG调试接口(JTAG-DP)为AHP-AP模块提供5针标准JTAG接口。
  • 串行调试接口(SW-DP)为AHP-AP模块提供2针(时钟+数据)接口。

在 SWJ-DP接口中,SW-DP接口的 2个引脚和 JTAG接口的 5个引脚中的一些是复用的。

上面的图显示异步跟踪输出脚 (TRACESWO) 和 TDO是复用的,因此异步跟踪功能只能在 SW-DP调试接口上实现,不能在 JTAG-DP调试接口上实现。

 

三、JTAG-DP和 SW-DP切换

JTAG调试接口是默认的调试接口。
如果调试器想要切换到 SW-DP,必须在 TMS/TCK上输出一指定的 JTAG序列(分别映射到 SWDIO和 SWCLK),该序列禁止 JTAG-DP,并激活 SW-DP。该方法可以只通过 SWCLK和 SWDIO两个引脚来激活 SW-DP接口。

指定的序列是:
1. 输出超过 50个 TCK周期的TMS(SWDIO)= 1信号
2. 输出 16个 TMS(SWDIO)信号 0111100111100111 (MSB)
3. 输出超过 50个 TCK周期的TMS(SWDIO) = 1信号

 

四、JTAG/SWD复用功能重映射

当 STM32引脚不够用时,我们可以分配 JTAG/SWD的引脚作为普通 GPIO口来使用。

从上图或者通过查看数据手册的引脚定义可以看到,当系统复位后,会默认把以上引脚复用为调试功能;PA15引脚复位后的主要功能为 JTDI、PB3为 JTDO、PB4为 JNTRST,如果把这些引脚作为普通引脚使用时,则需要进行重映射。通过设置复用重映射和调试 I/O配置寄存器 (AFIO_MAPR) 的 SWJ_CFG[2:0]位,可以改变上述重映像配置。

 

这里的配置,在标准库文件中几个相关的宏定义分别为:

#define GPIO_Remap_SWJ_NoJTRST      ((uint32_t)0x00300100)  /*!< Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST */

#define GPIO_Remap_SWJ_JTAGDisable  ((uint32_t)0x00300200)  /*!< JTAG-DP Disabled and SW-DP Enabled */

#define GPIO_Remap_SWJ_Disable      ((uint32_t)0x00300400)  /*!< Full SWJ Disabled (JTAG-DP + SW-DP) */

并通过 GPIO_PinRemapConfig();函数写使(失)能

 

五、跟踪引脚分配

从上图我们可以知道,通过 SWJ_CFG[2:0]位重新选择映射 GPIO,可以释放对应的 IO口,但是,特别注意的是 PB3这个跟踪引脚;在另一张图中:

注意 PB3的脚注,“ I/O口只可在不使用异步跟踪时使用 ”

这里说一下异步跟踪模式和同步跟踪模式

  • 异步模式

异步模式需要 1个额外的引脚并且存在于所有的封装。此模式仅在串行调试接口有效(不支持JTAG调试接口)。

  • 同步模式

同步模式根据跟踪数据长度使用 2到 6个额外引脚,并且只存在于大封装芯片里。此外,此模式在 JTAG调试接口和串行调试接口下都可使用,并提供比异步跟踪更好的数据输出量。

因此,调试器需要设置 Debug MCU Configuration寄存器的 TRACE_IOEN和 TRACE_MODE[1:0]位来分配跟踪引脚。默认时,跟踪脚是不分配的。对应如下图:

 

六、释放 PA15、PB3、PB4作为 GPIO口使用

一般,我们都是用 JTAG接口或 SW接口对程序进行调试下载;常见的都是用 ST-Link来下载,所以用 SW接口用的比较多,但平常我们在引脚够用的时候,并不考虑去修改这些调试接口;当引脚不够用时,可以保留 SW-DP的接口,释放 PA15、PB3、PB4。

释放 PA15和 PB4这个容易,通过 GPIO_PinRemapConfig();函数,把 JTAG-DP接口禁止,只允许 SW-DP接口。

而 PB3这个调试引脚,比较特殊一点,需要设置 DBGMCU_CR寄存器,这个寄存器位说明如下:

我们要做的就是配置 TRACE_IOEN=0,不分配跟踪引脚。

上面说了,异步跟踪功能只能在 SW-DP调试接口上实现,当我们在软件上选择使用 SW-DP调试时,便会把一开始默认的 JTAG-DP切换到 SW-DP,而对应的,也会开启异步跟踪功能,使得我们可以在 IDE上可以进入 DEBUG模式调试。

就拿 keil编译来说:

一般我们是使用以下那种 ST-Link debug链接器的,如下图:

接着按上图的箭头指示点进去,可以得到下图:

然后,对应着上图,方框那里嘛,就是 SW-DP的 SWDIO去识别链接器,箭头指示那里,就是选择是 SW-DP模式还是 JATAG-DP模式,对应的选择不同,方框里的界面也不一样(应该说整个界面配置吧),可以看一下在 JATAG-DP模式的界面,如下图:

另外,由于我们使用的 ST-Link一般都是只有四根线,所以这也是为什么看到的教程都是说在 Port选项这里选 SW。

扯了这么多,最后,释放 PA15、PB3、PB4总的代码就是:

DBGMCU->CR = DBGMCU->CR & ~((uint32_t)1<<5);	// 不分配跟踪引脚,释放 PB3

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);	// 使能复用时钟和引脚 GPIO时钟
	
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);	// 切换 SWJ调试,释放 PA15,PB4, PB3

值得注意的是,当释放禁用了 PB3的异步跟踪后,就无法正常进行 DEBUG调试了。

引用:如果设置为第二种,即禁用JTAGSWD,那么下一次将无法烧写程序。 引用:解除STM32JTAG锁定有几种可能的原因和解决方法。首先,程序中使用了JTAGSWD下载,所以需要检查程序中的相关设置。其次,可能是BOOT脚的焊接或接触不良,或者BOOT引脚没有正确配置。还有可能是选错了启动文件,导致程序无法正常运行。此外,堆或栈越界溢出也会导致芯片无法正常工作。最后,电源问题也可能导致STM32锁定,因此需要确保供电电压稳定。 引用:对于STM32解除JTAG锁定的方法,可以通过对引脚进行复用重映射来解决。要重映射某个引脚,必须先启动时钟,然后设置AFIO的MAPR寄存器的相应位。具体操作可以通过设置AFIO的MAPR寄存器为AFIO_MAPR_SWJ_CFG_1或AFIO_MAPR_SWJ_CFG_2来解除JTAG锁定。 综上所述,要解除STM32JTAG锁定,需要检查程序设置、BOOT脚连接、启动文件选择、堆或栈溢出和电源稳定等问题,并通过复用重映射的方法设置AFIO的MAPR寄存器解除JTAG锁定。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [STM32 不小心被锁住,解开方法](https://blog.csdn.net/VampireWolf/article/details/88958536)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [STM32如何解除自锁](https://blog.csdn.net/weixin_44077714/article/details/124695436)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值