Skip to content

RP2: machine.RTC().datetime() does not advance during lightsleep #16519

Open
@madozu

Description

@madozu

Port, board and/or hardware

Raspberry Pi Pico W and Raspberry Pi Pico 2 W

MicroPython version

All versions starting with v1.24.0 (including latest v1.26.0-preview.277.g4bd99260d)

Reproduction

  1. Copy code below to Pico and name it "main.py"
  2. Reset the Pico and allow the code to complete (approx 5 seconds). No repl needed as the code writes a log file to the flash storage
  3. Connect the Pico to the USB port and inspect the file "local.log" on the Pico

Code used to test:

# Test RTC sleep behaviour
import machine, os, time

SLEEP_MS = const(2000)

def write_log(s: str) -> None:
    dt = machine.RTC().datetime()
    log_text = f"[RTC={dt[4]:02d}:{dt[5]:02d}:{dt[6]:02d} ticks={time.ticks_ms()}]  {s}"
    with open("local.log", "a") as file:
        file.write(log_text + "\n")

write_log(f"Machine = '{os.uname()[4]}'")
write_log(f"Version = '{os.uname()[3]}'")
time.sleep_ms(SLEEP_MS)
write_log(f"After time.sleep_ms({SLEEP_MS})")
machine.lightsleep(SLEEP_MS)
write_log(f"After machine.lightsleep({SLEEP_MS})")

Expected behaviour

The real time clock should advance by 2 seconds after running 'machine.lightsleep(2000)' like it was on micropython versions up to and including 1.23.0. Example output from 1.23.0:

[RTC=00:00:01 ticks=49]  Machine = 'Raspberry Pi Pico W with RP2040'
[RTC=00:00:01 ticks=54]  Version = 'v1.23.0 on 2024-06-02 (GNU 13.2.0 MinSizeRel)'
[RTC=00:00:03 ticks=2058]  After time.sleep_ms(2000)
[RTC=00:00:05 ticks=4065]  After safe_sleep(2000) with 0 early wakeups

Observed behaviour

The real time clock does not advance during machine.lightsleep(2000) as shown below running on v1.26.0-preview.277:

[RTC=00:00:01 ticks=36]  Machine = 'Raspberry Pi Pico W with RP2040'
[RTC=00:00:01 ticks=42]  Version = 'v1.26.0-preview.277.g4bd99260d on 2025-06-26 (GNU 14.2.0 MinSizeRel)'
[RTC=00:00:03 ticks=2033]  After time.sleep_ms(2000)
[RTC=00:00:03 ticks=4037]  After machine.lightsleep(2000)

Additional Information

While machine.RTC().datetime() does not advance during machine.lightsleep(), however, time.ticks_ms advances as expected.

Code of Conduct

Yes, I agree

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions