GPIO 是微控制器中最常用和用途最广泛的外设之一。GPIO 通常用于写入和读取引脚状态。
GPIO 代表 General Purpose Input Output,负责控制或读取数字世界中特定引脚的状态。例如,此外围设备广泛用于创建 LED 闪烁或读取简单按钮。
注意
有一些 GPIO 有特殊限制,并非所有 GPIO 都可以通过开发板访问。有关更多信息,请参阅相应的 board pin layout 信息。
GPIO 配置中有两种不同的模式:
在此模式下,GPIO 将从特定设备接收数字状态。此设备可以是按钮或开关。
对于输出模式,GPIO 会将 GPIO 数字状态更改为特定设备。例如,您可以驱动 LED。
以下是 GPIO 外设使用的常用功能。
pinMode 函数用于定义特定引脚的 GPIO 作模式。
void pinMode(uint8_t pin, uint8_t mode);
基本输入和输出支持以下模式:
ESP32 SoC 系列支持通过 45kR 电阻进行内部上拉和下拉,当将 GPIO 模式配置为 INPUT 模式时,可以启用该模式。如果未定义 pullup 或 pulldown 模式,则 pin 将保持高阻抗模式。
函数 digitalWrite 将所选 GPIO 的状态设置为 HIGH 或 LOW。仅当 pinMode 配置为 OUTPUT 时,才使用此函数。
void digitalWrite(uint8_t pin, uint8_t val);
要读取配置为 INPUT 的给定引脚的状态,请使用函数 digitalRead。
int digitalRead(uint8_t pin);
此函数会将所选引脚的逻辑状态返回为 HIGH 或 LOW。
ESP32 上的 GPIO 外设支持中断。
函数 attachInterrupt 用于将中断附加到定义的引脚。
attachInterrupt(uint8_t pin, voidFuncPtr handler, int mode);
以下是支持的中断模式:
函数 attachInterruptArg 用于使用参数将中断附加到定义的引脚。
attachInterruptArg(uint8_t pin, voidFuncPtrArg handler, void * arg, int mode);
要从特定引脚分离中断,请使用 detachInterrupt 函数指定要分离的 GPIO。
detachInterrupt(uint8_t pin);
#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/GPIOInterrupt/GPIOInterrupt.ino