如何在不重置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
相关产品推荐
相关产品推荐

