ESP32 深度睡眠 RTC 时钟漂移问题解决思路|长时间休眠时间偏移校准方案
一,背景:
在 ESP32 低功耗产品开发中,设备目标静态功耗控制在 20uA。为满足这个极低功耗指标,不能启用内部高精度时钟,我用的是内部的慢速时钟,深度睡眠阶段只能依靠芯片内部 132KHz 分频 RTC 时钟来计时休眠时长。
但这里遇到一个明显缺陷:132KHz 内部 RC 时钟精度很差,休眠时间越长,时钟累计偏移越大。
简单说:我设定休眠 1 小时,实际可能提前或者延后很久才唤醒;休眠越久误差越明显。如果依靠这个 RTC 时间做业务逻辑,长时间运行后时间会错乱
二,解决方案:
1,ESP32 按设定进入深度睡眠,依靠内部 132K RTC 计时,时间到后唤醒;
2,唤醒后优先联网获取网络标准时间,用网络时间对本地时间做一次校准;
3,对比「当前真实网络时间」和「目标业务时间」:
4,如果还没到设定的业务触发时间 → 重新计算剩余需要休眠的时长,再次进入深度睡眠;
5,如果已经到达 / 超过设定业务时间 → 退出休眠,执行正常业务逻辑
三,简单的代码逻辑:
void app_main(void)
{
// 唤醒后,联网获取NTP网络时间,校准本地时间
localtime_r(&now_time, &timeinfo);
// 判断:当前标准时间 是否到达目标业务时间
if(now_time < target_work_time)
{
// 计算还需要休眠多久
uint64_t sleep_remain = target_work_time - now_time;
// 进入深度睡眠,设置本次休眠时长
esp_deep_sleep(sleep_remain * 1000000ULL);
}
else
{
// 到达设定时间,执行业务逻辑
xTaskCreate(sensor_task, "sensor_task", 1024 * 16, NULL, 3, sensor_handle);
}
}
浙公网安备 33010602011771号