ESP32外部中断

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言


提示:以下是本篇文章正文内容

一、外部中断概念

外部中断是单片机实时地处理外部事件的一种内部机制

当外部事件发生后,单片机判断外部事件是否符合条件,如果符合外部中断条件,则停止CPU正在执行的程序,转而进行中断事件的处理;中断处理完毕后,又返回被中断的程序处,继续执行

ESP32 Arduino 有以下触发方式:

LOW 低电平触发
CHANGE 电平变化
RISING 上升沿触发
FALLING 下降沿触发
HIGH 高电平触发

二、配置外部中断

1.编写中断服务函数

除了设置中断模式外,还需要编写一个响应中断的处理程序——中断服务函数,当中断被触发后,便可以让ESP运行该中断函数

中断函数就是当中断被触发后要去执行的函数,该函数不能带有任何参数,且返回类型为空

设置一个外部中断的中断服务函数

void TouchEvent()
{
    
    
    Serial.printf("Touch Event.\r\n");
}

2.配置中断

在定义中断服务函数后,需要在 setup 函数配置中断服务函数

主要函数是:attachInterrupt(pin, intRoutine, mode)

中断发生时指定特定名称的中断服务程序
pin 外部事件对应的引脚
intRoutine 处理外部事件的函数名
mode 中断模式(触发方式)

eg:

void setup()
{
    
    
    // put your setup code here, to run once:
    Serial.begin(115200);

#if 1 == EXT_ISR_MODE   // 触摸中断
    // Pin: T0(GPIO4), 函数指针:TouchEvent, 阈值: 40
    touchAttachInterrupt(T0, TouchEvent, 40);

#elif 2 == EXT_ISR_MODE   // 下降沿触发 
    pinMode(0, INPUT_PULLUP);
    attachInterrupt(0, PinIntEvent, FALLING);

#endif
}

touchAttachInterrupt()
设置触摸板值下降时调用的函数,低于给定的阈值。使用touchRead来确定,接触和未接触状态之间的适当阈值

代码示例:

#include <Arduino.h>

// 定义外部中断的Mode
// 0: 无中断,读取Touch值
// 1:Touch中断,执行 TouchEvent()
// 2: 外部IO的中断
#define EXT_ISR_MODE 1

void TouchEvent()
{
    
    
    Serial.printf("Touch Event.\r\n");
}

void PinIntEvent()
{
    
    
    Serial.printf("PinInt Event.\r\n");
}

void setup()
{
    
    
    // put your setup code here, to run once:
    Serial.begin(115200);

#if 1 == EXT_ISR_MODE   // 触摸中断
    // Pin: T0(GPIO4), 函数指针:TouchEvent, 阈值: 40
    touchAttachInterrupt(T0, TouchEvent, 40);

#elif 2 == EXT_ISR_MODE   // 下降沿触发 
    pinMode(0, INPUT_PULLUP); //设置引脚0位外部中断引脚
    attachInterrupt(0, PinIntEvent, FALLING);

#endif
}

void loop()
{
    
    
    // put your main code here, to run repeatedly:

#if 0 == EXT_ISR_MODE
    Serial.printf("touch:%d\r\n", touchRead(T0));
#endif

    delay(200);
}

总结

提示:这里对文章进行总结:

猜你喜欢

转载自blog.csdn.net/qq_53144843/article/details/121457001