stm32标准库开发(一):八种GPIO模式介绍
八种GPIO模式
stm32定义了GPIO的八种模式,分别为4种输入模式和4种输出模式,使用场合、时机有所不同:
1
2
3
4
5
6
7
8
9
10typedef enum
{ GPIO_Mode_AIN = 0x0,
GPIO_Mode_IN_FLOATING = 0x04,
GPIO_Mode_IPD = 0x28,
GPIO_Mode_IPU = 0x48,
GPIO_Mode_Out_OD = 0x14,
GPIO_Mode_Out_PP = 0x10,
GPIO_Mode_AF_OD = 0x1C,
GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;
输入模式
- GPIO_Mode_AIN:模拟输入模式;这是最容易区分的模式,只有需要模拟输入时才需要这种模式,例如AD模数转换。
后面三种模式可以放在一起讨论
GPIO_Mode_IN_FLOATING:浮空输入模式
GPIO_Mode_IPD:下拉输入模式
GPIO_Mode_IPU:上拉输入模式
这三个输入模式是配置红框位置而来,开关如果全部打开不连接电阻,那么输入电平就完全来自引脚,因为稳压二极管的存在,能够限定引脚电压为0~3.3V(stm32部分引脚标识FT,代表能够输入5V电压),这就是浮空输入模式;如果连接上拉电阻,那么输入时空闲电平会被限定在高电平的VDD,那么就是上拉输入模式;如果连接下拉电阻,输入时空闲电平被拉低至低电平Vss,就是下拉输入模式;
最常用的模式是上拉输入或者浮空输入,上拉输入一般用于一些简单设备,例如红外开关、光敏电阻、热敏电阻、按键、编码器等,检测是否有低电平输入;浮空输入说明识别的电平高低是不确定的,连接高阻抗电源、开漏输出,或者读取外设的数字输入电平是高电平还是低电平等;
输出模式
GPIO_Mode_Out_OD:开漏输出
GPIO_Mode_Out_PP:推挽输出 这两个模式配置的是蓝色框的Mos管:
选择推挽输出时,PMos管和NMos管都会工作,当配置输出高电平时,P管导通,N管截断,输出电平被上拉至VDD,一般为3.3V;当配置输出低电平时,N管导通,P管截断,输出电压被拉低到低电平阈值电压(姑且认为是0V);值得注意的是,这里的高低电压是有驱动能力的,例如驱动一个喇叭、LED等;这里的驱动性能,还可以理解成它有电源相似的能力,它的高低电平边沿很窄,因此具有很高的数据传输性能,例如SPI协议;另一方面,这种性能有时候是我们不想要的,因为它不能实现线与的功能,如果推挽输出并接,高电平会直接涌入与其并接的产生低电平的Nmos,导致器件直接损毁,线与示意:
选择开漏输出时,只有NMos管会工作,当配置产生低电平时,和推挽输出一样N管导通输出低电平;而高电平时,因为NMos管的漏极是开路的,我们说这个高电平没有驱动能力;因此在外设电路需要加上拉电阻,这个上拉电阻可以使得进入漏极电流小于场效应管的安全电流,此外,它将电压安全地上拉到VDD(场效应管的阻值达几百万欧,限流电阻一般为几千欧,分压几乎可以忽略不计)。再者,这里的VDD来自场效应管外部,因此可以是3.3V甚至是5V的电压,这就完成了电平转换,3.3V供电的单片机通过外设电路供电可以输出5V电压!此外,OD(Mos管,漏极开路)、OC(晶体管,集电极开路)门都可以实现线与功能,如下图,OD门并不直接输出高电平,因此不会出现灌流的情况。当下方的OD门输出低电平时,L直接被下拉到低电平,限流电阻保证了安全性。另一方面,这种弱驱动模式可以避免多机通信的干扰,所以I2C协议引脚采用了这种方式;
GPIO_Mode_AF_OD:复用开漏输出
GPIO_Mode_AF_PP:复用推挽输出 输出原理同开漏和推挽,只是这里是复用,复用是将控制权从CPU移交片上外设;
stm32片上外设有定时器、串口、I2C等相关,一个引脚可能是普通的GPIO,也可能是片上外设的引脚,例如串口、定时器的引脚,这时候就要通过复用功能。
stm32还有另外一种功能容易与其混淆,称重映射或者重定义。如果一个引脚已经固定被某个功能使用了,例如用作串口引脚,那么这个引脚的定时器功能就不能被使用了,stm32也许将该功能映射到其他引脚,这时只需要按照重定义步骤配置一下,就能在其他引脚使用该功能。
复用与重映射
查看stm32引脚定义,引脚有三个功能分类,分别是主功能、默认复用功能和重定义功能:
主功能主要是两种,最采用的是GPIO口,用左常规的输入和输出;另一种是用于调试的引脚,例如下载的程序的引脚,这些引脚通常兼容多种调试协议,例如JTAG(Joint Test Action Group,联合测试行动小组)和SWD(Serial Wire Debug),后者需要引脚更少,且高速调试更稳定,Jlink兼容JTAG,stlink、Ulink等兼容两种协议,还有许多厂商也会制作自己的仿真器link。stm32中定义了5个引脚主功能为JTAG所用,其中重复有两个主功能兼容SWD,可以通过重定义,将其映射为普通的GPIO,但是届时就无法通过Link下载器下载和调试程序了,只能通过串口下载修正。
默认复用功能即将GPIO复用为片内外设引脚,例如希望通过定时器实现引脚电平计数、测频率等,复用的方法直接使用复用推挽输出/复用开漏输出即可。(更详细可参考本系列的《TIM定时中断》等片内外设文章。
1
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
除了将调试引脚映射到GPIO,重映射的另一种情况是将一个引脚的复用,映射到另一个引脚上,stm32支持了有限的引脚重定义功能,使得其他引脚在某引脚被占用时能够享受某些引脚的外设资源,这个过程除了要使用复用输出,还需要AFIO干预。
例如,GPIO_PartialRemap1_TIM2
应该参考数据手册,定义了部分映射功能1,实现了两个引脚的重映射:
1
2RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //使能AFIO
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE); //将定时器引脚按方式1映射
调试端口的重映射:慎用GPIO_Remap_SWJ_Disable; 1
2
3
4
5
6
7RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //使能AFIO
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
//几种取消调试端口参数
GPIO_Remap_SWJ_NoJTRST //Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST
GPIO_Remap_SWJ_JTAGDisable //JTAG-DP Disabled and SW-DP Enabled
GPIO_Remap_SWJ_Disable //Full SWJ Disabled (JTAG-DP + SW-DP)