GPIO:通用输入输出端口
(1) 输出功能:控制引脚输出高、低电平,实现开关控制
GPIO引脚接入LED,控制LED的亮灭
接入继电器或三极管,可通过继电器或三极管控制外部大功率电路的通断
(2) 输入功能:检测外部输入电平
GPIO引脚连接到按键,通过读取电平状态判断按键是否按下
保护二极管:防止引脚外部过高或过低的电压输入
引脚电压高于VDD_FT,上方二极管导通
引脚电压低于VSS,下方二极管导通
上下拉电阻:控制引脚默认状态的电压
开启上拉,引脚电压默认为高电平
开启下拉,引脚电压默认为低电平
开启浮空,引脚状态不确定
上下拉寄存器GPIOx_PUPDR控制引脚的上下拉以及浮空模式
推挽输出:引脚高低电平切换时,两个管子轮流导通,P管负责灌电流,N管负责拉电流
开漏输出:上方的P-MOS管完全不工作,可设置引脚为低电平和高阻态,正常使用必须外接上拉电阻。
线与特性:多个开漏模式引脚连接到一起,只有当所有引脚都输出高阻态,由上拉电阻提供高电平,此时高电平的电压为外部上拉电阻所接的电源电压;其中一个引脚为低电平,整个线路都为低电平。
推挽输出应用场景:输出高低电平且需要高速切换开关状态的场合
开漏输出应用场景:在I2C、SMUS通讯等需要线与功能的总线电路以及电平不匹配场合
STM32 IO对外输出5V电平
双MOS管结构电路的输入信号
GPIOx_ODR输出数据寄存器控制GPIO引脚的输出电平
GPIOx_BSRR置位/复位寄存器影响GPIOx_ODR
复用功能用到GPIO输出,例如USART的发送引脚
GPIO引脚经过上下拉电阻,连接到施密特触发器,模拟信号转换为0和1的数字信号,存储在输入数据存储器GPIOx_IDR,读取该寄存器可了解GPIO引脚的电平状态。
复用功能用到GPIO输入,例如USART的接收引脚
模拟输入:GPIO引脚用于ADC采集电压的输入通道,ADC采集到原始的模拟信号
模拟输出:GPIO引脚用于DAC作为模拟电压输出通道,模拟信号直接输出到引脚
用于模拟功能,引脚的上下拉不起作用
在输入模式,施密特触发器打开,输出被禁止
可设置上拉、下拉或浮空模式
输出速度可配置
推挽模式,输出数据寄存器GPIOx_ODR可控制IO输出高低电平;
开漏模式,输出数据寄存器GPIOx_ODR可控制IO输出高阻态或低电平;
施密特触发器打开,可通过输入数据寄存器GPIOx_IDR读取IO的实际状态;
可使用上拉、下拉或浮空模式;
引脚初始化后默认输出低电平,上拉不会影响引脚的电平状态,上拉只起到小幅度提高输出电流能力
输出使能,输出速度可配置,可工作在开漏和推挽模式;
输出信号来源于其他外设,输出数据寄存器GPIOx_ODR无效;
输入可用,通过输入数据寄存器GPIOx_IDR读取IO的实际状态,一般直接使用外设的寄存器获取该数据信号;
可使用上拉、下拉或浮空模式但引脚初始化后默认输出低电平,上拉不会影响引脚的电平状态,上拉只起到小幅度提供输出电流能力
双MOS管结构关闭,施密特触发器停用,上下拉禁止
typedef struct
{
uint32_t GPIO_Pin; //GPIO引脚
GPIOMode_TypeDef GPIO_Mode; //工作模式
GPIOSpeed_TypeDef GPIO_Speed; //速率
GPIOOType_TypeDef GPIO_OType; //输出类型
GPIOPuPd_TypeDef GPIO_PuPd; //上下拉模式
}GPIO_InitTypeDef;
typedef enum
{
GPIO_Mode_IN = 0x00, //输入模式
GPIO_Mode_OUT = 0x01, //输出模式
GPIO_Mode_AF = 0x02, //复用模式
GPIO_Mode_AN = 0x03 //模拟模式
}GPIOMode_TypeDef;
typedef enum
{
GPIO_Low_Speed = 0x00, //2MHz
GPIO_Medium_Speed = 0x01, //25MHz
GPIO_Fast_Speed = 0x02, //50MHz
GPIO_High_Speed = 0x03 //100MHz
}GPIOSpeed_TypeDef;
typedef enum
{
GPIO_OType_PP = 0x00, //推挽输出
GPIO_OType_OD = 0x01 //开漏输出
}GPIOOType_TypeDef;
typedef enum
{
GPIO_PuPd_NOPULL = 0x00,//浮空
GPIO_PuPd_UP = 0x01,//上拉
GPIO_PuPd_DOWN = 0x02 //下拉
}GPIOPuPd_TypeDef;