ESP8266 低功耗解决方案
ESP8266 系列芯⽚提供三种可配置的睡眠模式,针对这些睡眠模式,官方提供了多种低功耗解决⽅案,⽤户可以结合具体需求选择睡眠模式并进⾏配置。三种睡眠模式如下:
- Modem-sleep
- Light-sleep
- Deep-sleep
三种模式的区别如表 1-1 所示。
说明:
- 对于 Modem-sleep 和 Light-sleep 模式,SDK 提供接⼝来使能睡眠模式,并由系统底层决定何时进⼊ 睡眠。具体请 Modem-sleep 和 Light-sleep。
- 在 Deep-sleep 模式下,何时进⼊睡眠由⽤户控制,调⽤接⼝函数就可⽴即进⼊ Deep-sleep 模式。具 体请参考 Deep-sleep。
- RTC (Real-Time Clock):实时时钟。
- DTIM (Delivery Traffic Indication Message):使⽤⽆线路由器时⽆线发送数据包的频率。
Modem-sleep
⽬前 ESP8266 的 Modem-sleep 仅⼯作在 Station 模式下,连接路由器后⽣效。ESP8266 通过 Wi-Fi 的 DTIM Beacon 机制与路由器保持连接。 在 Modem-sleep 模式下,ESP8266 会在两次 DTIM Beacon 间隔时间内,关闭 Wi-Fi 模块 电路,达到省电效果,在下次 Beacon 到来前⾃动唤醒。睡眠时间由路由器的 DTIM Beacon 时间决定。睡眠同时可以保持与路由器的 Wi-Fi 连接,并通过路由器接受来⾃⼿ 机或者服务器的交互信息。
系统通过以下接⼝进⼊ Modem-sleep 模式。
wifi_set_sleep_type(MODEM_SLEEP_T)
在 Modem-sleep 模式下,系统可以⾃动被唤醒,⽆需配置接⼝。
Modem-sleep ⼀般⽤于必须打开芯⽚ CPU 的应⽤场景,例如 PWM 彩灯,需要 CPU 实时 控制。
3.Light-sleep
3.1 特性
Light-sleep 的⼯作模式与 Modem-sleep 相似,不同的是,除了关闭 Wi-Fi 模块电路以 外,在 Light-sleep 模式下,还会关闭时钟并暂停内部 CPU,⽐ Modem-sleep 功耗更低。
⚠ 注意: 在 Light-sleep 之前把处于输出状态的管脚改为输⼊状态,⽐如:MTDO、U0TXD、GPIO0,消除管脚上的 漏电,可使 Light-sleep 的功耗更低。
3.2. 接⼝说明
3.2.1 系统通过以下接⼝进⼊ Light-sleep 模式。
wifi_set_sleep_type(LIGHT_SLEEP_T)
说明: 在 Wi-Fi 连接后,并且 CPU 处于空闲状态时,会⾃动进⼊ Light-sleep 状态。
3.2.2. 强制休眠
⽤户可以使系统强制进⼊ Light-sleep 模式,即调⽤强制休眠接⼝,强制关闭射频。关于 强制休眠接⼝的说明,请参考《ESP8266 Non-OS SDK API 参考》中的 3.7 节 强制休眠 接⼝ 和 ESP8266 RTOS SDK API Reference 中的 4.12 节 Force Sleep APIs。
3.3. 外部唤醒
在 Light-sleep 模式下,CPU 在暂停状态下不会响应来⾃外围硬件接⼝的信号与中断,因 此需要通过外部 GPIO 信号将 ESP8266 唤醒,硬件唤醒过程⼤约为 3 ms。由于 Wi-Fi 初 始化过程需要⼤约 1 ms,所以建议⽤户 5 ms 之后再对芯⽚进⾏操作。
通过 GPIO 唤醒只能配置为电平触发模式,接⼝如下。
void wifi_enable_gpio_wakeup(uint32 i, GPIO_INT_TYPE intr_state);
例如:设置 GPIO12 为唤醒 GPIO 管脚。
GPIO_DIS_OUTPIT(12);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);
wifi_enable_gpio_wakeup(12, GPIO_PIN_INTR_LOLEVEL);
说明: GPIO16 不能⽤于唤醒。
3.4. 应⽤
Light-sleep 模式可⽤于需要保持与路由器的连接,可以实时响应路由器发来的数据的场 合。并且在未接收到命令时,CPU 可以处于空闲状态。⽐如 Wi-Fi 开关的应⽤,⼤部分时 间 CPU 都是空闲的,直到收到控制命令,CPU 才需要进⾏ GPIO 的操作。
4. Deep-sleep
4.1. 特性
相对于其他两种模式,系统⽆法⾃动进⼊ Deep-sleep,需要由⽤户调⽤接⼝函数 system_deep_sleep 来控制。在该模式下,芯⽚会断开所有 Wi-Fi 连接与数据连接,进⼊ 睡眠模式,只有 RTC 模块仍然⼯作,负责芯⽚的定时唤醒。
说明: 在 Deep-sleep 状态下,GPIO 电平状态可以保持,具有 2 μA 的驱动能⼒ 。
4.2. 接⼝说明
4.2.1. 使能
Deep-sleep 通过以下接⼝使能 Deep-sleep。
void system_deep_sleep(uint32 time_in_us)
参数说明:
- uint32 time_in_us =0 不会定时唤醒,即不会主动醒来。
- uint32 time_in_us ≠0 会在设定的时间后,⾃动唤醒(单位:μs)。
4.2.2. 配置 Deep-sleep
可以通过以下接⼝配置 Deep-sleep 唤醒时的软件⼯作流程,从⽽影响⻓期运⾏的平均功 耗。
bool system_deep_sleep_set_option(uint8 option)
- deep_sleep_set_option(0) 由 init 参数的第 108 字节控制 Deep-sleep 唤醒时是否作射频校准。
- deep_sleep_set_option(1) 表示下⼀次 Deep-sleep 唤醒时要作射频校准,功耗较⼤。
- deep_sleep_set_option(2) 表示下⼀次 Deep-sleep 唤醒时不作射频校准,功耗较⼩。deep_sleep_set_option(4) 表示下⼀次 Deep-sleep 唤醒时不打开射频,和 Modem-sleep ⼀样,电流 最⼩。
说明: init 参数即 esp_init_data_default.bin 内的参数值。⽐如,将第 108 字节的数据改为 8,并且调⽤ deep_sleep_set_option(0),则表示芯⽚每 8 次 Deep-sleep 唤醒才会进⾏射频校准。⽤户可以参考 ESP8266 低功耗传感器示例应⽤,链接如下: https://github.com/EspressifSystems/low_power_voltage_measurement/wiki。
4.3. 唤醒
4.3.1.⾃动唤醒
在 Deep-sleep 状态下,可以将 GPIO16 (XPD_DCDC) 连接⾄ EXT_RSTB。计时到达睡眠 时间后,GPIO16 输出低电平给 EXT_RSTB 管脚,芯⽚即可被重置并被唤醒。
4.3.2.外部唤醒
在 Deep-sleep 状态下,可以通过外部 IO 在芯⽚ EXT_RSTB 管脚上产⽣⼀个低电平脉 冲,芯⽚即可被重置并被唤醒。
注意: 如果⾃动唤醒与外部唤醒须要同时作⽤,须要在外部电路设计时,使⽤合适的线逻辑操作电路。
4.4. 应⽤
Deep-sleep 可以⽤于低功耗的传感器应⽤,或者⼤部分时间都不需要进⾏数据传输的情 况。设备可以每隔⼀段时间从 Deep-sleep 状态醒来测量数据并上传,之后继续进⼊ Deep-sleep。也可以将多个数据存储于 RTC memory(RTC memory 在 Deep-sleep 模式 下仍然可以保存数据),然后⼀次发送出去。
官方PDF地址:https://www.espressif.com/sites/default/files/documentation/9b-esp8266-low_power_solutions_cn.pdf