← index #7849Issue #6701
Related · high · value 3.360
QUERY · ISSUE

STM32 sleep wake time problem

openby china-zhangdjopened 2021-09-24updated 2024-10-02
port-stm32
rtc.wakeup(ms)
machine.lightsleep(ms)

Do these two functions use the same wake-up source?
What is the maximum value of ms?

CANDIDATE · ISSUE

RTC wakeup callback should be executed immediately rather than deferred

openby acutetechopened 2020-12-17updated 2024-09-13
port-stm32

AFAIK the callback invoked by RTC.wakeup is scheduled for later execution rather than being executed immediately, as the pin interrupts are.

See: https://github.com/micropython/micropython/blob/master/ports/stm32/extint.c#L657

IMHO this is undesirable behaviour. If the RTC is used to (a) wake the processor after machine.sleep() and (b) set a flag to be inspected by the main thread, then it has the effect that the flag may not be ready for inspection.

The code below illustrated the problem. I find that for correct operation it is necessary to add a delay after execution resumes and before inspecting variables changed by the callback. Commenting out the delay at line 17 results in undesirable behaviour.

I ran this on an OpenMV camera and the OpenMV github issue here provides more details of how I found this bug/feature, and some further analysis https://github.com/openmv/openmv/issues/1032

`
import machine, pyb, time

global triggered
triggered = False

def callback(arg):
global triggered
triggered = True

pyb.RTC().wakeup(1000, callback)

while (True):

machine.sleep()
# At this point the RTC will have woken us but the callback may not have been executed.
# This delay is essential to allow the callback to execute and update 'triggered'
time.sleep_ms(1)    # Required minimum delay is not known. Do not use sleep_us()

if (triggered):
    # Toggle green LED to indicate correct behaviour.
    # 'triggered' is seen as having changed
    pyb.LED(2).toggle()
else:
    # Toggle red LED to indicate incorrect behaviour.
    # 'triggered' is NOT seen as having changed
    pyb.LED(1).toggle()

triggered = False

`

Keyboard

j / / n
next pair
k / / p
previous pair
1 / / h
show query pane
2 / / l
show candidate pane
c
copy suggested comment
r
toggle reasoning
g i
go to index
?
show this help
esc
close overlays

press ? or esc to close

copied