一,GPIO简介
GPIO(General Purpose Input Output)通用输入输出口
可配置为8种输入输出模式
引脚电平:0V~3.3V(0V),部分引脚可容忍5V
输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
二,GPIO基本结构
所有的GPIO都是关在APB2总线上。在控制板上有如下针脚
三,GPIO位图
3.1 保护二极管
先看右边的的两个保护二极管,VDD接3.3V,VSS接地。当右侧IO引脚输入大于3.3V不会对内部电路产生伤害。
如果右侧IO针脚输入了一个负电压,那么在VSS和IO会形成回路,对内部起到保护作用。
只有当输入电压是0-3.3V,才会进入系统内部 。
3.2 上拉输入
3.3 下拉输入
3.4 浮空输入
输入不是高电平就是低电平,当外部IO什么都不接,这个时候处于浮空状态,极易受外界干扰,就不能确定输入的是高电平还是低电平。所以我们在程序中常用上拉或者下拉输入。
上拉输入:默认输入高电平
下拉输入:默认输入低电平
3.5 肖特基触发器
只在大于上限或者小于下限时做变化,所以简易逻辑如下图 ,
低于上限不一定会发生变化,高于下限也不一定会变化。
有效避免电压波动导致的输入抖动情况。
3.6 推婉输出
推婉输出模式下,输出1,P=MOS导通 ,N-MOS断开,I/O输出高电平
输出0,P=MOS断开 ,N-MOS导通,I/O输出低电平
推婉输出有绝对的控制权。也较强输出。
3.7 开漏输出
在开漏输出模式下,P-MOS无效,只有N-MOS工作。
在多级通讯中,这种模式避免设备之间的相互干扰。
也可用于5V的电平信号输出。当寄存器输出0,是N-MOS导通,输出低电平。
当输出1时,由外部的上拉电阻拉高电平。实现5V通电。
3.8 关闭输出
综上如下表
|------|---------|-------|-------|--------------------------|
| | 输出寄存器的值 | P-MOS | N-MOS | 输出 |
| 推婉输出 | 1 | 导通 | 关闭 | 高电平 |
| 推婉输出 | 0 | 关闭 | 导通 | 低电平 |
| 开漏输出 | 1 | 无效 | 关闭 | 高阻模式(只有低电平有驱动能力。比如I2C引脚) |
| 开漏输出 | 0 | 无效 | 导通 | 低电平 |
| 关闭输出 | 1 | 无效 | 无效 | 端口关闭,外部信号控制 |
| 关闭输出 | 0 | 无效 | 无效 | 端口关闭,外部信号控制 |
四,GPIO模式 简易电路图
通过配置GPIO的端口配置寄存器,端口可以配置成以下8种模式
4.1 程序中代码配置
程序中的GPIO模式配置 枚举如下
cpp
typedef 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的初始化配置代码举例(A0针脚,推婉输出)
cpp
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO模式,赋值为推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIO引脚,赋值为第0号引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速度,赋值为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //将赋值后的构体变量传递给GPIO_Init函数
//函数内部会自动根据结构体的参数配置相应寄存器
//实现GPIOA的初始化