深度睡眠唤醒存根
深度睡眠唤醒存根
ESP32 支持在深度睡眠时运行“深度睡眠唤醒存根”。芯片唤醒后立即运行此功能 - 在任何正常初始化,引导加载程序或 ESP-IDF 代码运行之前。唤醒存根运行后,SoC 可以返回休眠状态或继续正常启动 ESP-IDF。
深度睡眠唤醒存根代码被加载到“RTC 快速存储器”中,它使用的任何数据也必须加载到 RTC 存储器中。RTC 存储区域在深度睡眠期间保持其内容,
唤醒存根规则
必须仔细编写唤醒存根代码:
- 由于 SoC 刚刚从睡眠状态中醒来,大多数外设都处于复位状态。SPI Flash 未映射。
- 唤醒存根代码只能调用 ROM 中或加载到 RTC 快速存储器中实现的功能(见下文)。
- 唤醒存根代码只能访问 RTC 存储器中加载的数据。所有其他 RAM 将无法使用并具有随机内容。唤醒存根可以使用其他 RAM 进行临时存储,但是当 SoC 重新进入休眠状态或启动 ESP-IDF 时,内容将被覆盖。
- RTC 内存必须包含存根使用的任何只读数据(.rodata)。
- 每当 SoC 重新启动时,RTC 存储器中的数据都会被初始化,除非从深度睡眠中唤醒。从深度睡眠中醒来时,保持睡眠前存在的值。
- 唤醒存根代码是 esp-idf 应用程序的一部分。在 esp-idf 的正常运行期间,函数可以调用唤醒存根函数或访问 RTC 存储器。就好像这些是应用程序的常规部分。
实现存根
esp-idf 中的唤醒存根的函数 esp_wake_deep_sleep()
。只要 SoC 从深度睡眠中唤醒,该函数就会运行。esp-idf 中提供了此函数的默认版本,但默认函数是弱链接的,因此如果您的应用程序包含名为 esp