完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
ESP32 共有 40 个 GPIO, 每个 GPIO 都可响应外部中断, 中断触发模式有边沿触发和电平触发. 其中 GPIO0 ~ GPIO31 中断状态由寄存器 GPIO_STATUS_W1TC_REG 清除, GPIO32 ~ GPIO39 中断状态由寄存器 GPIO_STATUS1_W1TC_REG 清除. 在清除中断状态时, 如果位于同一组寄存器的 GPIO 刚好产生中断, 很有可能会导致该中断丢失. 即在置位 GPIO_STATUS_W1TC_REG 中某一 bit 时, 如果 GPIO0~GPIO31 刚好有一个 GPIO 产生一个中断, 则该中断很有可能会丢失. GPIO32~GPIO39 同理. 但在置位 GPIO_STATUS_W1TC_REG 时, 不会导致 GPIO32~GPIO39 的中断丢失. 该问题只会导致边沿触发类型的中断丢失. 下面介绍如何通过软件来解决这个问题.
对于电平触发的中断, 当触发电平有效时, 中断状态被清除, 硬件会继续产生中断, 所以电平触发的中断不会丢失. 解决中断丢失的方案就是使用电平触发的中断, 以下的示例代码将在高电平的时候产生一次中断, 与 rising edge 类型中断效果相同. const uint64_t INPUT_PIIN_MASK = (1ULL 以上代码可以解决中断丢失的问题, 但是带来的代价是中断次数会加倍(相对于 rising edge 和 falling edge ) |
|
相关推荐
1个回答
|
|
要解决ESP32 GPIO中断丢失的问题,可以采取以下几个步骤:
1. **使用中断服务程序(ISR)**:确保每个GPIO中断都有一个相应的中断服务程序(ISR)。在ISR中,首先清除中断标志,然后再处理中断事件。这样可以确保中断被正确处理,避免丢失。 2. **使用中断标志位**:在ISR中,使用中断标志位来记录中断事件。这样可以在中断处理过程中,即使有新的中断发生,也不会丢失之前的中断事件。 3. **避免在中断服务程序中执行耗时操作**:在ISR中,尽量避免执行耗时的操作,如I/O操作、复杂计算等。这样可以减少中断处理时间,降低中断丢失的风险。 4. **使用中断优先级**:为不同的GPIO中断设置不同的优先级,以确保关键中断能够优先处理。这样可以在多个中断同时发生时,保证关键中断不会被其他中断覆盖。 5. **使用软件去抖动**:在某些情况下,外部信号可能会产生抖动,导致GPIO中断频繁触发。可以在ISR中添加软件去抖动逻辑,以减少误触发。 6. **检查硬件连接**:确保GPIO引脚的硬件连接正确,没有接触不良或短路等问题。这些问题可能会导致GPIO中断不稳定,从而引发中断丢失。 7. **更新ESP32固件**:检查ESP32的固件版本,如果有更新,及时更新到最新版本。新版本的固件可能修复了一些已知的中断丢失问题。 8. **使用外部中断控制器**:如果ESP32的GPIO中断仍然无法满足需求,可以考虑使用外部中断控制器。外部中断控制器可以提供更多的中断资源和更灵活的中断处理方式。 通过以上措施,可以有效地降低ESP32 GPIO中断丢失的风险,提高系统的稳定性和可靠性。 |
|
|
|
只有小组成员才能发言,加入小组>>
1012 浏览 1 评论
557浏览 6评论
464浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
449浏览 5评论
449浏览 4评论
424浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-1 11:05 , Processed in 0.527841 second(s), Total 47, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号