ESP32-S3 控制 外部中断
ESP32-S3 外部中断实验:按键控制 LED
在嵌入式开发中,外部中断是一种非常常见的应用场景。
通过中断机制,系统无需在循环中不断检测按键状态,而是当按键动作发生时,MCU 会立即响应,大大提高了效率。
本实验将基于 ESP32-S3 实现 按键外部中断控制 LED 的功能。
一、实验目的
- 学习 ESP32-S3 外部中断 的配置与使用
- 掌握 按键触发中断 的应用
- 实现 用 K1-K4 按键控制 LED 状态翻转
二、硬件准备
- ESP32-S3 开发板
- 按键模块 × 1
- LED 模块 × 1
- 杜邦线若干
三、接线说明
| 模块 | 引脚 | ESP32-S3 IO |
|---|---|---|
| 按键 K1-K4 | K1-K4 | 1, 38, 39, 40 |
| LED 模块 | D1 | 3 |
接线示意:
- K1-K4 → ESP32 IO (1, 38, 39, 40)
- D1 → ESP32 IO (3)
这样设置后,按下任意一个按键,都可以触发中断,从而改变 LED 的亮灭状态。
四、实验现象
程序下载成功后:
- 当按下任意一个按键(K1~K4)时,触发中断,D1 LED 状态翻转;
- LED 原来熄灭 → 按键后点亮
- LED 原来点亮 → 按键后熄灭
五、程序分析
1. 主程序
#include "public.h"
#include "exti.h"
//定义LED控制引脚
#define led1_pin 3
//定义全局变量
void setup() {
pinMode(led1_pin, OUTPUT);//设置引脚为输出模式
exti_init(); // 初始化外部中断
}
void loop() {
digitalWrite(led1_pin,led1_sta); // 根据中断修改的变量,驱动LED
}
主程序很简单,loop() 循环中只负责根据 led1_sta 变量控制 LED,真正的按键处理逻辑放在中断服务函数(ISR)里。
2. 中断初始化
exit.h
#ifndef _exti_H
#define _exti_H
#include "public.h"
// 定义按键控制管脚
#define key1_pin 1
#define key2_pin 38
#define key3_pin 39
#define key4_pin 40
// 变量声明
extern volatile u8 led1_sta;
// 中断初始化
void exti_init(void);
// 中断服务函数
void key1_isr(void);
void key2_isr(void);
void key3_isr(void);
void key4_isr(void);
#endif
exit.cpp
#include "exti.h"
volatile u8 led1_sta=0;
// 中断初始化
void exti_init(void)
{
pinMode(key1_pin, INPUT_PULLUP);//设置引脚为输入上拉模式
pinMode(key2_pin, INPUT_PULLUP);
pinMode(key3_pin, INPUT_PULLUP);
pinMode(key4_pin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(key1_pin), key1_isr, FALLING);//设置下降沿触发
attachInterrupt(digitalPinToInterrupt(key2_pin), key2_isr, FALLING);
attachInterrupt(digitalPinToInterrupt(key3_pin), key3_isr, FALLING);
attachInterrupt(digitalPinToInterrupt(key4_pin), key4_isr, FALLING);
}
// 外部中断服务程序
void key1_isr(void)
{
delay(10);
led1_sta=!led1_sta;
}
void key2_isr(void)
{
delay(10);
led1_sta=!led1_sta;
}
void key3_isr(void)
{
delay(10);
led1_sta=!led1_sta;
}
void key4_isr(void)
{
delay(10);
led1_sta=!led1_sta;
}
这里使用了 attachInterrupt() 函数,将按键引脚和中断服务函数(ISR)绑定。触发模式为 下降沿(FALLING),也就是按键按下时(由高电平 → 低电平)。
中断服务函数说明:
volatile:保证变量在中断和主程序之间不会被编译器优化掉。delay(10):用于按键消抖,避免一次按下触发多次中断。- 每个 ISR 的逻辑相同,即 翻转 led1_sta 的状态。
六、注意事项
-
按键消抖:
中断触发时可能因抖动造成误判,因此加了delay(10)简单处理。更稳妥的方式是用 定时器消抖。 -
ISR 简洁性:
在 ISR 中尽量不要放复杂逻辑和耗时操作,这里只修改了一个标志变量。 -
引脚选择:
ESP32-S3 部分 GPIO 不支持外部中断,建议参考 官方引脚功能表。本实验使用的 1, 38, 39, 40 均支持中断。
七、实验总结
通过本实验,我们学习了 ESP32-S3 的外部中断配置与应用:
- 使用
attachInterrupt()将按键绑定到 ISR - 在中断服务函数中修改状态变量
- 在主循环中根据变量驱动 LED
这样一来,就不需要在 loop() 中不停 digitalRead() 轮询按键,大大提高了效率,也使得程序结构更清晰。

浙公网安备 33010602011771号