Arduino ESP32 指南

Arduino ESP32 指南 > API > GPIO

GPIO(通用I/O)

GPIO 是微控制器中最常用和用途最广泛的外设之一。GPIO 通常用于写入和读取引脚状态。

GPIO 代表 General Purpose Input Output,负责控制或读取数字世界中特定引脚的状态。例如,此外围设备广泛用于创建 LED 闪烁或读取简单按钮。

注意

有一些 GPIO 有特殊限制,并非所有 GPIO 都可以通过开发板访问。有关更多信息,请参阅相应的 board pin layout 信息。

GPIOs 模式

GPIO 配置中有两种不同的模式:

  • Input  输入模式

在此模式下,GPIO 将从特定设备接收数字状态。此设备可以是按钮或开关。

  • Output 输出模式

对于输出模式,GPIO 会将 GPIO 数字状态更改为特定设备。例如,您可以驱动 LED。

GPIO API

以下是 GPIO 外设使用的常用功能。

pinMode

pinMode 函数用于定义特定引脚的 GPIO 作模式。

void pinMode(uint8_t pin, uint8_t mode);
  • pin 定义 GPIO 引脚号。
  • mode 设置操作作模式。

基本输入和输出支持以下模式:

  • INPUT 将 GPIO 设置为无上拉或下拉(高阻抗)的输入。
  • OUTPUT 将 GPIO 设置为输出/读取模式。
  • INPUT_PULLDOWN 将 GPIO 设置为带有内部 Pulldown 的输入。
  • INPUT_PULLUP 将 GPIO 设置为带有内部上拉的输入。

内部上拉和下拉

ESP32 SoC 系列支持通过 45kR 电阻进行内部上拉和下拉,当将 GPIO 模式配置为 INPUT 模式时,可以启用该模式。如果未定义 pullup 或 pulldown 模式,则 pin 将保持高阻抗模式。

digitalWrite 

函数 digitalWrite 将所选 GPIO 的状态设置为 HIGH 或 LOW。仅当 pinMode 配置为 OUTPUT 时,才使用此函数。

void digitalWrite(uint8_t pin, uint8_t val);
  • pin 定义 GPIO 引脚号。
  • val 将 output digital state 设置为 HIGH 或 LOW。

digitalRead

要读取配置为 INPUT 的给定引脚的状态,请使用函数 digitalRead。

int digitalRead(uint8_t pin);
  • pin 指定GPIO  引脚号

此函数会将所选引脚的逻辑状态返回为 HIGH 或 LOW。

Interrupts (中断)

ESP32 上的 GPIO 外设支持中断。

attachInterrupt

函数 attachInterrupt 用于将中断附加到定义的引脚。

attachInterrupt(uint8_t pin, voidFuncPtr handler, int mode);
  • pin 定义 GPIO 引脚号。
  • handler 设置处理程序函数。
  • mode 设置中断模式。

以下是支持的中断模式:

  • DISABLED  禁用
  • RISING  上升
  • FALLING  下降
  • CHANGE  改变
  • ONLOW  低电平
  • ONHIGH  高电平
  • ONLOW_WE
  • ONHIGH_WE

attachInterruptArg

函数 attachInterruptArg 用于使用参数将中断附加到定义的引脚。

attachInterruptArg(uint8_t pin, voidFuncPtrArg handler, void * arg, int mode);
  • pin 定义 GPIO 引脚号。
  • handler 设置处理程序函数。
  • arg 指针指向 interrupt 参数。
  • mode 设置中断模式。

detachInterrupt  

要从特定引脚分离中断,请使用 detachInterrupt 函数指定要分离的 GPIO。

detachInterrupt(uint8_t pin);
  • pin 定义 GPIO 引脚号。

Example Code  示例代码

GPIO 输入和输出模式

#define LED    12
#define BUTTON 2

uint8_t stateLED = 0;

void setup() {
    pinMode(LED, OUTPUT);
    pinMode(BUTTON,INPUT_PULLUP);
}

void loop() {
    if(!digitalRead(BUTTON)){
        stateLED = stateLED^1;
        digitalWrite(LED,stateLED);
    }
}

GPIO Interrupt  GPIO 中断

示例程序:GPIO/GPIOInterrupt/GPIOInterrupt.ino