1.GPIO简介
(1)GPIO通用输入输出口
(2)可配置8种输入输出模式,四种输出,四种输入。
(3)引脚电平:0V~3V3,部分引脚可容忍5V.
(4)输出模式下可控制端口输出高低电平。
(5)输入模式下可读取端口的高低电平或电压。
2.GPIO基本结构
3.GPIO使用方法
(1).初始化时钟:RCC_APB2PerphClockCmd()。
(2).定义结构体:GPIO_InitTypeDef GPIO_InitStructure
(3).赋值结构体:
GPIO_InitSturcture.GPIO_Mode = 选择8中输入输出模式。
GPIO_InitSturcture.GPIO_Pin = 选择引脚。
GPIO_InitSturcture.GPIO_Speed = 选择输出速度。
(4).使用GPIO_Init函数将指定外设初始化好。
3.1 GPIO使用示例:
int main(void)
{
//初始化时钟,使能GPIOA
RCC_APB2PeriphClockCmd(RCC_APB2periph_GPIOA,ENABLE);
//定义结构体
GPIO_InitTypeDef GPIO_InitStructure;
//初始化结构体
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP; //选择推挽输出-GPIO_Mode_Out_PP
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //选择GPIOA的Pin0口
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHZ; //选择50MHZ速度
//初始化外设
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
4.GPIO的位结构
注
(1).施密特触发器:将变化缓慢的输入信号整形成边沿陡峭的矩形脉冲。
(2).输出控制有开漏输出,推挽输出。在推挽输出下,高低电平都有驱动能力,在开漏输出下,只有低电平有驱动能力。
(3)
输入模式:及读取端口的高低电平。
输出模式:控制端口的高低电平。
5.GPIO的输入输出模式
输入模式:
浮空输入 | 数字输入 | 可读取引脚电平。若引脚悬空,则电平不确定 |
上拉输入 | 数字输入 | 可读取引脚电平,内部连接上拉电阻,悬空默认高电平(弱上拉) |
下拉输入 | 数字输入 | 可读取引脚电平,内部连接下拉电阻,悬空默认低电平(弱下拉) |
模拟输入 | 模拟输入 | GPIO口无效,引脚直接接入内部ADC |
输出模式:
开漏输出 | 数字输出 | 可输出引脚电平,高电平为高阻态,低电平接VSS(低电平有驱动能力,高电平无) |
推挽输出 | 数字输出 | 可输出引脚电平,高电平接VDD,低电平接VSS(高低电平都有驱动能力) |
复用开漏输出 | 数字输出 | 由片上外设控制,高电平为高阻态,低电平接VSS(低电平有驱动,高电平无) |
复用推挽输出 | 数字输出 | 由片上外设控制,高电平接VDD,低电平接VSS(高低电平都有驱动能力) |
注:
(1).在输出模式下,只有配置或复用模式才可以将GPIO空的输出交给片上外设。
(2).模拟输入是ADC的专属模式。
(3)浮空输入一般不用,除非上拉输出和下拉输出对端口的影响很大。
6.GPIO相关函数
6.1.1 void GPIO_DeInit(GPIO_TypeDef* GPIOx);
作用:调用该函数所指定的GPIO外设会被复位。
6.1.2 void GPIO_AFIODeInit(void);
作用:调用该函数,AFIO会被复位。
6.1.3 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
作用:用结构体的参数来初始化GPIO口。
6.1.4 void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
作用:可把结构体变量赋值一个默认值
6.1.5 GPIO口的读取函数(输入模式相关)
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:读取输入寄存器的一位
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
作用:读取输入寄存器的全部
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:读取输出寄存器的一位
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
作用:读取输出寄存器的全部
6.1.6GPIO的写入函数(输出模式相关)
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:在GPIOx的GPIO_Pin_x上写下1
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:在GPIOx的GPIO_Pin_x上写下0
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
作用:在GPIOx的GPIO_Pin_x上写下0或1,其中Bit_RESET为0,Bit_SET为1
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
作用:在GPIOx的全部16口写入1或0
6.1.7void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:用来锁定GPIO配置,防止意外更改
6.1.8 GPIO关于AFIO的事件输出函数
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_EventOutputCmd(FunctionalState NewState);
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
作用:用来进行引脚重映射。第一个参数选择要重映射的方式,第二个参数是新的状态。
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
作用:该函数可以配置AFIO的数据选择器,来选择我们想要的中断引脚(用于EXTI外部中断)
void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);
作用:于以太网有关