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