乐鑫技术交流
直播中

刘刚

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

ESP32 light sleep模式下定时呼醒和外部中断呼醒不能同时使用怎么解决?

芯片:ESP32
  IDF:V4.3
例程:light_sleep_example_main.c
          其中例程中设置定时呼醒时间大于3秒才凸显 问题,如:Code: Select all
esp_sleep_enable_timer_wakeup(5000000);
项目中使用G-sensor,而G-sensor的中断脚输出连接至EPS32的GPIO17,
如果G-sensor中断输出配置成空闲高电平,中断输出时为低电平,然后ESP32配置为GPIO17低电平呼醒,此时定时呼醒和外部中断呼醒可以同时正常使用;
如果G-sensor中断输出配置成空闲低电平,中断输出时为高电平,然后ESP32配置为GPIO17高电平呼醒,此时定时呼醒和外部中断呼醒不可以同时正常使用,表现现象为GPIO17没有中断,但wakeup_reason = "pin",而且呼醒时间小于设定的定时呼醒时间(设置呼醒时间必须大于3秒才有效果);

请问,这是什么原因引起的?如何解决?
                  

回帖(1)

张莹

2024-6-19 16:55:46
在ESP32的light sleep模式下,定时唤醒和外部中断唤醒不能同时使用的问题,可以通过以下步骤解决:

1. 分析问题:首先,我们需要了解问题的本质。在这种情况下,问题在于ESP32的light sleep模式下,定时唤醒和外部中断唤醒不能同时工作。这可能是因为ESP32在light sleep模式下,某些功能被禁用,导致无法同时处理这两种唤醒方式。

2. 查阅文档:查阅ESP32的官方文档和相关论坛,了解是否有其他开发者遇到类似问题,以及他们是如何解决的。这可以帮助我们找到可能的解决方案。

3. 调整配置:根据问题描述,当G-sensor的中断输出配置为空闲低电平时,定时唤醒和外部中断唤醒可以正常工作。因此,我们可以尝试调整G-sensor的中断输出配置,以解决这个问题。

4. 编写代码:根据调整后的配置,编写相应的代码来实现定时唤醒和外部中断唤醒的共存。以下是一个示例代码:

```c
#include "driver/gpio.h"
#include "esp_sleep.h"

void app_main(void)
{
    gpio_config_t io_conf;
    io_conf.intr_type = GPIO_PIN_INTR_LO_LEVEL; // 设置GPIO17为低电平触发中断
    io_conf.mode = GPIO_MODE_INPUT;
    io_conf.pin_bit_mask = (1ULL<<17);
    io_conf.pull_down_en = 0;
    io_conf.pull_up_en = 1;
    gpio_config(&io_conf);

    while(1)
    {
        esp_sleep_enable_timer_wakeup(5000000); // 设置定时唤醒,5秒后唤醒
        esp_sleep_enable_ext0_wakeup((1ULL<<17), ESP_SLEEP_WAKEUP_ANY_HIGH); // 设置GPIO17高电平唤醒

        esp_light_sleep_start();

        // 处理唤醒后的事务
        // ...
    }
}
```

5. 测试:在实际硬件上运行修改后的代码,检查定时唤醒和外部中断唤醒是否可以正常工作。

6. 优化:如果测试结果满意,可以进一步优化代码,提高性能和稳定性。

通过以上步骤,我们可以尝试解决ESP32在light sleep模式下定时唤醒和外部中断唤醒不能同时使用的问题。
举报

更多回帖

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