繁体   English   中英

如何清除 NodeMCU ESP32 中的任何挂起中断?

[英]How can I clear any pending interrupts in the NodeMCU ESP32?

我已经构建了一个简单的硬币传感器,带有两个铜板,可以检测硬币何时击中它们。 敲击两个盘子后,我触发了一个中断,如下所示:

attachInterrupt( digitalPinToInterrupt(INPUT_PIN_COIN), Interrupt_CoinDeposit, FALLING );

这很好用,当硬币撞击两个盘子时,我可以捡起来。 为了避免由于接触反弹而多次注册同一个硬币,我在Interrupt_CoinDeposit()函数中分离了中断,如下所示:

void IRAM_ATTR Interrupt_CoinDeposit()
{
    detachInterrupt(digitalPinToInterrupt(17));
    g_crOSCore.EnqueueCoin();
}

EnqueueCoin只是增加一个计数器并返回到中断停止的地方。 之后,我检查计数器是否增加,如果增加,我重新附加中断。 但是,在重新附加中断时,它会立即触发。 我了解到重新附加中断会完成所有挂起的中断。 我不希望这种情况发生。 在 Arduino UNO R3 中,我相信您可以通过重置EIFR来解决这个问题。 我想知道 NodeMCU ESP32 是否有类似的东西?

您可以使用标志而不是禁用中断。 通过这种方式,您还可以避免在 ISR 中调用 detachInterrupt() 函数。

bool coinRegistered = false;
void IRAM_ATTR Interrupt_CoinDeposit()
{
    if (!coinRegistered) {
        coinRegistered = true;
        g_crOSCore.EnqueueCoin();
    }
}
/* ... somewhere else in the code ...*/
coinRegistered = false;

您可以在 ISR 中启动一个计时器来重置标志,或者您可以手动重置它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM