]> git.earman.xyz Git - sensor-watch.git/commitdiff
address SysTick erratum, which can hard-fault the chip
authorAlex Maestas <git@se30.xyz>
Mon, 18 Dec 2023 01:29:28 +0000 (01:29 +0000)
committerAlex Maestas <git@se30.xyz>
Mon, 18 Dec 2023 01:29:28 +0000 (01:29 +0000)
watch-library/hardware/watch/watch_deepsleep.c

index ae2ad31d9d4f6619ee39fe6486199d33c3ca2853..2e7edd72eef89442c922707a4dc530e1e355b512 100644 (file)
@@ -22,6 +22,8 @@
  * SOFTWARE.
  */
 
+#include "hpl_systick_config.h"
+
 #include "watch_extint.h"
 
 // this warning only appears when you `make BOARD=OSO-SWAT-A1-02`. it's annoying,
@@ -158,14 +160,19 @@ void watch_enter_sleep_mode(void) {
     // disable brownout detector interrupt, which could inadvertently wake us up.
     SUPC->INTENCLR.bit.BOD33DET = 1;
 
+    // work around a silicon erratum by disabling the SysTick interrupt, which is
+    // enabled as part of driver init, before going to sleep.
+    SysTick->CTRL = SysTick->CTRL & ~(CONF_SYSTICK_TICKINT << SysTick_CTRL_TICKINT_Pos);
+
     // disable all pins
     _watch_disable_all_pins_except_rtc();
 
     // enter standby (4); we basically hang out here until an interrupt wakes us.
     sleep(4);
 
-    // and we awake! re-enable the brownout detector
+    // and we awake! re-enable the brownout detector and SysTick interrupt
     SUPC->INTENSET.bit.BOD33DET = 1;
+    SysTick->CTRL = SysTick->CTRL | (CONF_SYSTICK_TICKINT << SysTick_CTRL_TICKINT_Pos);
 
     // call app_setup so the app can re-enable everything we disabled.
     app_setup();