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 的状态

六、注意事项

  1. 按键消抖
    中断触发时可能因抖动造成误判,因此加了 delay(10) 简单处理。更稳妥的方式是用 定时器消抖

  2. ISR 简洁性
    在 ISR 中尽量不要放复杂逻辑和耗时操作,这里只修改了一个标志变量。

  3. 引脚选择
    ESP32-S3 部分 GPIO 不支持外部中断,建议参考 官方引脚功能表。本实验使用的 1, 38, 39, 40 均支持中断。


七、实验总结

通过本实验,我们学习了 ESP32-S3 的外部中断配置与应用

  • 使用 attachInterrupt() 将按键绑定到 ISR
  • 在中断服务函数中修改状态变量
  • 在主循环中根据变量驱动 LED

这样一来,就不需要在 loop() 中不停 digitalRead() 轮询按键,大大提高了效率,也使得程序结构更清晰。

posted @ 2025-08-16 11:39  jeikerxiao  阅读(77)  评论(0)    收藏  举报