1、什么是GPIO
GPIO,即General Purpose Input Output(通用输入输出)简称IO口也叫总线扩展器,GPIO口是由引脚,功能寄存器组成,不同的架构中的GPIO封装不同,所使用的引脚数与寄存器数不同,具体可以参考芯片手册里的GPIO篇。
GPIO的作用是用来控制连接在此GPIO口上的外设,我们一般通过观察原理图找到当前板子的GPIO口引出在哪个口上或者排针上,我们把我们的外设接到上面去就可以通过GPIO与这个外设进行交互控制,在驱动层我们通过读写GPIO口中的功能寄存器来改变连接在此GPIO上的外设状态。
2、GPIO基本结构
该结构图来自STM32F10xxx,不同芯片的结构可能有所不同。
从上面结构图可以看出STM32F10xxx系列GPIO是由三个寄存器以及“TTL肖特基触发器、二极管、P-MOS管和N-MOS管”组成。
同时,在系统总线上桥接了两条线,一条是APB1,另一条是APB2,GPIO是挂载在APB2上的外设。
3、GPIO中电子器件的作用
输出数据寄存器:此寄存器的值会通过输出驱动器输出,其中指定位用于决定使用P-MOS还是N-MOS,有些位表示输出高低电平,如寄存器是4位的,其中0-2位代表输出模式,第3位表示输出电平信号,数字信号1则高电平,数字信号0则低电平。
P-MOS:Vgs(电荷)小于一定的值就会导通,利用这个特性和实现推挽与开漏输出。
N-MOS:Vgs(电荷)大于一定的值就会导通,利用这个特性和实现推挽与开漏输出
保护二极管:IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入。当引脚电压高于VDD时,上方的二极管导通;当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁,即只有电流不高于VDD也不低于VSS时才能正常通过。
TTL肖特基触发器:用于将电流信号转化为模拟数字信号0或1,当使用模拟输入时不会通过触发器,模拟输入是指不通过内部转换器,需要外部外接adc进行ad采样转换。
P-MOS与N-MOS的区别:P-MOS是接了VDD(正极电源),所以它拥有输出高电流的能力,所以给P-MOS高电平就可以导通P-MOS管,因为接了电源线的原因一旦导通了就可以让电源线里的工作电压流通,而N-MOS上面接了VSS,若给高电平是无法导通的,因为它没有接电源线是无法输出高电平的,如果给了N-MOS高电平即便流通了因为没有VDD电源线它也无法正常输出电流,若给了低电平则会流向VSS接地处,所以N-MOS只能给低电平才有效,若想N-MOS驱动可以外接上拉电阻。
高电平与低电平在电路里的区分:这里以TTL电路为列,高电平>3.4V,低电平<0.2V,所以即便N-MOS没有输出任何电流,它也是低电平。
MOS是场效应管,它有两种类型,P沟道与M沟道,至于哪种类型取决于MOS源接在VDD还是VSS,接在VDD就是P沟道,接在VSS就是M沟道。
4、GPIO配置
4.1 通用输出
在输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等。
4.1.1 推挽输出(Push-Pull)
连接在输出控制电路里的数字器件,可以输出高电平与低电平,输出数字信号0时N-MOS导通,P-MOS高阻,输出数字信号1时P-MOS导通,N-MOS高阻抗。
4.1.2 开漏输出(Open-Drain)
只能输出低电平,输出数字0时N-MOS导通,P-MOS高阻,无法输出高电平,若需要输出高电平需要在N-MOS晶体管后的引脚上接一个上拉电阻,将所有不确定的信号变成高电平,它只能从N-MOS这条线路上流过,所以就导致了它不能输出高电平。
4.1.3 通用输出配置步骤
//第一步,开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//定义一个GPIO初始化结构体,GPIOA0号引脚的推挽输出,50MHz的速度
GPIO_InitTypeDef GPIO_InitStructure;
//用点.引出这个结构体的成员
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //使用 | 可以同时配置多个端口
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//GPIO初始化
GPIO_Init(GPIOA, &GPIO_InitStructure);
4.2 复用功能输出
GPIO复用是指STM32的某些引脚可以除了提供标准的输入输出功能外,还可以被内置的外设(如定时器、串口、SPI、I2C等)用作特定的功能引脚。这些引脚通常被标记为AF(Alternate Function),表示它们有备选功能。
在设置复用功能输出的时候,引脚的控制权转移到了片上外设。
每个GPIO引脚可以有一个或多个复用功能。但是在任何时刻,一个引脚只能启用一个复用功能。但是有的引脚具有重映射功能,可以允许设计者将某些内置外设的引脚功能重新分配到不同的GPIO引脚上。复用功能的选择通常通过软件配置。
复用功能输出的配置步骤与通用输出配置步骤类似。
4.3 输入
在输入模式下,可以读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等。
对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉),且输入引脚必须由外部驱动。
4.3.1 模拟输入
GPIO无效,引脚直接接入内部ADC。
4.3.2 浮空输入
可读取引脚电平,若引脚电平悬空,则电平不确定。在用该模式的时候,端口一定要接上一个连续的驱动源,不能出现悬空的状态。
4.3.3 下拉输入
可读取引脚电平,内部连接下拉电阻,悬空时默认低电平。
4.3.4 上拉输入
可读取引脚电平,内部连接上拉电阻,悬空时默认高电平。