1 | #include "rest.h"
|
---|
2 |
|
---|
3 |
|
---|
4 |
|
---|
5 | void rest::begin(unsigned int mode, unsigned int inter_pin, voidFuncPtr callback)
|
---|
6 | {
|
---|
7 | if((mode == WAKE_EXT_INTERRUPT) && (inter_pin !=2) && (inter_pin!=0) && (inter_pin!=1))
|
---|
8 | {
|
---|
9 | NVMCTRL->CTRLB.bit.SLEEPPRM = 3;
|
---|
10 |
|
---|
11 | SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
|
---|
12 | pinMode(inter_pin,INPUT_PULLUP);
|
---|
13 |
|
---|
14 | attachInterrupt(inter_pin,callback,FALLING);
|
---|
15 | enable_eic_wake(inter_pin);
|
---|
16 | set_clk();
|
---|
17 |
|
---|
18 | }
|
---|
19 | else return;
|
---|
20 |
|
---|
21 |
|
---|
22 |
|
---|
23 |
|
---|
24 | }
|
---|
25 |
|
---|
26 |
|
---|
27 | void rest::begin(unsigned int mode)
|
---|
28 | {
|
---|
29 | if(mode == WAKE_RTC_ALARM)
|
---|
30 | {
|
---|
31 | //RTCInt.begin(TIME_H24);
|
---|
32 |
|
---|
33 | GCLK->CLKCTRL.bit.CLKEN = 0; //disable GCLK module
|
---|
34 | while (GCLK->STATUS.bit.SYNCBUSY);
|
---|
35 |
|
---|
36 | GCLK->GENCTRL.bit.RUNSTDBY = 1; //GCLK6 run standby
|
---|
37 | while (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY);
|
---|
38 |
|
---|
39 | GCLK->CLKCTRL.bit.CLKEN = 1; //disable GCLK module
|
---|
40 | while (GCLK->STATUS.bit.SYNCBUSY);
|
---|
41 |
|
---|
42 | NVMCTRL->CTRLB.bit.SLEEPPRM = 3;
|
---|
43 |
|
---|
44 | SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
|
---|
45 |
|
---|
46 | }
|
---|
47 | else return;
|
---|
48 |
|
---|
49 | }
|
---|
50 |
|
---|
51 |
|
---|
52 | void rest::standby(void)
|
---|
53 | {
|
---|
54 | __DSB();
|
---|
55 | __WFI();
|
---|
56 |
|
---|
57 | }
|
---|
58 |
|
---|
59 |
|
---|
60 | void rest::set_clk(void)
|
---|
61 | {
|
---|
62 | GCLK->CLKCTRL.bit.CLKEN = 0; //disable GCLK module
|
---|
63 | while (GCLK->STATUS.bit.SYNCBUSY);
|
---|
64 |
|
---|
65 | GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK6 | GCLK_CLKCTRL_ID( GCM_EIC )) ; //EIC clock switched on GCLK6
|
---|
66 | while (GCLK->STATUS.bit.SYNCBUSY);
|
---|
67 |
|
---|
68 | GCLK->GENCTRL.reg = (GCLK_GENCTRL_GENEN | GCLK_GENCTRL_SRC_OSCULP32K | GCLK_GENCTRL_ID(6)); //source for GCLK6 is OSCULP32K
|
---|
69 | while (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY);
|
---|
70 |
|
---|
71 | GCLK->GENCTRL.bit.RUNSTDBY = 1; //GCLK6 run standby
|
---|
72 | while (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY);
|
---|
73 |
|
---|
74 | }
|
---|
75 |
|
---|
76 |
|
---|
77 | void rest::enable_eic_wake(unsigned int inter_pin)
|
---|
78 | {
|
---|
79 | switch(inter_pin)
|
---|
80 | {
|
---|
81 | case 3:
|
---|
82 | EIC->WAKEUP.bit.WAKEUPEN9 = 1;
|
---|
83 | break;
|
---|
84 | case 4:
|
---|
85 | EIC->WAKEUP.bit.WAKEUPEN14 = 1;
|
---|
86 | break;
|
---|
87 | case 5:
|
---|
88 | EIC->WAKEUP.bit.WAKEUPEN15 = 1;
|
---|
89 | break;
|
---|
90 | case 6:
|
---|
91 | //EIC->WAKEUP.bit.WAKEUPEN20 = 1; //non si pu嘆 usare
|
---|
92 | break;
|
---|
93 | case 7:
|
---|
94 | //EIC->WAKEUP.bit.WAKEUPEN21 = 1; //non si pu嘆 usare
|
---|
95 | break;
|
---|
96 | case 8:
|
---|
97 | EIC->WAKEUP.bit.WAKEUPEN6 = 1;
|
---|
98 | break;
|
---|
99 | case 9:
|
---|
100 | EIC->WAKEUP.bit.WAKEUPEN7 = 1;
|
---|
101 | break;
|
---|
102 | case 10:
|
---|
103 | //EIC->WAKEUP.bit.WAKEUPEN18 = 1; //non si pu嘆 usare
|
---|
104 | break;
|
---|
105 | case 11:
|
---|
106 | //EIC->WAKEUP.bit.WAKEUPEN16 = 1; //non c'竪
|
---|
107 | break;
|
---|
108 | case 12:
|
---|
109 | //EIC->WAKEUP.bit.WAKEUPEN19 = 1; //non si pu嘆 usare
|
---|
110 | break;
|
---|
111 | case 13:
|
---|
112 | //EIC->WAKEUP.bit.WAKEUPEN17 = 1; //non c'竪
|
---|
113 | break;
|
---|
114 | default:
|
---|
115 | break;
|
---|
116 |
|
---|
117 | }
|
---|
118 |
|
---|
119 | }
|
---|