簡體   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