Appiko
hal_wdt.c
1 
19 #include "nrf.h"
20 #include "stddef.h"
21 #include "hal_wdt.h"
22 #include "nrf_util.h"
23 #include "common_util.h"
24 
25 #if ISR_MANAGER == 1
26 #include "isr_manager.h"
27 #endif
28 
30 #define WDT_RR_VALUE 0x6E524635UL
31 
32 void (*wdt_irq_handler)(void);
33 
34 void hal_wdt_init(uint32_t period_ms, void (*wdt_timeout_handler)(void))
35 {
36  //In case the WDT is already running
37  if (NRF_WDT->RUNSTATUS == WDT_RUNSTATUS_RUNSTATUS_Running)
38  {
39  hal_wdt_feed();
40  }
41  else
42  {
43  //Run when sleeping, pause when debugging
44  NRF_WDT->CONFIG = (WDT_CONFIG_SLEEP_Run << WDT_CONFIG_SLEEP_Pos)
45  | (WDT_CONFIG_HALT_Pause << WDT_CONFIG_HALT_Pos);
46 
47  NRF_WDT->CRV = LFCLK_TICKS_MS(period_ms);
48 
49  //Enable only RR1 and RR7. Two registers so it won't be randomly fed.
50  NRF_WDT->RREN = (WDT_RREN_RR1_Enabled << WDT_RREN_RR1_Pos)
51  | (WDT_RREN_RR7_Enabled << WDT_RREN_RR7_Pos);
52 
53  wdt_irq_handler = wdt_timeout_handler;
54 
55  NRF_WDT->INTENSET = WDT_INTENSET_TIMEOUT_Enabled;
56 
57  //APP_IRQ_PRIORITY_HIGH define works with or without SD in all nRF5x
58  NVIC_ClearPendingIRQ(WDT_IRQn);
59  NVIC_SetPriority(WDT_IRQn, APP_IRQ_PRIORITY_HIGH);
60  NVIC_EnableIRQ(WDT_IRQn);
61  }
62 }
63 
64 void hal_wdt_feed(void)
65 {
66  //Reload the two registers enabled.
67  NRF_WDT->RR[1] = WDT_RR_VALUE;
68  NRF_WDT->RR[7] = WDT_RR_VALUE;
69 }
70 
71 void hal_wdt_start(void)
72 {
73  NRF_WDT->TASKS_START = 1;
74 }
75 
76 #if ISR_MANAGER == 1
77 void hal_wdt_Handler ()
78 #else
79 void WDT_IRQHandler(void)
80 #endif
81 {
82 #if ISR_MANAGER == 0
83  NRF_WDT->EVENTS_TIMEOUT = 0;
84 #endif
85  if (wdt_irq_handler != NULL)
86  {
87  wdt_irq_handler();
88  }
89 }
void hal_wdt_start(void)
Definition: hal_wdt.c:71
#define LFCLK_TICKS_MS(ms)
Definition: nrf_util.h:87
void hal_wdt_feed(void)
Definition: hal_wdt.c:64
void hal_wdt_init(uint32_t period_ms, void(*wdt_timeout_handler)(void))
Definition: hal_wdt.c:34