目录
1、GPIO简介
-
GPIO(General Purpose InPut Output)通用输入输出口
-
可配置8种输入输出模式
-
引脚电平:0~3.3V,部分引脚可容忍5V
-
输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
-
输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
2、GPIO基本结构
3、GPIO初始化函数
(1) RCC_APB2PeriphClockCmd()
启动GPIO时钟使能
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
(2) GPIO_InitTypeDef
定义GPIO结构体变量,包含GPIO_Pin、GPIO_Speed、GPIO_Mode三个变量
typedef struct
{
uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured.
This parameter can be any value of @ref GPIO_pins_define */
GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIOSpeed_TypeDef */
GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins.
This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;
GPIO_Pin:定义GPIO输出引脚,如GPIO_Pin_0
GPIO_Speed:定义GPIO输出最大翻转速度,分别为GPIO_Speed_10MHz、GPIO_Speed_2MHz、GPIO_Speed_50MHz
GPIO_Mode:定义GPIO输出模式,有8种模式
常量名 作用 GPIO_Mode_AIN 模拟输入 GPIO_Mode_IN_FLOATING 浮空输入,默认电平浮空 GPIO_Mode_IPD 下拉输入,默认低电平 GPIO_Mode_IPU 上拉输入,默认高电平 GPIO_Mode_Out_OD 开漏输出,强低电平驱动 GPIO_Mode_Out_PP 推挽输出,强高低电平驱动 GPIO_Mode_AF_OD 复用开漏 GPIO_Mode_AF_PP 复用推挽
(3) GPIO_Init()
GPIO结构体初始化,关联GPIOx和引脚GPIO_Pin_x
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
(4)GPIO初始化例程
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //外设总线时钟使能
GPIO_InitTypeDef GPIO_InitStruct; //定义GPIO变量结构体
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2; //选定2号引脚
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; //选择推挽模式
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //选择GPIO翻转速度
GPIO_Init(GPIOA,&GPIO_InitStruct); //初始化,关联GPIOA端口
4、GPIO输出函数
(1) GPIO_SetBits()
置位,使指定的GPIOx端口的GPIO_Pin置为高位
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
例如,指定GPIOA端口的2号引脚为高电平(需要提前初始化配置)
GPIO_SetBits(GPIOA, GPIO_Pin_2);
(2) GPIO_ResetBits()
复位,使指定的GPIOx端口的GPIO_Pin置为低位
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
例如,指定GPIOA端口的2号引脚为低电平
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
(3) GPIO_WriteBit()
写位,使指定的GPIOx端口的GPIO_Pin置为指定位
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
例如,指定GPIOA端口的2号引脚为高电平
GPIO_ResetBits(GPIOA, GPIO_Pin_2,1);
(4) GPIO_Write()
写端口,使指定的GPIOx端口置为指定位
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
例如,指定GPIOA端口的2号引脚为高电平(对应引脚需提前初始化配置)
GPIO_Write(GPIOA, 0x0004); //0000 0000 0000 0100
5、GPIO读取函数
这里在初始时GPIO的工作模式要选择输入模式,有模拟输入、浮空输入、上拉输入和下拉输入
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //外设总线时钟使能
GPIO_InitTypeDef GPIO_InitStruct; //定义GPIO变量结构体
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2; //选定2号引脚
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU; //选择上拉输入模式
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //选择GPIO翻转速度
GPIO_Init(GPIOA,&GPIO_InitStruct); //初始化,关联GPIOA端口
(1) GPIO_ReadInputData()
读出指定端口输入的数字量,读取的值为uint16_t型
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
例如,读取端口GPIOA输入的值
data = GPIO_ReadInputData(GPIOA);
(2) GPIO_ReadInputDataBit()
读出指定端口引脚输入的数字量,读取的值为uint8_t型(通常可视为仅有0和1)
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
例如,读取端口GPIOA端口中的2号引脚输入的值
data = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2);
(3) GPIO_ReadOutputData()
读出指定端口输出的值,该函数常用于输出模式下,用于查看当前引脚的输出情况,由于读取的是输出数据寄存器ODR,所以不受输入的影响,读取的值为uint8_t型
uint8_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
例如,读取端口GPIOA端口输出的值
data = GPIO_ReadOutputData(GPIOA,GPIO_Pin_2);
(4) GPIO_ReadOutputDataBit()
读出指定端口引脚输出的值,读取的值为uint8_t型
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
例如,读取端口GPIOA端口中的2号引脚输出的值
data = GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2);