stm32 JLINK JTAG口PA15复用普通IO口功能

本文详细介绍了如何在STM32中将JLINK JTAG口PA15复用为普通IO口,包括打开GPIO时钟、关闭JTAG功能、配置GPIO输出,并提供了相关代码示例。适合Io口资源紧张的项目开发者参考。

stm32 JLINK JTAG口PA15复用普通IO口功能


最近在做项目的时候发现IO口紧张,就用jlink调试口PA15用做led输出口

一、手册说明

![]![在这里插入图片描述](https://img-blog.csdnimg.cn/14cc79059b00426dbaaa63a2283d360c.png
从手册可以看出PA15默认为JLINK JTDI调试口,要用作普通IO口输出需要打开复用功能才行

二、配置步骤

1.打开GPIOA RCC时钟和复用功能

代码如下(示例):

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);

2.关闭JTAG调试功能

代码如下(示例):

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);		

3.配置GPIO输出功能

代码如下(示例):

    GPIO_InitTypeDef GPIO_InitStructure;
    
    //PA15	OUT LED
    GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

4.GPIO操作

使能PA15为高电平输出

    GPIO_SetBits(GPIOA,GPIO_Pin_15);

使能PA15为低电平输出

    GPIO_ResetBits(GPIOA,GPIO_Pin_15);

总结

PB4、PB3复用成普通口输入输出时操作类似,在此不做详述
STM32默认启动时,
PB4、PB3、PA15三个引脚不是普通IO,而是JTAG的复用功能,分别为JNTRST、JTDI、JTDO

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

### 解决STM32 J-Link下载调试接与GPIO引脚冲突 #### 调试接概述 对于STM32微控制器,J-Link可以通过多种方式连接到目标板进行编程和调试操作。通常情况下,J-Link使用的是SWD(Serial Wire Debug)或JTAG来实现这一功能[^1]。 #### SWD/JTAG引脚分配 当采用SWD模式时,仅需两根信号线:SWCLK(串行时钟)和SWDIO(双向数据)。而在JTAG模式下,则需要用到五条线路,分别是TCK、TDI、TDO、TMS以及nTRST。这些管脚在某些型号的STM32芯片中可能被复用作为通用输入输出(GPIO),这就可能导致配置不当的情况下发生资源竞争问题[^3]。 #### 冲突原因分析 如果开发者试图将用于SWD或JTAG通信的引脚重新定义为其他用途(比如控制LED灯或其他外设),那么这可能会干扰正常的调试过程。因为一旦改变了默认的功能设置,在尝试通过上述提到的标准协议访问设备内部寄存器时就会遇到障碍。此外,即使是在应用程序正常运行期间更改了这些特殊引脚的状态也可能影响后续再次进入调试状态的能力。 #### 解决策略 为了防止此类冲突的发生并确保能够顺利地利用J-Link完成程序烧写及断点调试等工作,建议遵循以下几点指导原则: - **保持原始功能不变**:除非绝对必要,否则不应改变任何涉及SWD/SWDIO或者JTAG相关针脚的工作模式; - **合理规划硬件布局**:设计电路板时应充分考虑到未来可能需要使用的调试手段,并预留足够的空间给必要的测试点; - **软件层面规避风险**:可以在启动阶段暂时禁用所有对外部世界开放的中断源和服务请求直到初始化完毕后再开启它们,从而减少意外触发的可能性; - **借助专用库简化管理**:例如使用官方提供的HAL驱动程序可以更方便地处理复杂的多路复用情况,避免手动编写底层代码带来的潜在错误[^2]。 ```c // 示例:初始化GPIO而不影响SWD功能 void setup_gpio(void){ __HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟 GPIO_InitTypeDef GPIO_InitStruct = {0}; /* 配置PA13, PA14保留为SWD */ GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_14; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出(这里是为了说明不改动其原有属性) GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

章鱼哥嵌入式开发

坚持不易,你们的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值