Arm 如何让Adafruit Feather M0睡眠;使用任何引脚在外部中断时唤醒?

Arm 如何让Adafruit Feather M0睡眠;使用任何引脚在外部中断时唤醒?,arm,interrupt,microprocessors,adafruit,samd21,Arm,Interrupt,Microprocessors,Adafruit,Samd21,我目前正在使用Adafruit Feather M0微处理器进行一个低功耗项目。我的项目的一个要求是能够休眠CPU,并使用从MPU6050加速计触发的外部中断再次唤醒它 我已经从GitHub测试了以下代码示例-它成功地工作了!我需要回答的问题是,如何修改此示例代码以处理feather的引脚13,而不是引脚6 #define interruptPin 6 volatile bool SLEEP_FLAG; void EIC_ISR(void) { SLEEP_FLAG ^= true; /

我目前正在使用Adafruit Feather M0微处理器进行一个低功耗项目。我的项目的一个要求是能够休眠CPU,并使用从MPU6050加速计触发的外部中断再次唤醒它

我已经从GitHub测试了以下代码示例-它成功地工作了!我需要回答的问题是,如何修改此示例代码以处理feather的引脚13,而不是引脚6

#define interruptPin 6
volatile bool SLEEP_FLAG;

void EIC_ISR(void) {
  SLEEP_FLAG ^= true;  // toggle SLEEP_FLAG by XORing it against true
  //Serial.print("EIC_ISR SLEEP_FLAG = ");
  //Serial.println(SLEEP_FLAG);
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  delay(3000); // wait for console opening

  attachInterrupt(digitalPinToInterrupt(interruptPin), EIC_ISR, CHANGE);  // Attach interrupt to pin 6 with an ISR and when the pin state CHANGEs

  SYSCTRL->XOSC32K.reg |=  (SYSCTRL_XOSC32K_RUNSTDBY | SYSCTRL_XOSC32K_ONDEMAND); // set external 32k oscillator to run when idle or sleep mode is chosen
  REG_GCLK_CLKCTRL  |= GCLK_CLKCTRL_ID(GCM_EIC) |  // generic clock multiplexer id for the external interrupt controller
                       GCLK_CLKCTRL_GEN_GCLK1 |  // generic clock 1 which is xosc32k
                       GCLK_CLKCTRL_CLKEN;       // enable it
  while (GCLK->STATUS.bit.SYNCBUSY);              // write protected, wait for sync

  EIC->WAKEUP.reg |= EIC_WAKEUP_WAKEUPEN4;      // Set External Interrupt Controller to use channel 4 (pin 6)


  PM->SLEEP.reg |= PM_SLEEP_IDLE_CPU;  // Enable Idle0 mode - sleep CPU clock only
  //PM->SLEEP.reg |= PM_SLEEP_IDLE_AHB; // Idle1 - sleep CPU and AHB clocks
  //PM->SLEEP.reg |= PM_SLEEP_IDLE_APB; // Idle2 - sleep CPU, AHB, and APB clocks

  // It is either Idle mode or Standby mode, not both. 
  SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;   // Enable Standby or "deep sleep" mode

  SLEEP_FLAG = false; // begin awake

  // Built-in LED set to output and high
  PORT->Group[g_APinDescription[LED_BUILTIN].ulPort].DIRSET.reg = (uint32_t)(1<<g_APinDescription[LED_BUILTIN].ulPin);  // set pin direction to output
  PORT->Group[g_APinDescription[LED_BUILTIN].ulPort].OUTSET.reg = (uint32_t)(1<<g_APinDescription[LED_BUILTIN].ulPin); // set pin mode to high

  Serial.println("Setup() Run!");
}

void loop() {
  // put your main code here, to run repeatedly:

  if (SLEEP_FLAG == true) {
    PORT->Group[g_APinDescription[LED_BUILTIN].ulPort].OUTCLR.reg = (uint32_t)(1<<g_APinDescription[LED_BUILTIN].ulPin); // set pin mode to low
    Serial.println("I'm going to sleep now.");
    __WFI();  // wake from interrupt
    SLEEP_FLAG = false;
    Serial.println("Ok, I'm awake");
    Serial.println();
  }
  //Serial.print("SLEEP_FLAG = ");
  //Serial.println(SLEEP_FLAG);
  PORT->Group[g_APinDescription[LED_BUILTIN].ulPort].OUTTGL.reg = (uint32_t)(1<<g_APinDescription[LED_BUILTIN].ulPin);  // toggle output of built-in LED pin
  delay(1000);

}
我怀疑通道1(WAKEUPEN1)是由于插脚图上插脚13旁边的ENIT ^1。但这不起作用,代码pin操作没有表现出与pin 6设置相同的行为


我将非常感谢任何关于如何在Pin 13上实现此代码的建议。非常感谢您的支持。

我不是这里的权威,您的代码在我看来是正确的


除此之外,引脚输出显示引脚13是内置LED线,您可以在代码中的多个位置操作内置LED。这几乎肯定与您尝试使用13作为中断线相冲突。

我不是这里的权威,您的代码在我看来是正确的

除此之外,引脚输出显示引脚13是内置LED线,您可以在代码中的多个位置操作内置LED。这几乎肯定与您尝试使用13作为中断线相冲突。

GitHub项目源:GitHub项目源:
#define interruptPin 13
EIC->WAKEUP.reg |= EIC_WAKEUP_WAKEUPEN1;      // Set External Interrupt Controller to use channel 4 (pin 6)