GPIO概述
- GPIO(General Purpose Input Output)通用输入输出口
- 可配置为8种输入输出模式
- 引脚电平:0V~3.3V,部分引脚可容忍5V
- 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
- 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
GPIO详细介绍
GPIO基本结构
所有GPIO都处于APB2总线上,因此使用GPIO时务必开启APB2总线的时钟。

IO口结构

图中错误:
图中TTL肖特基触发器应为TTL施密特触发器
GPIO的不同模式
| 模式名称 |
性质 |
特征 |
| 浮空输入 |
数字输入 |
可读取引脚电平,若引脚悬空,则电平不确定 |
| 上拉输入 |
数字输入 |
可读取引脚电平,内部连接上拉电阻,悬空时默认高电平 |
| 下拉输入 |
数字输入 |
可读取引脚电平,内部连接下拉电阻,悬空时默认低电平 |
| 模拟输入 |
模拟输入 |
GPIO无效,引脚直接接入内部ADC |
| 开漏输出 |
数字输出 |
可输出引脚电平,高电平为高阻态,低电平接VSS |
| 推挽输出 |
数字输出 |
可输出引脚电平,高电平接VDD,低电平接VSS |
| 复用开漏输出 |
数字输出 |
由片上外设控制,高电平为高阻态,低电平接VSS |
| 复用推挽输出 |
数字输出 |
由片上外设控制,高电平接VDD,低电平接VSS |
代码实现
结构体
1
2
3
4
5
6
7
8
|
//开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//配置GPIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
GPIO_InitTypeDef为GPIO初始化结构体
GPIO_Mode为GPIO口模式
GPIO_Pin为GPIO引脚编号,和 GPIO_Init的第一个参数共同指定引脚
GPIO_Speed为GPIO工作速度
| 模式 |
GPIO_Mode |
值 |
| 模拟输入 |
GPIO_Mode_AIN |
0x0 |
| 浮空输入 |
GPIO_Mode_IN_FLOATING |
0x04 |
| 下拉输入 |
GPIO_Mode_IPD |
0x28 |
| 上拉输入 |
GPIO_Mode_IPU |
0x48 |
| 开漏输出 |
GPIO_Mode_Out_OD |
0x14 |
| 推挽输出 |
GPIO_Mode_Out_PP |
0x10 |
| 复用开漏输出 |
GPIO_Mode_AF_OD |
0x1C |
| 复用推挽输出 |
GPIO_Mode_AF_PP |
0x18 |
| 速度 |
GPIO_Speed |
值 |
| 10M |
GPIO_Speed_10MHz |
1 |
| 2M |
GPIO_Speed_2MHz |
2 |
| 50M |
GPIO_Speed_50MHz |
3 |
GPIO输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//方法1
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
GPIO_SetBits(GPIOA, GPIO_Pin_0);
//方法2
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
//方法3
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);
//方法4
uint16_t data = 0x00;
GPIO_Write(GPIOA, data);
|
GPIO输入
1
2
3
4
5
6
7
8
9
|
//方法1
uint8_t data = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
//方法2
uint16_t data = GPIO_ReadInputData(GPIOA);
//读取输出寄存器
uint8_t data = GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0);
uint16_t data = GPIO_ReadOutputData(GPIOA);
|