跳转至

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 总线时钟。

基于标准库配置总线时钟

开启 APB2 总线时钟
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC, ENABLE);

该函数接收两个参数

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 口进行初始化配置。

1
2
3
4
5
6
7
GPIO_InitTypeDef GPIO_InitStructre;                 // 创建一个名为 GPIO_InitStructre 的结构体

GPIO_InitStructre.GPIO_Mode = GPIO_Mode_Out_PP;     // 设置输出模式为 GPIO_Mode_Out_PP - 推挽输出
GPIO_InitStructre.GPIO_Pin = GPIO_Pin_13;           // 设置输出引脚为 GPIO_Pin_13 - 13号引脚
GPIO_InitStructre.GPIO_Speed = GPIO_Spedd_50MHz;    // 设置引脚速度为 50MHz

GPIO_Init (GPIOC,&GPIO_InitStructre)                // 调用 GPIO_Init() 函数初始化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 组,即为操作的引脚,例如 GPIOCGPIO_Pin_13 即为:PC13 引脚。

设置GPIO引脚的工作速度,一共有以下几种速度数值可选。

模式名 描述
GPIO_Speed_10Mhz 10Mhz
GPIO_Speed_2MHz 2Mhz
GPIO_Speed_50MHz 50Mhz

数值越大,代表着GPIO的工作速度越快。

若想对多个引脚同时进行配置操作,使用 C 的或运算符即可同时指定几个引脚进行配置。

1
2
3
4
5
6
7
GPIO_InitTypeDef GPIO_InitStructre;                 // 创建一个名为 GPIO_InitStructre 的结构体

GPIO_InitStructre.GPIO_Mode = GPIO_Mode_Out_PP;     // 设置输出模式为 GPIO_Mode_Out_PP - 推挽输出
GPIO_InitStructre.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
GPIO_InitStructre.GPIO_Speed = GPIO_Spedd_50MHz;    // 设置引脚速度为 50MHz

GPIO_Init (GPIOC,&GPIO_InitStructre)                // 调用 GPIO_Init() 函数初始化GPIO

3.2 设置GPIO的输出状态

3.2.1 SetBits/ResBits

在STM32标准库中,可以通过调用以下两个函数,来对GPIO的输出状态进行设定。

GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);     //设置GPIO高电平
GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);   //设置GPIO低电平

分别传入需要操作的 GPIO 的组和 GPIO 引脚号即可。

3.2.2 WriteBit

在STM32标准库中,也可以通过如下函数,来对GPIO的输出状态进行设定。

GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);

需要操作哪一组端口。

需要操作的引脚

设定该引脚的电平状态

0 - 低电平

1 - 高电平

3.3 设置GPIO的输入状态

3.3.1 ReadInputDataBit

在STM32标准库中,可以通过调用如下函数,来对GPIO的输入模式进行读取。

int GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

通过调用该函数可以实现读取指定端口的电平状态,在数字输入模式下,该函数会返回当前引脚电平,若GPIO为输入高电平,则会返回 0 反之返回 1。