ESP32 GPIO 引脚配置为 RISING 的中断在高电平时重复

问题描述 投票:0回答:1

我正在使用 VSCode 和 PlatformIO 以及 Arduino Core 开发带有 ESP32 nodemcu-32s 开发板的数据记录器。

一切都很顺利,除了我用来在上升输入脉冲上触发中断的 GPIO 在输入保持高电平时会生成连续的重复中断流。当它变低时,中断停止。以下是配置 GPIO 的代码:

pinMode(OutputPin1, OUTPUT);  //Set Digital I/O status for OutputPin1
digitalWrite(OutputPin1, HIGH);  //default output pin #1 set to 'HIGH'
pinMode(interruptPin1, INPUT);    // Set Digital I/O status for interruptPin1
attachInterrupt(digitalPinToInterrupt(interruptPin1), ISR1, RISING);  //Set pin 'interruptPin1' to trigger interrupt on rising edge and run 'ISR1' ISR function

OutputPin1 用于通过按通常方式配置的瞬时按钮开关提供高电压。释放按钮时,电阻器将信号拉低。因此,简单的目标是每次按下按钮时触发一次中断。

相反,只要我按下按钮将输入保持在高电平,就会出现一系列重复的中断。当我释放按钮,使其再次拉至低电平时,中断流停止。我已经确认了示波器上的输入电平。

我对 ESP32 还很陌生,很难找到正确的文档,但我已经尝试过所有中断模式 - 上升、下降、高、低、变化。无论我在 AttachInterruupt() 中选择哪种模式,此行为都是恒定的。例如,即使我指定低电平触发,中断也会继续发生在高电平(当我按住按钮时)。当我松开按钮时,中断就会停止。所以它的行为就像模式为高电平一样,有重复的中断。

我正在使用的代码(映射到该 MCU 上的特定 GPIO)在 Arduino MKR1010 上可以正常工作,因此与 ESP32 相比,有些东西明显不同。我查看了库并尝试使用 Espressif IDF #defines (例如 GPIO_INTR_POSEDGE),但它们在行为上没有任何区别。

我还没有找到 ESP32 GPIO 定义的头文件,但在 VSCode 中我可以通过将鼠标悬停在代码上看到以下内容:

 RISING = 0x01
 FALLING = 0x02
 LOW = 0x0
 HIGH = 0x1
 CHANGE = 0x2

问题 1:谁能告诉我为什么会发生这种情况? 问题 2:ESP32 / Arduino 中是否有定义在 GPIO 输入电平上触发重复中断?我不知道这是一件事。

谢谢

esp32 arduino-esp32
1个回答
0
投票

一个常见的过程是禁用 ISR 中的中断,并在退出 ISR 后重新启用它。我希望这有帮助

© www.soinside.com 2019 - 2024. All rights reserved.