ESP32 GPIO 中断
时间: 2025-01-03 09:17:17 浏览: 16
### ESP32 GPIO 中断使用教程
#### 配置 GPIO 中断
为了配置 ESP32 的 GPIO 中断,需先初始化并配置指定的 GPIO 引脚。这可以通过 `gpio_config` 函数完成,其中 `gpio_int_type_t` 类型字段用于设定中断模式[^4]。
```c
#include "driver/gpio.h"
// 定义要使用的GPIO引脚编号
#define GPIO_INPUT_IO_0 18
void setup_gpio() {
// 设置GPIO配置结构体
gpio_config_t io_conf;
// 禁用中断
io_conf.intr_type = GPIO_PIN_INTR_DISABLE; // 默认禁用中断
// 设置为输入模式
io_conf.mode = GPIO_MODE_INPUT;
// 设置拉上电阻使能
io_conf.pull_up_en = 1;
// 设置下拉电阻禁用
io_conf.pull_down_en = 0;
// 配置GPIO号
io_conf.pin_bit_mask = (1ULL<<GPIO_INPUT_IO_0);
// 根据上述配置初始化GPIO
gpio_config(&io_conf);
// 启用上升沿触发中断
gpio_set_intr_type(GPIO_INPUT_IO_0, GPIO_INTR_POSEDGE);
}
```
#### 创建中断服务程序 ISR
创建一个处理特定事件发生时执行的任务函数作为中断服务例程(ISR),并通过 `gpio_install_isr_service` 和 `gpio_isr_handler_add` 来安装全局ISR服务以及关联具体的GPIO引脚与ISR函数[^2]。
```c
static void IRAM_ATTR gpio_isr_handler(void* arg) {
uint32_t gpio_num = (uint32_t)arg;
printf("Interrupt on pin number-%d\n", gpio_num);
}
void attach_interrupt() {
// 安装GPIO ISR服务
gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);
// 将ISR handler附加给GPIO INPUT IO 0
gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0);
}
```
需要注意的是,在某些情况下,如果多个 GPIO 被配置成相同的边沿触发方式,则可能会遇到硬件无法正确响应的问题;此时建议调整设计思路或减少并发启用的中断源数量来规避此现象[^1]。
阅读全文