GPIO 通用输入输出口
1. GPIO 简介
GPIO (General Purpose Input Output) 通用输入输出口,其是一种数字信号接口,用于连接微处理器和外部设备。它可以用来读取外部传感器的输入信号,或者控制外部设备的输出信号。GPIO接口通常由微控制器或单片机提供,可以通过编程来配置和控制。
STM32 的 GPIO 有以下几种特点
-
STM32 的 GPIO 可配置 8 种输入输出模式。
-
GPIO 引脚电平为 0~3.3V,部分引脚可以容忍 5V。
-
在输出模式下,可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通讯协议输出时序等。
-
在输入模式下,可读取端口高低电平或者电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通讯协议接收数据等。
2. GPIO 的 8 种工作模式
通过配置 GPIO 的端口配置寄存器,端口可以配置成以下8种模式。
输入模式 Input Mode
数字输入
标准库:GPIO_Mode_IN_FLOATING
可读取引脚电平、但是如果引脚悬空,则GPIO口的电平会不稳定。
数字输入
标准库:GPIO_Mode_IPU
可读取引脚电平,内部连接上拉电阻,悬空时默认高电平。
数字输入
标准库:GPIO_Mode_IPD
可读取引脚电平,内部连接下拉电阻,悬空时默认低电平。
模拟输入
标准库:GPIO_Mode_AIN
GPIO无效,引脚直接接入内部ADC。
输出模式 Output Mode
数字输出
标准库:GPIO_Mode_Out_OD
可输出引脚电平,高电平为高阻态,低电平接GND。
数字输出
标准库:GPIO_Mode_Out_PP
可输出引脚电平,高电平接VCC,低电平接GND。
数字输出
标准库:GPIO_Mode_AF_OD
由片上外设控制,高电平为高阻态,低电平接GND。
数字输出
标准库:GPIO_Mode_AF_PP
由片上外设控制,高电平接VCC,低电平接GND。
3. GPIO 操作
3.1 初始化
3.1.1 开启RCC时钟
STM32 单片机的 GPIO 外设寄存器挂载在 APB1/APB2 总线上,在使用 GPIO 时需要先开启对应的 APB 总线时钟。
基于标准库配置总线时钟
该函数接收两个参数
RCC_APB2PeriphClockCmd
RCC_APBPeriph | 描述 |
---|---|
RCC_APB2Periph_AFIO | 功能复用 IO 时钟 |
RCC_APBPeriph_GPIOA | GPIOA 时钟 |
RCC_APBPeriph_GPIOB | GPIOB 时钟 |
RCC_APBPeriph_GPIOC | GPIOC 时钟 |
RCC_APBPeriph_GPIOD | GPIOD 时钟 |
RCC_APBPeriph_GPIOE | GPIOE 时钟 |
RCC_APBPeriph_ADC1 | ADC1 时钟 |
RCC_APBPeriph_ADC2 | ADC2 时钟 |
RCC_APBPeriph_TIM1 | TIM1 时钟 |
RCC_APBPeriph_SPI1 | SPI1 时钟 |
RCC_APBPeriph_USART1 | USART1 时钟 |
RCC_APB2Periph_ALL | 全部 APB2 外设时钟 |
- ENABLE
- DISABLE
3.1.2 配置GPIO工作模式
通过创建一个结构体,可以通过标准库提供的函数来对 STM32 的 GPIO 口进行初始化配置。
GPIO_InitTypeDef
结构体包含了三个成员变量
指定 GPIO 引脚的工作模式,共计 8 种工作模式。
输入模式
模式名 | 描述 |
---|---|
GPIO_Mode_AIN | 模拟输入 |
GPIO_Mode_IPD | 下拉输入 |
GPIO_Mode_IPU | 上拉输入 |
GPIO_Mode_IN_FLOATING | 浮空输入 |
输出模式
模式名 | 描述 |
---|---|
GPIO_Mode_OUT_OD | 开漏输出 |
GPIO_Mode_OUT_PP | 推挽输出 |
GPIO_Mode_AF_PP | 复用推挽输出 |
GPIO_Mode_AF_OD | 复用开漏输出 |
设置需要配置的引脚,结合初始化操作中开启了 RCC 时钟的 GPIO 组,即为操作的引脚,例如 GPIOC
、 GPIO_Pin_13
即为:PC13 引脚。
设置GPIO引脚的工作速度,一共有以下几种速度数值可选。
模式名 | 描述 |
---|---|
GPIO_Speed_10Mhz | 10Mhz |
GPIO_Speed_2MHz | 2Mhz |
GPIO_Speed_50MHz | 50Mhz |
数值越大,代表着GPIO的工作速度越快。
若想对多个引脚同时进行配置操作,使用 C 的或运算符即可同时指定几个引脚进行配置。
3.2 设置GPIO的输出状态
3.2.1 SetBits/ResBits
在STM32标准库中,可以通过调用以下两个函数,来对GPIO的输出状态进行设定。
分别传入需要操作的 GPIO 的组和 GPIO 引脚号即可。
3.2.2 WriteBit
在STM32标准库中,也可以通过如下函数,来对GPIO的输出状态进行设定。
需要操作哪一组端口。
需要操作的引脚
设定该引脚的电平状态
0 - 低电平
1 - 高电平
3.3 设置GPIO的输入状态
3.3.1 ReadInputDataBit
在STM32标准库中,可以通过调用如下函数,来对GPIO的输入模式进行读取。
通过调用该函数可以实现读取指定端口的电平状态,在数字输入模式下,该函数会返回当前引脚电平,若GPIO为输入高电平,则会返回 0 反之返回 1。