乐鑫技术交流
直播中

凤毛麟角

8年用户 864经验值
私信 关注
[问答]

esp32c3唤醒深度睡眠之后如何连接WiFi?

我使用GPIO2来唤醒深度睡眠,唤醒之后使用wifi_init_sta()函数想连接WiFi,发现一直复位,如何解决这个问题?
switch (esp_sleep_get_wakeup_cause()) {
case ESP_SLEEP_WAKEUP_GPIO: {
            uint64_t wakeup_pin_mask = esp_sleep_get_gpio_wakeup_status();
            if (wakeup_pin_mask != 0) {
                int pin = __builtin_ffsll(wakeup_pin_mask) - 1;
                printf("Wake up from GPIO %dn", pin);
               
                wifi_init_sta();
            } else {
                printf("Wake up from GPIOn");
            }
            break;
        }
                                                                                                                                                      

回帖(1)

甘满盛

2024-6-18 16:26:38
在ESP32C3唤醒深度睡眠之后连接WiFi的问题,我们可以按照以下步骤进行解决:

1. 首先,确保你的ESP32C3已经正确初始化。在程序开始时,调用`esp_chip_info()`和`esp_wifi_init()`函数来初始化硬件和WiFi模块。

```c
esp_chip_info_t chip_info;
esp_chip_info(&chip_info);
printf("ESP32-C3 chip version: %sn", chip_info.model);

esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES) {
    // NVS partition was truncated and needs to be erased
    ESP_ERROR_CHECK(nvs_flash_erase());
    ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret);

tcpip_adapter_init();
esp_event_loop_create_default();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&cfg);
```

2. 在深度睡眠之前,设置GPIO2为唤醒源。使用`esp_sleep_enable_gpio_wakeup()`函数来设置GPIO2的唤醒功能。

```c
gpio_config_t io_conf;
io_conf.intr_type = GPIO_PIN_INTR_DISABLE; // Disable interrupt
io_conf.mode = GPIO_MODE_INPUT; // Set as Input
io_conf.pin_bit_mask = (1ULL< io_conf.pull_down_en = 0; // Disable pull-down
io_conf.pull_up_en = 1; // Enable pull-up
gpio_config(&io_conf);

esp_sleep_enable_gpio_wakeup();
```

3. 进入深度睡眠。使用`esp_deep_sleep_start()`函数进入深度睡眠。

```c
esp_deep_sleep_start();
```

4. 在唤醒后,检查唤醒原因。如果是因为GPIO2唤醒,尝试连接WiFi。

```c
switch (esp_sleep_get_wakeup_cause()) {
    case ESP_SLEEP_WAKEUP_GPIO: {
        uint64_t wakeup_pin_mask = esp_sleep_get_gpio_wakeup_status();
        if (wakeup_pin_mask & (1ULL << GPIO_NUM_2)) {
            esp_wifi_start();
            esp_wifi_connect();
            break;
        }
    }
    // Handle other wakeup causes if necessary
}
```

5. 如果连接WiFi失败,可以添加错误处理和重试机制。例如,如果连接失败,可以再次尝试连接,或者进入深度睡眠等待下一次唤醒。

请注意,ESP32C3在唤醒后可能需要一些时间来恢复WiFi模块的工作状态。因此,在尝试连接WiFi之前,可以考虑添加一个小的延时,例如:

```c
vTaskDelay(100 / portTICK_PERIOD_MS);
```

通过以上步骤,你应该能够在ESP32C3唤醒深度睡眠之后成功连接WiFi。如果仍然遇到问题,请检查硬件连接和电源供应,确保没有其他问题影响WiFi模块的正常工作。
举报

更多回帖

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