STM32 JNTRST JTDI JTDO引脚用做普通IO方法

本文详细介绍了如何在STM32默认配置下,通过禁用JTAG功能来启用SWD接口进行调试仿真。包括使用特定语句配置GPIO引脚为普通IO,适用于SWD接口调试需求。

STM32默认启动时PB4、PB3、PA15三个引脚不是普通IO,而是JTAG的复用功能,分别为JNTRST、JTDI、JTDO。

当我们试用SWD接口调试仿真时,这三个引脚可以用作普通IO。

具体做法就是禁用JTAG功能。只需使用以下语句即可。

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

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);      /*使能SWD 禁用JTAG*/

### 如何将 JTDIJTDO 等 JTAG 引脚用于普通 IO 操作 在 STM32 微控制器中,JTAG 引脚(如 JTDOJTDI)通常用于调试功能。然而,在某些情况下,可以将这些引脚重新配置为普通 IO 使用。以下是实现此功能的详细方法和示例代码。 #### 1. 配置步骤 ##### 1.1 打开 GPIO 时钟和复用功能 在使用任何 GPIO 引脚之前,必须先启用对应的时钟。对于 STM32,可以通过 `RCC_APB2PeriphClockCmd` 函数启用 GPIOA 或 GPIOB 的时钟[^3]。 ```c RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); ``` ##### 1.2 关闭 JTAG 调试功能 为了释放 JTAG 引脚以供普通 IO 使用,需要禁用 JTAG 调试功能。这可以通过调用 `GPIO_PinRemapConfig` 函数并设置参数 `GPIO_Remap_SWJ_JTAGDisable` 来实现。该函数会释放 PB3(JTDI)、PB4(JTDO)和 PA15(JTCK)引脚[^3]。 ```c GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); ``` ##### 1.3 配置 GPIO 输出功能 接下来,配置所需的 GPIO 引脚为输出模式。以下是一个示例,将 PB3 和 PB4 配置为推挽输出模式[^3]。 ```c GPIO_InitTypeDef GPIO_InitStructure; // 初始化 PB3 和 PB4 为输出模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出 GPIO_Init(GPIOB, &GPIO_InitStructure); // 设置默认输出状态 GPIO_SetBits(GPIOB, GPIO_Pin_3 | GPIO_Pin_4); ``` ##### 1.4 GPIO 操作 完成上述配置后,可以像操作其他普通 IO 引脚一样,使用 `GPIO_SetBits` 和 `GPIO_ResetBits` 函数来控制引脚的高低电平[^3]。 ```c GPIO_SetBits(GPIOB, GPIO_Pin_3); // 设置 PB3 为高电平 GPIO_ResetBits(GPIOB, GPIO_Pin_4); // 设置 PB4 为低电平 ``` #### 2. 示例代码 以下是一个完整的代码示例,展示如何将 JTAG 引脚(PB3 和 PB4)配置为普通 IO 并进行基本操作[^3]。 ```c #include "stm32f10x.h" void generalIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; // 启用 GPIOB 和 AFIO 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); // 禁用 JTAG 功能,释放 PB3 和 PB4 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // 配置 PB3 和 PB4 为推挽输出模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); // 设置默认输出状态 GPIO_SetBits(GPIOB, GPIO_Pin_3 | GPIO_Pin_4); } int main(void) { generalIO_Init(); while (1) { GPIO_SetBits(GPIOB, GPIO_Pin_3); // 设置 PB3 为高电平 GPIO_ResetBits(GPIOB, GPIO_Pin_4); // 设置 PB4 为低电平 for (volatile uint32_t i = 0; i < 1000000; i++); // 延时 GPIO_ResetBits(GPIOB, GPIO_Pin_3); // 设置 PB3 为低电平 GPIO_SetBits(GPIOB, GPIO_Pin_4); // 设置 PB4 为高电平 for (volatile uint32_t i = 0; i < 1000000; i++); // 延时 } } ``` #### 3. 注意事项 - 在禁用 JTAG 功能后,无法通过 JTAG 接口进行调试。如果需要恢复调试功能,请重新配置 JTAG 引脚。 - 确保在项目中不需要使用异步跟踪功能时才禁用 JTAG,因为某些映射选项可能会限制异步跟踪功能。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值