当项目调试的时候,发现PA15引脚无论配置输出高还是低或者输入,均只能输出3.3V的高电平。
目前STM的硬件调试有两种方法,JTAG和SW的方式,目前个人认为最好的方式就是SW,因为它只占用PA13和PA14两个IO。而JTAG还要多占用PB3,PB4,PA15三个IO口。很浪费资源。
通常使用SW的方式,但是STM默认会启用SW和JTAG两种。也就是说,默认情况下,PA13、PA14、PB3、PB4、PA15均不能作为普通io使用。
因为没有使用JTAG,所以为了让PB3,PB4,PA15这三个IO变为普通io,必须解除调试端口复用。
AFIO(Alternate Function Input/Output)模块主要用于配置一些外设的复用功能(alternate function)。
配置步骤:
1.打开AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
2.查芯片引脚手册
这里我们将PA15从JTDI变成PA15普通引脚。
3.使用GPIO_PinRemapConfig()函数
这里我们主要看蓝色的三个参数:
第一个,GPIO_Remap_SWJ_NoJTRST,就是解除 JTRST 引脚的复用。在引脚定义表中就是 NJTRST 也就是PB4。使用 GPIO_Remap_SWJ_NoJTRST 参数,PB4 就变为正常的GPIO口了。其他四个端口PA13、PA14、PA15、PB3仍然是调试端口,不能当做GPIO口来使用。
第二个,GPIO_Remap_SWJ_JTAGDisable,就是解除 JTAG 调试端口的复用,在引脚定义表中就是PA15、PB3、PB4这三个端口全都变回GPIO口,PA13和PA14任为SWD的调试端口。
第三个,GPIO_Remap_SWJ_Disable,就是把SWD和JTAG的调试端口全部解除,在引脚定义表中就是PA13、PA14、PA15、PB3、PB4这5个引脚全部变成普通的GPIO,没有调试功能了。这个参数不可随意调用,一旦调用这个参数并且下载程序后,调试端口就没有了,这之后的STLINK就下载不进去程序了,这时只能使用串口下载,下载一个没有解除调试端口的新的程序。这样调试端口才能重新使用。
以上描述对应参考手册中的以下两个表:
GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE); //PB4
GPIO_Remap_SWJ_NoJTRST:只将PB4变成普通IO口(GPIO)。
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //PA15|PB3|PB4
GPIO_Remap_SWJ_JTAGDisable:JTAG-DP 禁用 + SW-DP 使能。只将PA15 ,PB3 ,PB4变成普通IO口。
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); //PA13|PA14|PA15|PB3|PB4
GPIO_Remap_SWJ_Disable:将上述串口都变成普通IO口,完全禁用(JTAG+SW-DP)。使调试端口失效,不建议使用。
通常就是解除 JTAG 的复用,保留 SWD 的复用,所以这里选GPIO_Remap_SWJ_JTAGDisable参数。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟,即端口复用时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//失能JTAG
这两句就ok了,以后就可以将上述三个引脚作为普通io了。