乐鑫技术交流
直播中

李英

7年用户 1409经验值
私信 关注
[问答]

如何解决ESP32 GPIO中断丢失的问题?

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 = (1ULLio_number, isr_mode[io_param->io_tagle]);    io_param->io_tagle ^= 0x1;}void io_init(void){    gpio_config_t io_conf = {        .intr_type = GPIO_PIN_INTR_DISABLE,        .mode = GPIO_MODE_INPUT,        .pin_bit_mask = INPUT_PIIN_MASK,        .pull_down_en = 0,        .pull_up_en = 1,    };    //configure GPIO with the given settings    gpio_config(&io_conf);    if(gpio_install_isr_service( 0 ) != ESP_OK) {        printf("ISR install failn");        return;    }    //hook isr handler for specific gpio pin    gpio_isr_handler_add(GPIO_NUM_34, gpio_isr, (void*) &io34_param);    gpio_isr_handler_add(GPIO_NUM_36, gpio_isr, (void*) &io36_param);    gpio_isr_handler_add(GPIO_NUM_39, gpio_isr, (void*) &io39_param);    gpio_set_intr_type(GPIO_NUM_34, GPIO_INTR_HIGH_LEVEL);    gpio_intr_enable(GPIO_NUM_34);    gpio_set_intr_type(GPIO_NUM_36, GPIO_INTR_HIGH_LEVEL);    gpio_intr_enable(GPIO_NUM_36);    gpio_set_intr_type(GPIO_NUM_39, GPIO_INTR_HIGH_LEVEL);    gpio_intr_enable(GPIO_NUM_39);}

以上代码可以解决中断丢失的问题, 但是带来的代价是中断次数会加倍(相对于 rising edge 和 falling edge )
                             

回帖(1)

李芳

2024-6-26 17:17:37
要解决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中断丢失的风险,提高系统的稳定性和可靠性。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分