← index #1509Issue #1523
Related · high · value 0.411
QUERY · ISSUE

RTC initialisation and wakeup from external events

openby peterhinchopened 2015-10-13updated 2015-10-25
ports

If the Pyboard is woken from standby by the tamper pin X18, the RTC is reset to 1st January 2014 regardless of any setting performed in code.

It appears impossible to prevent this from Python as it occurs in rtc_init() which is called from main.c. The problem occurs because rtc_init() checks backup register 0 for a specific value 0x32f2 to see if the RTC has already been set. If the value is not correct it assumes the Pyboard has been powered up, sets the RTC to that date, and sets the value of backup register 0 to 0x32f2 to ensure that the RTC continues to run through reset events.

Unfortunately the tamper pin clears the backup registers, so on recovery from standby rtc_init() runs again, detects that the register does not hold 0x32f2 and resets the RTC.

I have produced a build where RTC initialisation occurs in the constructor. This has a boolean argument defaulting True: if present and set False, initialisation is inhibited. This allows the user to take control of the detection of boot events and initialisation of the RTC (power up can be detected by checking the contents of backup RAM which are unaffected by tamper events).

If the argument is absent or True initialisation and boot detection work as at present so existing code should be unaffected.

If this approach meets with approval I can submit a PR.

CANDIDATE · ISSUE

interaction between pyb.standby() and pyb.rtc()

closedby jimtal001opened 2015-10-20updated 2015-11-05
ports

While preparing to calibrate the RTC using rtc.calibration (), I found that there is a bug related to pyb.standby(). Using pyb.standby() a small amount of time is lost to the RTC with each wakeup (around 0.2 sec). To reproduce the issue use the following code (time_cal.py) to set, syncronize and output the time to PC for a one hour period. At the end of the one hour period I found approximately a 19,000 ppm (tick) delta between PC and pyboard. The mode pyb.stop() does NOT have this issue and adding a battery backup VBAT does not fix the issue for pyb.standby().

import pyb, stm
import micropython

rtc = pyb.RTC()
sleepTime = 10000 # in ms

def main():
   if (stm.mem32[stm.RTC + stm.RTC_BKP1R] == 0): # first boot, Code to run on 1st boot only
      rtc.datetime((2015,10,19,1,16,45,0,0))

   print(rtc.datetime())
   rtc.wakeup(sleepTime)
   stm.mem32[stm.RTC + stm.RTC_BKP1R] = 1 # indicate that we are going into standby mode
   pyb.standby()

main()

This is my boot.py

import pyb
import micropython
pyb.usb_mode(None)
uart = pyb.UART(4,115200)
pyb.repl_uart(uart)
pyb.main('time_cal.py')

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