GPIO(General Purpose Input Output)通用输入输出口 可配置为8种输入输出模式
其结构如下:
GPIO口挂在APB2总线上,在GPIO中又通过控制寄存器的后16位选取0~15号端口
8种不同的模式:
若开关接VDD则为上拉输入,接VSS则为下拉输入,都不接则为浮空输入
模拟输入(GPIO_Mode_AIN)
浮空输入(GPIO_Mode_IN_FLOATING )
上拉输入(GPIO_Mode_IPU)
下拉输入(GPIO_Mode_IPD )
开漏输出( GPIO_Mode_Out_OD )
推挽输出( GPIO_Mode_Out_PP )
复用开漏输出 ( GPIO_Mode_AF_OD )
复用推挽输出( GPIO_Mode_AF_PP
模拟输入方式就类似于ADC,通过读取引脚输入转换成为数字信号
若两个mos管都导通则为推挽输出,只有p-mos管导通为开漏输出
注意:在推挽输出模式下,高低电平都有驱动能力,开漏输出模式下,只有低电平有驱动能力
复用可以理解为 GPIO口被用作第二功能时的配置情况
配置常用函数:
总线时钟控制函数:
RCC_AHBPeriphClockCmd 对AHB总线时钟进行命令
RCC_APB2PeriphClockCmd 对APB2总线时钟进行命令
RCC_APB1PeriphClockCmd 对APB1总线时钟进行命令
GPIO配置函数:
GPIO_Init 对GPIO口初始化
GPIO_SetBits 对GPIO口中的,一个端口给高电平
GPIO_ResetBits 对GPIO口中的,一个端口给低电平
GPIO_WriteBit 对GPIO口中的,一个端口给写高低电平
GPIO_Write 对一整个GPIO口进写高低电平
GPIO_ReadInputDataBit 对GPIO口中的,一个端口读取输入(读取输入寄存器)
GPIO_ReadInputData 对一整个GPIO口读取输入(读取输入寄存器)
GPIO_ReadOutputDataBit 对GPIO口中的,一个端口读取输出(读取输出寄存器)
GPIO_ReadOutputData 对一整个GPIO口读取输出(读取输出寄存器)
常用配置端口模式:
(1) 浮空输入_IN_FLOATING ——浮空输入,可以做 KEY识别,RX1
(2)带上拉输入_IPU——IO内部上拉电阻输入
(3)带下拉输入_IPD—— IO内部下拉电阻输入
(4) 模拟输入_AIN ——应用 ADC模拟输入,或者 低功耗下省电
(5)开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能
(6)推挽输出_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的
(7)复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA)
(8)复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)
以配置led灯为例 :
void Led_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_SetBits(GPIOA,GPIO_Pin_1|);
}