STM32的PB3、PB4、PA14、PA15引脚可以在使用ISP烧录的情况下释放出来,作为普通IO口使用。
初始化代码如下:
void Gpio_init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); 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_ResetBits(GPIOB,GPIO_Pin_4); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_3); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_14); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_15); }
在实际测试的时候,若发现工程内上述引脚仍无法当做普通IO使用,很可能是上述初始化代码后还执行了GPIOA或GPIOB的时钟使能代码,解决办法为:上面这段初始化代码放在所有IO初始化最后就好了。
问题原因:
当把PB3、PB4、PA14、PA15初始化之后,若再次调用GPIOA或GPIOB端口的时钟使能代码的话,会使得这些引脚变回JTAG或SWD的引脚
即上述初始化完成之后不能再执行:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
否则引脚会变回JTAG或SWD的引脚,而无法作为普通IO使用
注:上述初始化代码把所用引脚均配置为推挽输出,可根据需要自行配置为其他模式