summaryrefslogtreecommitdiffstats
path: root/watch-library/hardware/watch/watch_deepsleep.c
diff options
context:
space:
mode:
Diffstat (limited to 'watch-library/hardware/watch/watch_deepsleep.c')
-rw-r--r--watch-library/hardware/watch/watch_deepsleep.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/watch-library/hardware/watch/watch_deepsleep.c b/watch-library/hardware/watch/watch_deepsleep.c
index ae2ad31d..efdad6dd 100644
--- a/watch-library/hardware/watch/watch_deepsleep.c
+++ b/watch-library/hardware/watch/watch_deepsleep.c
@@ -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,20 @@ void watch_enter_sleep_mode(void) {
// disable brownout detector interrupt, which could inadvertently wake us up.
SUPC->INTENCLR.bit.BOD33DET = 1;
+ // per Microchip datasheet clarification DS80000782,
+ // work around silicon erratum 1.8.4 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();