[136] | 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 | }
|
---|