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

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

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

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);  

你可能感兴趣的:(STM32,stm32,单片机,gpio)