【史上最全面ESP32】软件中断与硬件中断


前言

ESP32是一款高度集成的芯片,具有强大的中断处理能力。在ESP32中,我们可以配置所有的GPIO引脚作为硬件中断源,通过附加它们到相应的中断服务例程(ISR)来启用中断。此外,ESP32还支持软件中断,例如定时器溢出时的定时器中断。

硬件中断

硬件中断概念

硬件中断是响应外部硬件事件而发生的,例如,当检测到触摸时发生触摸中断,当GPIO引脚的状态改变时发生GPIO中断。我们可以使用attachInterrupt()函数在引脚上设置中断。

硬件中断的使用

在ESP32中,我们可以使用硬件中断来响应按键事件。以下是一个简单的示例,说明了如何使用硬件中断来检测按键按下的事件。

const int buttonPin = 12; // GPIO pin where the button is connected
volatile bool has_interrupted = false;

void IRAM_ATTR myInterruptFunction() {
    has_interrupted = true;
}

void setup() {
    Serial.begin(115200);
    pinMode(buttonPin, INPUT_PULLUP); // Configure the pin as an input with internal pull-up resistor
    attachInterrupt(digitalPinToInterrupt(buttonPin), myInterruptFunction, RISING); // Configure the interrupt
}

void loop() {
    if(has_interrupted) {
        Serial.println("Button pressed!");
        has_interrupted = false;
    }
}
  • attachInterrupt(digitalPinToInterrupt(buttonPin), myInterruptFunction, RISING);

    • 函数原型void attachInterrupt(uint8_t pin, voidFuncPtr callback, int mode);
    • 作用:将中断服务例程(ISR)附加到指定的GPIO引脚上。
    • 参数
      • pin:要附加中断的GPIO引脚编号。
      • callback:中断发生时调用的函数(ISR)。
      • mode:定义触发中断的条件,例如RISING、FALLING、CHANGE等,他们分别表示上升沿触发,下降沿触发和改变就触发。
    • 返回值:无。
  • digitalPinToInterrupt(buttonPin)

    • 函数原型int digitalPinToInterrupt(int pin);
    • 作用:将数字引脚转换为中断号,用于attachInterrupt()函数。
    • 参数
      • pin:要转换的数字引脚编号。
    • 返回值:对应的中断号。
  • myInterruptFunction()

    • 函数原型void IRAM_ATTR myInterruptFunction();
    • 作用:定义中断服务例程(ISR),在中断发生时执行的函数。
    • 参数:无。
    • 返回值:无。
      IRAM_ATTR是一个特殊的属性,用于指示编译器将特定的代码段放置在ESP32的内部RAM(IRAM)中。这是因为ESP32基于哈佛架构,具有两个总线:一个用于指令,一个用于数据。IRAM是可执行的,并且只能通过4字节对齐的字进行读取或写入。

当你在代码中使用IRAM_ATTR标记时,你正在声明编译后的代码将被放置在名为".dram.text"的段中。这意味着可执行文件不仅有".text"和".data"段,还有其他段。在ESP32启动时,引导程序会在将控制权交给你的应用程序之前,将".dram.text"段复制到实际的RAM中。然后,RAM被映射到指令区域地址空间(> 0x4000 0000),这意味着可以将控制权传递给此代码(如常规操作),因为代码位于指令总线地址空间中。

使用IRAM_ATTR的一个主要原因是,当ESP32执行Flash操作(如写入或擦除)时,需要在RAM中运行的中断服务例程(ISR)。如果不使用IRAM_ATTR,代码将被放置在Flash中,而Flash在ESP32上的速度比内部RAM慢。

软件中断

软件中断概念

软件中断是当触发软件事件时发生的,例如定时器溢出。我们可以使用ESP32的定时器中断来执行特定的任务。

软件中断的使用

在此之前我们写过定时器的文章,我们这里就不多赘述:ESP TIMER

总结

ESP32的中断处理能力非常强大,无论是硬件中断还是软件中断,都可以帮助我们更有效地管理和控制硬件设备,提高系统的实时性和响应速度。通过理解和掌握ESP32的中断机制,我们可以更好地利用这款芯片的强大功能,为我们的项目带来更多可能性。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

人才程序员

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

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

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

打赏作者

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

抵扣说明:

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

余额充值