Skip to content

Commit

Permalink
address SysTick erratum, which can hard-fault the chip
Browse files Browse the repository at this point in the history
  • Loading branch information
Alex Maestas committed Dec 18, 2023
1 parent 93d7f38 commit d10fa22
Showing 1 changed file with 8 additions and 1 deletion.
9 changes: 8 additions & 1 deletion watch-library/hardware/watch/watch_deepsleep.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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();
Expand Down

0 comments on commit d10fa22

Please sign in to comment.