STM32 PB3 PB4 PA15引脚作为普通IO口使用指南

本文详细指导如何在STM32PB3PB4PA15引脚上解除SWD仿真和烧录限制,将其转换为通用IO口。包括设置AFIO_MAPR寄存器、释放调试端口以及关键初始化代码。务必遵循相关注释,避免再次激活JTAG功能导致IO失效。

STM32 PB3 PB4 PA15引脚作为普通IO口使用指南

stm32的PB3 PB4 PA15引脚可以在使用SWD仿真和烧录的情况下释放出来,作为普通IO口使用。
查看数据手册的引脚定义可以看到,PA15引脚复位后的主要功能为JTDI,PB3为JTDO,PB4为JNTRST,如果把这些引脚作为普通引脚使用时,需要进行重映射。
img
通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)的SWJ_CFG[2:0]位,配置为“启用SW-DP,关闭JTAG-DP”来释放PA15(JTDI), PB3(JTDO), PB4(NJTRST)引脚。详见中文参考手册V10.2版本p118 表35 调试端口映像。
img
另外,注意PB3的脚注,“I/O口只可在不使用异步跟踪时使用”,详见中文参考手册V10.2版本p748 29.16.3 调试MCU配置寄存器。
DBGMCU_CR寄存器的bit7:5(TRACE_MODE[1:0]和TRACE_IOEN),配置TRACE_IOEN=0,不分配跟踪引脚。见下表。
img
初始化代码如下:

GPIO_InitTypeDef GPIO_InitStructure;  
  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);// 使能复用时钟和引脚GPIO时钟  
DBGMCU->CR = DBGMCU->CR & ~((uint32_t)1<<5); // 不分配跟踪引脚,释放PB3      
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);  // 切换到SWJ调试,释放PA15,PB4, PB3
      
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;  
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
GPIO_Init(GPIOB, &GPIO_InitStructure);  
GPIO_SetBits(GPIOB,GPIO_Pin_4);  
      
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;  
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
GPIO_Init(GPIOB, &GPIO_InitStructure);  
GPIO_SetBits(GPIOB,GPIO_Pin_3);  
  
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;  
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
GPIO_Init(GPIOA, &GPIO_InitStructure);  
GPIO_ResetBits(GPIOA,GPIO_Pin_15);  

在实际测试的时候,发现工程内PB3 PB4 PA15无法当做普通IO使用,最后发现解决办法为:
上面这段初始化代码放在所有IO初始化最后就好了。
通过现象调试找到问题原因:

当把PB3 PB4 PA15初始化好之后,如果再次调用GPIOA GPIOB接口的时钟代码的话,会使得PB3 PA15引脚变回JTAG的引脚

即初始化完之后不能再执行如下代码,否则PB3 PA15引脚会变回JTAG的引脚,而无法作为普通IO使用

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);  

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值