32F103xx系列单片机/PA13|PA14|PB15|PB3|PB4作为普通GPIO口/JTAG|SWD调试仿真接口作为GPIO使用/GPIO_SWJ_SWDPENABLE_REMAP

本文详细指导如何在Cortex-M单片机中将JTAG/SWD调试接口转换为普通GPIO,包括引脚配置、代码示例和恢复SWD功能的方法,适用于GD32F103等MCU。

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

相信大家在对单片机编程时都遇到过端口复用的问题,特别是在引脚数量有限的MCU当中;今天给大家讲解下在使用ARM Cortex-M内核的下载/调试接口JTAG和SWD引脚如何作为普通GPIO的使用方法。

一、准备工作

1、32F103xx系列单片机的用户手册和数据手册【我这边以国产GD32系列单片机为例】

二、JTAG|SWD调试仿真接口讲解

1、前言:在产品的软件开发阶段,单片机的调试是一个很关键的步骤,然而很多山寨的程序在开发中,甚至都没有调试的概念,而只是把程序生成的映像文件hex或bin,通过串口直接烧入片子,再根据错误症状来判断问题,然后修改程序重新烧,周而复始,直到问题解决或放弃为止。在开发比较大的应用程序时,强劲的调试手段是非常重要的。当 bug 复杂到无法分析时,只能用调试来追踪它。如果没有调试手段,简直就束手无策。正因为此,在 CM3 中,调试机能突然在一夜之间,就从丑小鸭变成了白天鹅,得到了登峰造极般的,令人非常惊艳的强化。CM3 提供了多种多样的调试模型和调试组件,其中我们使用做多的莫过于JTAG和SWD的调试仿真接口了。

2、接口定义

在用户手册的调试章节中,我们会看到如下的介绍:

可以看到这里讲解的是ARM Cortex-M3内核,并不是某一款单片机的型号,所以在使用ARM Cortex-M3内核单片机时都有相同且标准的调试接口,大家可以以一举三,适用于任何CM3的内核MCU;

关于具体引脚的定义如下:

需要注意的是,下面红色框框中的引脚在MCU上电复位后的功能是调试模式,具体引脚定义和引脚功能描述可以在数据手册中进行查看(PA13/PA14/PA15/PB3/PB4):

简单总结JTAG|SWD调试仿真接口引脚定义如下:

那么如何把引脚作为普通的GPIO使用呢?

下面图中给出了我们禁止JTAG|SWD调试仿真接口寄存器设置方法:

三、JTAG|SWD调试仿真接口作为GPIO口使用的具体方法:

如果仅仅是把调试接口作为普通的GPIO口,根据上图可知:我们可以通过配置SWJ_CFG[2:0]寄存器的这三个bit位即可(可以看出默认000的情况下,MCU的PA13/PA14/PA15/PB3/PB4引脚都是作为了调试接口),当然如果采用库函数进行开发的话,也可以通过相应的API函数进行配置;

 gpio_pin_remap_config(uint32_t gpio_remap, ControlStatus newvalue);

//其中参数uint32_t gpio_remap有以下几种选择:
GPIO_SWJ_NONJTRST_REMAP    // full SWJ(JTAG-DP + SW-DP),but without NJTRST,对应寄存器SWJ_CFG[2:0]的001;注明:这种方式下可以使用JTAG和SWD的接口进行程序下载;
GPIO_SWJ_SWDPENABLE_REMAP  //JTAG-DP disabled and SW-DP enabled,对应寄存器SWJ_CFG[2:0]的010;注明:这种方式下可以使用SWD接口进行程序的下载;JTAG接口已经不能在使用了,此种方式使用最为广泛;
GPIO_SWJ_DISABLE_REMAP     //JTAG-DP disabled and SW-DP disabled,对应寄存器SWJ_CFG[2:0]的100;注明:仿真调试接口被全部禁止,所以引脚都作为了GPIO口进行使用,除非GPIO引脚十分紧张的情况下,否则不推荐采用此种设置方法,会造成使用SWD时程序下载和仿真都失效的情况;当然在实际的使用过程中,还是需要根据自己项目的真实情况进行相关引脚的配置。

针对GD系列的单片机,可以参考以下的代码(GD32F103RCT6为例):

void LED_Flash_Init(void)
{
 
	//Enable the peripherals clock
	rcu_periph_clock_enable(RCU_GPIOA);
	rcu_periph_clock_enable(RCU_GPIOB);
	
	/* configure led GPIO port */ 
	gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_15);
	gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_3|GPIO_PIN_4);
	
	//设置初始化后的引脚电平状态
	gpio_bit_set(GPIOA,GPIO_PIN_15);
	gpio_bit_set(GPIOB,GPIO_PIN_3|GPIO_PIN_4);
	
}


/*!
    \brief      main function
    \param[in]  none
    \param[out] none
    \retval     none
*/
int main(void)
{
  //For use the delay function 
	systick_config();	
	
	
	//For use the Printf function 
	USART_Init();
	
	rcu_periph_clock_enable(RCU_AF);	
//	gpio_pin_remap_config(GPIO_SWJ_NONJTRST_REMAP,ENABLE);			//full SWJ(JTAG-DP + SW-DP),but without NJTRST
	gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP,ENABLE);		//JTAG-DP disabled and SW-DP enabled
//	gpio_pin_remap_config(GPIO_SWJ_DISABLE_REMAP,ENABLE);				//JTAG-DP disabled and SW-DP disabled
	
	
	printf("JTAG-DP disabled and SW-DP enabled demo code\r\n");	
	printf("PA13/PA14 USE SW-DP, PA15/PB3/PB4 USE GPIO\r\n");	
	//For use the GPIO function 
	LED_Flash_Init();

	while(1)
	{
		
		//Led light on
		gpio_bit_set(GPIOA,GPIO_PIN_15);
		gpio_bit_set(GPIOB,GPIO_PIN_3|GPIO_PIN_4);
		delay_1ms(500);

		//Led light off
		gpio_bit_reset(GPIOA,GPIO_PIN_15);
		gpio_bit_reset(GPIOB,GPIO_PIN_3|GPIO_PIN_4);
		delay_1ms(500);

    }
}

需要特别说明,因为此功能涉及到了复用功能,有操作AFIO_PCF0的寄存器,所以同样需要打开AF时钟,库函数操作如下:

rcu_periph_clock_enable(RCU_AF);

四、如何恢复SWD的功能:

如果在使用的过程中配置为了GPIO_SWJ_DISABLE_REMAP,SWD的功能都禁止了,那么单片机是不是就废了,这颗MCU就不能再进行仿真的操作了呢?答案是否定的,首先是需要把代码中的GPIO_SWJ_DISABLE_REMAP替换为GPIO_SWJ_SWDPENABLE_REMAP ,替换后重新去编译工程文件,生成最新的Hex文件;然后可以通过以下两种方案进行解决:

1、在复位引脚上下功夫,操作相对简单,但是有一定的技巧性:

如果MCU的复位操作是通过外部物理按键实现的话,可以按住复位按键,再点击download程序下载按钮,此时再同步松开MCU的复位按键,特别注意复位按键松开的时间和点击下载按钮的时间需要保持一定的同步,所以说有一定的技巧性;如果设备没有复位按键,同样可以采用镊子短路复位引脚上的电容进行实现;

2、采用MCU的ISP方式进行程序的再次下载,这个需要硬件上修改BOOT的上下拉电平配置,操作上相对复杂一些:

因为MCU在出厂前都有一段固定在Flash内部的BootLoader,通过串口可以进行程序的下载;但需要通过修改Boot的连接方式,具体Boot的配置如下第②中方式:

然后通过MCU原厂的ISP上位机即可实现单片机的ISP程序下载,UART的配置一般为115200-8-1-N,如果你恰巧使用的是GD的MCU,可以通过搜索“GigaDevice_MCU_ISP_Programmer_V3.0.2.5782”进行免费获取。

以上就是针对Cortex-M内核MCU中JTAG|SWD调试仿真接口做为普通GPIO使用的简单说明,希望可以帮助到正在不断调试的你。

------------------------------------------------------------------------------------------------------------------------------------------

因为小编自己能力水平有限,文中难免有错误或表达不到的信息,还望广大阅读者留言批评指正,谢谢。

### STM32F103C8T6 配置 PA15PB3PB4普通 IO 使用方法或初始化代码 在 STM32F103C8T6 中,PA15PB3PB4 默认被配置为 JTAG 功能引脚。如果需要将这些引脚用作普通 IO ,则必须通过重映射功能禁用其默认的 JTAGSWD 功能,并重新配置为通用 GPIO 模式。 以下是具体的配置方法和初始化代码: #### 初始化代码示例 ```c #include "stm32f10x.h" void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; // 使能相关 GPIO 的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); // 配置 PA15PB3PB4普通 IO // 禁用 JTAG 功能,保留 SWD 调试功能 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // 禁用 JTAG,仅保留 SWD[^4] // 配置 PA15 为推挽输出模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置速度为 50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置 PB3 为推挽输出模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_Init(GPIOB, &GPIO_InitStructure); // 配置 PB4 为推挽输出模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_Init(GPIOB, &GPIO_InitStructure); } int main(void) { // 初始化 GPIO GPIO_Configuration(); while (1) { // 示例:切换 PA15 的电平状态 GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET); // 设置 PA15 为高电平 for (volatile int i = 0; i < 1000000; i++); // 延时 GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_RESET); // 设置 PA15 为低电平 for (volatile int i = 0; i < 1000000; i++); // 延时 } } ``` #### 说明 1. **时钟使能**:通过 `RCC_APB2PeriphClockCmd` 函数使能 GPIOA、GPIOB 和 AFIO 的时钟。 2. **重映射配置**:调用 `GPIO_PinRemapConfig` 函数,选择 `GPIO_Remap_SWJ_JTAGDisable` 来禁用 JTAG 功能,同时保留 SWD 调试功能[^4]。 3. **GPIO 配置**:使用 `GPIO_InitTypeDef` 结构体配置 PA15PB3PB4 为推挽输出模式,并设置速度为 50MHz。 4. **主循环**:在主循环中,通过 `GPIO_WriteBit` 函数控制 PA15 的电平状态。 #### 注意事项 - 如果需要完全禁用 JTAGSWD 功能,可以将重映射配置改为 `GPIO_Remap_SWJ_Disable`,但这样会导致无法使用调试工具进行调试。 - 在实际应用中,根据需求选择合适的重映射配置以平衡调试功能和引脚资源的使用
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值