STM32 PB3 PB4 PA15引脚作为普通IO口使用指南
stm32的PB3 PB4 PA15引脚可以在使用SWD仿真和烧录的情况下释放出来,作为普通IO口使用。
查看数据手册的引脚定义可以看到,PA15引脚复位后的主要功能为JTDI,PB3为JTDO,PB4为JNTRST,如果把这些引脚作为普通引脚使用时,需要进行重映射。

通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)的SWJ_CFG[2:0]位,配置为“启用SW-DP,关闭JTAG-DP”来释放PA15(JTDI), PB3(JTDO), PB4(NJTRST)引脚。详见中文参考手册V10.2版本p118 表35 调试端口映像。

另外,注意PB3的脚注,“I/O口只可在不使用异步跟踪时使用”,详见中文参考手册V10.2版本p748 29.16.3 调试MCU配置寄存器。
DBGMCU_CR寄存器的bit7:5(TRACE_MODE[1:0]和TRACE_IOEN),配置TRACE_IOEN=0,不分配跟踪引脚。见下表。

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






