#include <Arduino.h>
#include <Ticker.h>
/// 外部中断
#define BUTTON 4
#define LED1 14
// 与主程序共享的变量要加上 volatile 关键字
volatile bool flag = false;
void setExternalInterrupt();
void execExternalInterrupt();
// 定义外部中断函数
void handle_interrupt()
{
flag = true;
int number;
number += 10000;
}
/// 硬件定时器中断
#define LED2 1
#define LED3 2
hw_timer_t *timer2 = NULL;
hw_timer_t *timer3 = NULL;
void setHardwareTimerInterrupt();
// 硬件定时器中断处理函数
void timer2_interrupt()
{
digitalWrite(LED2, !digitalRead(LED2));
}
void timer3_interrupt()
{
digitalWrite(LED3, !digitalRead(LED3));
}
/// 软件定时器中断
#define LED4 45
#define LED5 0
Ticker ticker_timer2;
Ticker ticker_timer3;
void setSoftwareTimerInterrupt();
// 软件定时器中断回调函数
void toggle(int pin)
{
digitalWrite(pin, !digitalRead(pin));
}
void setup()
{
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Hello, ESP32-S3!");
setExternalInterrupt();
setHardwareTimerInterrupt();
setSoftwareTimerInterrupt();
}
void loop()
{
execExternalInterrupt();
}
/// 外部中断
void setExternalInterrupt()
{
pinMode(BUTTON, INPUT_PULLDOWN);
pinMode(LED1, OUTPUT);
/* 外部中断配置 attachInterrupt(digitalPinToInterrupt(pin), ISR, mode) 包括 3 个参数:
pin:GPIO 端口号;
ISR:中断服务程序,没有参数与返回值的函数;
mode:中断触发的方式,支持以下触发方式:
LOW 低电平触发
HIGH 高电平触发
RISING 上升沿触发
FALLING 下降沿触发
CHANGE 电平变化触发
*/
attachInterrupt(digitalPinToInterrupt(BUTTON), handle_interrupt, FALLING);
}
void execExternalInterrupt()
{
if (flag)
{
Serial.println("外部中断触发");
digitalWrite(LED1, HIGH);
delay(2000);
digitalWrite(LED1, LOW);
// 重置中断标志位
flag = false;
}
}
/// 硬件定时器中断(无loop)
void setHardwareTimerInterrupt()
{
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
// 初始化定时器
timer2 = timerBegin(0, 80, true);
timer3 = timerBegin(1, 80, true);
// 配置周期定时器
timerAttachInterrupt(timer2, timer2_interrupt, true);
// 配置一次性定时器
timerAttachInterrupt(timer3, timer3_interrupt, true);
// 定时模式,单位us
timerAlarmWrite(timer2, 1000000, true);
// 定时模式,单位us,只触发一次
timerAlarmWrite(timer3, 3000000, false);
// 启动定时器
timerAlarmEnable(timer2);
timerAlarmEnable(timer3);
}
/// 软件定时器中断(无loop)
void setSoftwareTimerInterrupt()
{
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
// 配置周期性定时器
ticker_timer2.attach(0.5, toggle, LED4);
// 配置一次性定时器
ticker_timer3.once(3, toggle, LED5);
}