![](/img/trans.png)
[英]How to read a rotary encoder with interrupts on ESP32 and global flags
[英]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.