Page 1 of 1

RTC wakeup depends on calibration value ???

Posted: Tue Jan 22, 2019 10:26 am
by Hanilein
There is a problem with the RTC wakeup, the timing depends on the calibration value and is therefore incorrect... Sorry for the long text, but I am kinda stuck...

I am working on a code to self-adjust the RTC on the PyBoard.

The code uses a PPS signal from a GPS to calculate the calibration value of the RTC, which is set with rtc.calibration(value).
This value has a range from -511 to +512, and effectively adds or subtracts this number of pulses over a period of 32 seconds from the quarz oscillation, running at 32768Hz.

That works really well, and my development Pyboard currently uses a correction value of -293, and keeps it's time pretty stable (~1-5 seconds/day deviation).

I want the RTC to generate an interrupt precisely every second using rtc.wakeup(milliSeconds, IRQhandler) with a millisecond value of 1000.
The IRQhandler fetches the current time from the RTC and prints it (using the scheduler), and that's how it looks:

22.01.2019 22:51:57:99 0

The 99 represent 1/100 seconds, and the 0 is the subsecond value. Regardless the correction value, this timestamp should never change!
Now look at these values:

22.01.2019 22:52:57:98 4 This is the timestamp after 1 minute - a deviation of 1/64 second.
22.01.2019 23:00:57:85 38 And this is the timestamp after 9 minutes - we are 148 milliseconds off, compared to the start time.

Remember, the RTC is adjusted.

I then tested with another pyboard and also played with the correction value for the RTC - there is no deviation over hours, when the correction value is 0!

In other words, I never get a precise, repeated interrupt with the RTC. :o

For another part of the project the RTC should wake up the ┬ÁC at a given date/time, but this functionality is not implemented. According to the datasheet this is possible, but the Python implementation currently does not support this :(.

Re: RTC wakeup depends on calibration value ???

Posted: Tue Jan 22, 2019 12:33 pm
by chuckbook
If rtc.wakeup(ms, wup) is used, STM32 will always use non-calibrated RTC timer for intervals < 16s.
For intervals >= 16s the calibrated 1s timer will be used.
To force rtc.wakeup using 1s clock, use:

Code: Select all

rtc.wakeup(4, 0, wup) # 1s interval
rtc.wakeup(4, 1, wup) # 2s interval

Re: RTC wakeup depends on calibration value ???

Posted: Wed Jan 23, 2019 9:34 am
by Hanilein
Excellent, thank you!

Works like a charm.