ESP32入门七(中断)

中断用于处理在程序正常执行期间通过外部事件或者响应软件指令触发时发生的事件。比如,在一段呼吸灯的代码中,正常运行时的结果为LED从暗到亮,再从亮到暗持续地运行。我们可以通过一个中断来控制呼吸灯的运行和停止。使用中断功能,我们就不需要不停地监控一个引脚的状态,当中断被触发,内部控制器停止执行主程序,并调用中断服务例程 (ISR) 。

中断服务例程 (ISR)

中断服务例程 (ISR)是特殊类型的函数,它有一些特殊的特点和规则:

1、将部分内部 SRAM0 区域分配给IRAM,可以显著减少运行的迟延。

2、必须将中断服务例程 (ISR)放入 IRAM。

3、中断服务例程 (ISR)不能有任何参数,也不返回任何值。

4、因为中断服务例程 (ISR)会中断主程序的运行,运行时间过长会对主程序形成阻塞,所以中断服务例程 (ISR)尽可能短和快。

在IRAM中放置代码,可以使用 IRAM_ATTR 宏在源代码中指定该函数放置到IRAM中,如:

void IRAM_ATTR ISR_function()
{
        // ...
}

我们在使用中断功能时,会使用一个名为attachInterrupt()的函数个设置引脚中断。

函数:attachInterrupt

作用:用于将中断附加到定义的引脚。

格式:attachInterrupt(uint8_t pin, voidFuncPtr handler, int mode);

参数:

        pin                         -定义监控的GPIO 引脚号。

        handler                  -设置中断服务例程 (ISR)

        mode                     -设置中断模式
                LOW                 -低电平触发
                CHANGE          -管脚电平变化,触发
                HIGH                -高电平触发
                RISING            -管脚从低电平变化高电平触发,即上升沿触发
                FALLING         -下降沿触发,电平从高变低

示例代码

我们需要定义一个引脚来用于中断服务,这里选择4号引脚:

int interrupt_pin = 4;          //引脚号

 下面需要要定义一个计数器来记录中断的次数,默认设为0:

int interrupt_counter = 0;      //中断次数计数器

定义一个开关标记来记录中断时的开关状态:

bool press_down;                //中断标记开关

定义一个ISR函数,放置到IRAM:

void  IRAM_ATTR ISR_function(){
  interrupt_counter++;          //中断次数计数器累加
  press_down = true;            //中断标记开关设为开
}

我们需要使用上面所介绍的attachInterrupt函数来把中断服务附加到指定的引脚:

attachInterrupt(interrupt_pin, ISR_function, FALLING);  //中断附加到引脚

以下为硬件的连接和完整的代码:

int interrupt_pin = 4;          //引脚号
int interrupt_counter = 0;      //中断次数计数器
bool press_down;                //中断标记开关

void  IRAM_ATTR ISR_function(){
  interrupt_counter++;          //中断次数计数器累加
  press_down = true;            //中断标记开关设为开
}

void setup() {
  Serial.begin(115200);
  pinMode(interrupt_pin,INPUT_PULLUP);  //引脚初始化为输入上拉模式
  attachInterrupt(interrupt_pin, ISR_function, FALLING);  //中断附加到引脚
}

void loop() {
  if(press_down){                       //如果中断标记开关为开状态
    Serial.print("发生中断事件:");        
    Serial.println(interrupt_counter);  //串口输出计数器的值
    press_down = false;                 //中断标记开关设为关
  }
}

代码说明

在该例程中,我们设置监控4号引脚来触发中断服务。

我们把4号引脚设置为输入上拉模式,当开机时,4号引脚为高电平状态。

4号引脚通过一个开关与GND引脚连接,当开关按下时,4号引脚由高电平变为低电平状态。

这时,触发中断,主程序中断,进入ISR_function函数,函数功能包括给计数器累加中断次数和中断标记开关设置为开。

中断标记为开时满足if(press_down)条件,进入分支,串口此时输出计数器的值,并设置中断标记开关为关闭状态。

测试代码

运行该代码,打开串口监视器,按下开关,可以观察到计数器的变化:

同时,我们也会发现,有时即使只按一次开关,也会出现计数据多次增加。这是同于硬件生产工艺的原因造成的,我们在直观上感觉只按了一次开关,但在十分微小的时间里,开关的接触弹片可能进行了多次的接触。释放按钮时也会发生同样的事情。在生产中,工艺上是无法达到理想的完美状态的。以致产生了这种名为"开关抖动"的现象。我们可以通过硬件或软件的方式来消除这种抖动。

消除开关抖动

我们在上面的例程中加入添加代码,以软件的方式来消除开关抖动。实现每按一次开只允许动行一次ISR程序:

int interrupt_pin = 4;          //引脚号
int interrupt_counter = 0;      //中断次数计数器
bool press_down = false  ;                //中断标记开关

void  IRAM_ATTR ISR_function(){
  static unsigned long lastInterruptTime = 0;
  unsigned long interruptTime = millis();
  if(interruptTime - lastInterruptTime >200){
      press_down = true;                //中断标记开关设为开
      interrupt_counter++;
  }
  lastInterruptTime = interruptTime;
}

void setup() {
  Serial.begin(115200);
  pinMode(interrupt_pin,INPUT_PULLUP);  //引脚初始化为输入上拉模式
  attachInterrupt(interrupt_pin, ISR_function, FALLING);  //中断附加到引脚
}

void loop() {
  if(press_down){                       //如果中断标记开关为开状态
    Serial.print("发生中断事件:");        
    Serial.println(interrupt_counter);  //串口输出计数器的值
    press_down = false;                 //中断标记开关设为关
  }
}

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
嗨!对于入门学习Arduino ESP32,我可以给你一些基本的指导。ESP32是一款功能强大的开发板,支持无线通信和互联网连接,适合物联网项目。 首先,你需要准备以下材料: 1. Arduino ESP32开发板 2. USB数据线 3. 电脑(Windows、Mac或Linux) 接下来,按照以下步骤进行入门学习: 1. 安装Arduino IDE:访问Arduino官方网站,下载并安装Arduino IDE(集成开发环境)软件。根据你的操作系统选择正确的版本。 2. 连接ESP32开发板:使用USB数据线将ESP32开发板连接到电脑上。确保选择了正确的端口和开发板类型。 3. 安装ESP32开发工具:打开Arduino IDE,点击“文件”> “首选项”,在“附加开发板管理器URL”中输入以下网址:https://dl.espressif.com/dl/package_esp32_index.json。然后点击“确认”。 4. 安装ESP32开发板支持:点击“工具”> “开发板”> “开发板管理器”,在搜索栏中搜索“ESP32”。选择“ESP32 by Espressif Systems”并点击“安装”。 5. 选择开发板和端口:点击“工具”> “开发板”,从列表中选择“ESP32 Dev Module”。然后点击“工具”> “端口”,选择正确的USB端口。 6. 上传示例代码:点击“文件”> “示例”> “ESP32”来浏览ESP32的示例代码。选择一个感兴趣的示例并打开。然后点击“上传”按钮将代码上传到开发板。 7. 查看串口输出:点击“工具”> “串口监视器”,选择适当的波特率和换行选项,以查看开发板的串口输出。你可以在代码中添加Serial.print语句来输出调试信息。 这些是入门学习Arduino ESP32的基本步骤。通过尝试不同的示例和项目,你可以更深入地了解和利用ESP32的功能。祝你学习愉快!如有任何问题,随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

字节狂徒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值