circuitpython/ports/atmel-samd
Jeff Epler 372306411a
samd: Don't rely on RTC interrupt
I instrumented RTC_Handler and determined that on SAMD51 it was possible
for the interrupt to be delivered well before the actual overflow of the
RTC COUNT register (e.g., a value as small as 0xffff_fffd could be seen
at the time of overflow)

Rather than depending on the overflow interrupt coming in at the same time
as COUNT overflows (exactly), rely only on observed values of COUNT in
_get_count, overflowing when it wraps around from a high value to a low
one.

With this change, PLUS a second change so that it is possible to warp
the RTC counter close to an overflow and test in 20ms instead of 3 days,
there was no problem detected over 20000+ overflows. Before, a substantial
fraction (much greater than 10%) of overflows failed.

Fixes #5985

Change to common-hal/rtc/RTC.c for time warping (plus make rtc_old_count non-static):
```patch
 void common_hal_rtc_set_calibration(int calibration) {
+
+    common_hal_mcu_disable_interrupts();
+
+        RTC->MODE0.COUNT.reg = 0xffffff00;
+        rtc_old_count = 0;
+        do {
+        while ((RTC->MODE0.SYNCBUSY.reg & (RTC_MODE0_SYNCBUSY_COUNTSYNC | RTC_MODE0_SYNCBUSY_COUNT)) != 0) { }
+    }
+    while(RTC->MODE0.COUNT.reg < 0xffffff00);
+    common_hal_mcu_enable_interrupts();
+
+    mp_printf(&mp_plat_print, "Warping RTC in calibration setter count=%08x rtc_old_count=%08x\n", RTC->MODE0.COUNT.reg, rtc_old_count);
```

Test program:
```python
import time
from rtc import RTC

i = 0
while True:
    RTC().calibration = 1 # Warps to ~16ms before overflow, with patch to RTC code
    t0 = time.monotonic_ns()
    et = t0 + 20_000_000 # 20ms
    while (t1 := time.monotonic_ns()) < et: pass
    i += 1
    print(f"{i:6d}: duration {t1-t0}")
    if t1-t0 > 200_000_000: break
    print()
```
2022-03-25 14:48:03 -05:00
..
asf4@84f56af132
asf4_conf Merge pull request #4716 from tyomitch/main 2021-05-08 08:47:29 -05:00
bindings/samd Convert more modules to use MP_REGISTER_MODULE 2021-10-05 16:58:24 +05:30
boards Merge remote-tracking branch 'origin/main' into revamp-duplicate-usb-check 2022-03-24 09:44:41 -05:00
common-hal Also fix the read pin in the atmel and rp2040 ports 2022-03-06 11:33:07 +01:00
freetouch@b6859a349e
modules run code formatting script 2021-03-15 19:27:36 +05:30
peripherals@d3b20192cf improve SAMD audio DMA 2021-08-21 14:34:37 -04:00
sd_mmc codeformat: Fix filename matching 2021-04-30 10:48:08 -05:00
supervisor samd: Don't rely on RTC interrupt 2022-03-25 14:48:03 -05:00
tools run code formatting script 2021-03-15 19:27:36 +05:30
.gitattributes
.gitignore
Makefile Fix SAMD51 builds on GCC11.2 2022-03-08 10:41:34 -08:00
README.rst
audio_dma.c fix SAMD21 PDMIn DMA event use 2021-10-19 13:18:14 -04:00
audio_dma.h fix SAMD21 PDMIn DMA event use 2021-10-19 13:18:14 -04:00
background.c Remove OSError(0) and old network modules 2021-07-21 17:33:40 -07:00
background.h
eic_handler.c working samd deep sleep timealarm and pinalarm (sketchy) 2021-09-29 11:44:15 -06:00
eic_handler.h reworked fake sleep. functional for pin and time 2021-10-09 11:44:10 -06:00
fatfs_port.c Merge tag 'v1.17' into merge-1.17 2021-10-15 08:20:54 -05:00
ld_defines.c modifications by pre-commit 2021-03-15 18:11:00 -05:00
mpconfigport.h Add two space saving knobs 2021-08-31 13:02:34 -07:00
mpconfigport.mk turn off CIRCUITPY_ONEWIREIO by default for skinny SAMD21 builds 2022-02-09 11:40:07 -05:00
mphalport.c rework auto-reload delay logic 2022-03-11 14:03:04 -05:00
mphalport.h modifications by pre-commit 2021-03-15 18:11:00 -05:00
qstrdefsport.h Merge MicroPython 1.13 into CircuitPython 2021-05-04 18:06:33 -07:00
reset.c
reset.h
samd_peripherals_config.h
shared_timers.c Reset timers separate from pwmio 2021-08-11 09:58:31 -07:00
shared_timers.h Reset timers separate from pwmio 2021-08-11 09:58:31 -07:00
timer_handler.c modifications by pre-commit 2021-03-15 18:11:00 -05:00
timer_handler.h Reset timers separate from pwmio 2021-08-11 09:58:31 -07:00

README.rst

SAMD21 and SAMD51
==================

This port supports many development boards that utilize SAMD21 and SAMD51 chips. See
https://circuitpython.org/downloads for all supported boards.


Building
--------

For build instructions see this guide: https://learn.adafruit.com/building-circuitpython/


Debugging
---------

For debugging instructions see this guide: https://learn.adafruit.com/debugging-the-samd21-with-gdb


Port Specific modules
---------------------

.. toctree::
    ../../shared-bindings/samd/index