Esp32-C3使用gpio唤醒深度睡眠,rtc gpio0~5始终置低,导致低电平唤醒一直复位,高电平唤醒无效?
为省电环保,需要让芯片进入深度睡眠,然后在需要时唤醒它,而不是复位重启
我使用vscode+platformIO+arduino开发DfRobot的esp32-c3的这块开发板。因为esp32-C3官方称它深度水睡眠时电流只有5μa,这样的功耗是非常诱人的。为了在不需要它工作时让它休眠,需要时再唤醒它,这想着就觉得很爽,再加上这块板子只有20.5mm×25mm这么大,完美的environment friendly。
esp32-c3和esp32系列不一样不支持ext0/1唤醒,也没有Touchpad不支持触摸唤醒,而esp_sleep_gpio_wakeup仅支持lightsleep。根据乐鑫官方文档所说esp32-c3可以使用
esp_deep_sleep_enable_gpio_wakeup(uint64_t gpio_pin_mask, esp_deepsleep_gpio_wake_up_mode_t mode )
这个函数就可以把芯片从deepsleep中唤醒:
并且似乎不需要在使用这个函数之前把IO拉高或拉低。
问题描述
事实情况似乎和官方文档所说的不一样
根据乐鑫的官方文档,GPIO 0~5都是RTC GPIO,于是我先用上面这个函数设置高电平唤醒,然后进入睡眠
esp_deep_sleep_enable_gpio_wakeup(1, ESP_GPIO_WAKEUP_GPIO_HIGH);
esp_deep_sleep_start();
进入深度睡眠后,用万用表测得1号引脚为低电平,但连线接3v3后无反应,GPIO 1始终置低。于是我设置低电平唤醒:
esp_deep_sleep_enable_gpio_wakeup(1, ESP_GPIO_WAKEUP_GPIO_LOW)
esp_deep_sleep_start();
睡眠后可以唤醒,但由于GPIO 0始终置低,所以进入睡眠后会立即唤醒导致芯片一直处于唤醒状态。我还尝试了0,3,4,5号IO都是如此。尤其比较离谱的是这个板子GPIO 2始终置高,导致使用GPIO 2高电平唤醒就会和0,1,3~5正好相反,设置高电平唤醒时芯片一直会不断被唤醒,无法睡眠,接地时也无任何反应。
原因分析:
可能需要在芯片进入睡眠前,对GPIO进行配置
根据上述情况分析,GPIO本身的状态应该是和开发板外部电路设计有关,本身不是问题,问题在于当把IO拉高或拉低时,芯片并没有对信号做出回应。所以应该需要配置IO使它对信号能够做出反应。
解决方案:
最后还得是github
在github上找了一番,发现有个人也问这个问题,而且最后他自己解决了,巧的是他也用arduino框架开发C3。
原文网址:https://github.com/espressif/arduino-esp32/issues/6656
看了他的代码,简化了一下,使用以下代码即可完成使用指定GPIO唤醒Esp32-C3深度睡眠:
//定义用于RTC_GPIO唤醒的IO,0b为二进制,“0010”为2^(gpio 1)的二进制数
//gpio0~3 为0b1111,即2^0+2^1+2^2+2^3=15的二进制数
const uint64_t WAKEUP_PIN_BITMASK = 0b0010;
//配置唤醒源
gpio_deep_sleep_hold_dis(); //在深度睡眠时禁用所有数字gpio pad保持功能。
esp_deep_sleep_enable_gpio_wakeup(WAKEUP_PIN_BITMASK, ESP_GPIO_WAKEUP_GPIO_HIGH);
gpio_set_direction(GPIO_NUM_1, GPIO_MODE_INPUT); //GPIO定向,设置为输入或输出
//开始睡眠
esp_deep_sleep_start();
完美解决!