GPIO(Genral Purpose Input Output)通用输入输出I/O口
GPIO的输入输出
输出模式
在输出模式下可以控制端口输出高低电平,用以驱动LED,蜂鸣器,模拟通信协议输出的时序等等。
输入模式
在输入模式下可读取端口的高低电平或电压,用于读取按键的输入,外接模块电平信号输入,ADC电压采集,模拟通信协议接收数据等。
GPIO的八种输入输出方式
浮空输入:能够读取引脚的电平信号,当引脚没有信号传入时则引脚为悬空状态读取的电平信号既可能是高电平有可能是低电平,故电平不确定。
上拉输入:能够读取引脚的电平信号,当引脚没有信号传入时则引脚为悬空状态读取的电平信号由于内部的上拉电阻,使得引脚悬空的时候为高电平状态。
下拉输入:能够读取引脚的电平信号,当引脚没有信号传入时则引脚为悬空状态读取的电平信号由于内部的下拉电阻,使得引脚悬空的时候为低电平状态。
模拟输入:不能读取外设引脚电平,引脚直接接入内部的ADC转换。
开漏输出:可以输出电平到引脚上,高电平呈现高阻态没有驱动能力,低电平接地(VSS),即存在下拉电阻,使得低电平具有较强的驱动能力。
推挽输出:可以输出电平到引脚上,高电平接电源(VSS)有较强的驱动能力,低电平接地(VSS)同样有较强的驱动能力,即存在上拉和下拉电阻,使得高、低电平均具有较强的驱动能力。
复用开漏输出:引脚信号来自片上外设,其余特征与上面阐述一致。
复用推挽输出:引脚信号来自片上外设,其余特征与上面阐述一致。
注意:开漏输出时P-MOS无效
推挽输出时P-MOS和N-MOS均有效
输出控制可能对来自输出数据寄存器的数值取反,因为手册阐述的是在开漏模式时,对输入数据寄存器的读访问可得到I/O状态,在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值。
引脚电平范围
大部分引脚的电平为0~3.3V,部分引脚可以容忍5V的电压。
GPIO基本结构
GPIO的初始化配置
初始化的目的是使得上图引脚端口(例如PB0、PA0等连接到APB2的桥接线上)
1.调用RCC_APB2PeriphClockCmd()开启APB2的时钟
RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
第一个参数为我们APB2连接的外设,第二个参数是对该外设进行使能或失能
2.调用GPIO_Init()并根据GPIO_InitStruct里面具体的参数来对GPIOx进行初始化
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
GPIOx中x的取值范围可以是(A~G)中的任意一个来选择相应GPIO上连接的外围设备。
该结构体中有三个参数GPIO_InitStruct.GPIO_Mode来选择GPIO八种输入输出模式中的一种,
GPIO_InitStruct.GPIO_Pin用于选择初始化的端口好,可以是端口号的组合(例如:或运算)
GPIO_InitStruct.GPIO_Speed对模式的最大输出速度进行选择,具体选择见下表中的配置模式来进行选择
注意:表中的00是保留的意思,即保持复位后的状态。
参考代码
以下是一个初始化PB1和PB11的代码
void GPIOB_Init()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_1;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
GPIO_ResetBits(GPIOB,GPIO_Pin_1|GPIO_Pin_11);//设置PB1和PB11为低电平
}
注意:
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)是把相应的端口设置为低电平;
GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin_x)是把相应的端口设置为高电平。
GPIOx中x的取值范围可以是(A~G)中的任意一个来选择相应GPIO上连接的外围设备。
GPIO_Pin_x中的x是的取值范围是0~15,并且函数中可以填他们的组合,如实例代码所示。