Bonjour !
J'espére que vous allez pouvoir m'aider.
J'ai un petit problème avec la librairie ArduinoLowPower
Je dois faire appel à la fonction LowPower.attachInterruptWakeup() mais il n'y a aucune méthode permettant de libérer l'interruption sans faire de reboot de l'Arduino.
Voici le code de la méthode attachInterruptWakeup:
void ArduinoLowPowerClass::attachInterruptWakeup(uint32_t pin, voidFuncPtr callback, uint32_t mode) {
if (pin > PINS_COUNT) {
// check for external wakeup sources
// RTC library should call this API to enable the alarm subsystem
switch (pin) {
case RTC_ALARM_WAKEUP:
rtc.begin(false);
rtc.attachInterrupt(callback);
/case UART_WAKEUP:/
}
return;
}EExt_Interrupts in = g_APinDescription[pin].ulExtInt;
if (in == NOT_AN_INTERRUPT || in == EXTERNAL_INT_NMI)
return;//pinMode(pin, INPUT_PULLUP);
attachInterrupt(pin, callback, mode);// enable EIC clock
GCLK->CLKCTRL.bit.CLKEN = 0; //disable GCLK module
while (GCLK->STATUS.bit.SYNCBUSY);GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK6 | GCLK_CLKCTRL_ID( GCM_EIC )) ; //EIC clock switched on GCLK6
while (GCLK->STATUS.bit.SYNCBUSY);GCLK->GENCTRL.reg = (GCLK_GENCTRL_GENEN | GCLK_GENCTRL_SRC_OSCULP32K | GCLK_GENCTRL_ID(6)); //source for GCLK6 is OSCULP32K
while (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY);GCLK->GENCTRL.bit.RUNSTDBY = 1; //GCLK6 run standby
while (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY);// Enable wakeup capability on pin in case being used during sleep
EIC->WAKEUP.reg |= (1 << in);/* Errata: Make sure that the Flash does not power all the way down
- when in sleep mode. */
NVMCTRL->CTRLB.bit.SLEEPPRM = NVMCTRL_CTRLB_SLEEPPRM_DISABLED_Val;
}
Je voudrais faire l'inverse mais je ne comprend pas tout :s.
Voici mon code pour la nouvelle méthode detachInterruptWakeup:
void ArduinoLowPowerClass::detachInterruptWakeup(uint32_t pin) {
EExt_Interrupts in = g_APinDescription[pin].ulExtInt;
if (in == NOT_AN_INTERRUPT || in == EXTERNAL_INT_NMI)
return;//pinMode(pin, INPUT_PULLUP);
detachInterrupt(pin);// disable EIC clock
GCLK->CLKCTRL.bit.CLKEN = 1; //enable GCLK module
while (GCLK->STATUS.bit.SYNCBUSY);GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK6 | GCLK_CLKCTRL_ID( GCM_EIC )) ; //EIC clock switched on GCLK6
while (GCLK->STATUS.bit.SYNCBUSY);GCLK->GENCTRL.reg = (GCLK_GENCTRL_GENEN | GCLK_GENCTRL_SRC_OSCULP32K | GCLK_GENCTRL_ID(6)); //source for GCLK6 is OSCULP32K
while (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY);GCLK->GENCTRL.bit.RUNSTDBY = 0; //GCLK6 run standby
while (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY);// Disable wakeup capability on pin in case being used during sleep
EIC->WAKEUP.reg |= (0 << in);NVMCTRL->CTRLB.bit.SLEEPPRM = NVMCTRL_CTRLB_SLEEPPRM_WAKEUPINSTANT_Val;
}
Merci d'avance pour votre aide