You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不重置RTC时钟的情况下重启设备?

保留RTC时间的设备重启方案

默认使用machine.reset()软重启设备时,RTC时钟会回到初始值,这是因为多数MicroPython设备的RTC未将时间持久化到非易失性存储,或软重启流程会重置RTC状态。以下是几种实现"重置设备但保留RTC时间"的方法:

方法1:将RTC时间写入非易失性存储(NVS),重启后恢复

针对ESP32这类支持NVS的设备,可在重启前把RTC时间存入NVS,重启后读取并恢复。

重启前保存时间的代码:

import machine
import time
import esp32

# 设置示例RTC时间
rtc = machine.RTC()
rtc.datetime((2052, 11, 10, 10, 26, 45, 6, 315))
print("当前时间:", time.localtime())

# 将RTC时间分量存入NVS
nvs = esp32.NVS("rtc_store")
dt = rtc.datetime()
nvs.set_i32("year", dt[0])
nvs.set_i32("month", dt[1])
nvs.set_i32("day", dt[2])
nvs.set_i32("hour", dt[4])
nvs.set_i32("minute", dt[5])
nvs.set_i32("second", dt[6])
nvs.commit()

# 执行软重启
machine.reset()

重启后恢复时间的初始化代码(放在程序开头):

import machine
import esp32
import time

rtc = machine.RTC()
try:
    # 从NVS读取时间并恢复RTC
    nvs = esp32.NVS("rtc_store")
    year = nvs.get_i32("year")
    month = nvs.get_i32("month")
    day = nvs.get_i32("day")
    hour = nvs.get_i32("hour")
    minute = nvs.get_i32("minute")
    second = nvs.get_i32("second")
    # RTC.datetime格式:(年, 月, 日, 星期, 时, 分, 秒, 微秒),星期可设为0
    rtc.datetime((year, month, day, 0, hour, minute, second, 0))
except Exception:
    # 若NVS无数据,设置默认时间
    rtc.datetime((2024, 1, 1, 1, 0, 0, 0, 0))

print("重启后时间:", time.localtime())

如果是ESP8266这类无NVS模块的设备,可将时间写入文件系统的小型文件(如rtc_time.txt),重启后读取解析即可。

方法2:触发硬件复位(部分设备适用)

若你的设备RTC带有独立备份电源(如外接纽扣电池),硬件复位(而非软重启)不会丢失RTC时间。可通过代码控制复位引脚触发硬件复位:

import machine
# 以ESP32为例,控制复位引脚拉低触发复位(需根据硬件设计调整引脚和电平)
rst_pin = machine.Pin(0, machine.Pin.OUT)
rst_pin.value(0)

注意:不同设备的复位引脚逻辑不同,需参考对应硬件手册。

方法3:确认RTC备份域配置(STM32等设备)

部分STM32系列设备的RTC支持备份域,只要备份域电源未断开,重启后RTC时间会自动保留。若使用自定义MicroPython固件,需确认固件中已正确配置RTC备份域;官方固件通常已默认开启该功能。

内容的提问来源于stack exchange,提问作者GILO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:41:36