使用环境(蓝色粗体字为特别注意内容) 1、软件环境:Keil MDK 5.15 2、硬件环境:STM32F103C8T6最小系统 在项目中需要用到STM32F103C8T6的GPIOA13引脚,发现无论如何初始化都无法控制该引脚的输出电平,该引脚一直输出高电平,而且非常稳定。查阅相关资料发现是JTAG模式搞的鬼。原因如下:
可以看到PA13口的Main function是JTMS-SWDIO,不是PA13,所以要想使用PA13的普通IO口能力,就要先把IO口的复用功能打开,再把JTMS-SWDIO功能关掉就可以。我从来不用JTAG的,于是采用以下方式禁用PA13引脚的JTAG模式:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);
发现问题依旧存在,多方查找资料,完全没有理由啊。。怀疑是IO口初始化方式不对,最后终于发现少了这一句:
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
最后贴上PA13引脚的调试代码;
Main.c
void DisableJTAG()
{
GPIO_InitTypeDef GPIO_InitStruct;
//开启AFIO 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// 改变指定管脚的映射 GPIO_Remap_SWJ_Disable SWJ 完全禁用(JTAG+SW-DP)
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);
// 改变指定管脚的映射 GPIO_Remap_SWJ_JTAGDisable ,JTAG-DP 禁用 + SW-DP 使能
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //配置模式
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13; //配置哪个IO口
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //配置IO口速度,仅输出有效
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
int main(void)
{
DisableJTAG(); // 禁用PA13的JTAG调试模式
delay_ms(1000);
while(1)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_13);
delay_ms(500);
GPIO_SetBits(GPIOA, GPIO_Pin_13);
delay_ms(500);
}
}
PA13引脚输出波形如下:
|