0

我在一个 Teensy 3.1 (ARM) 项目中有一个按钮(和一个旋转编码器)。一切都很好,只是我无法让它入睡。重置后第一次一切正常,但此后每次,attachInterrupt() 似乎都不起作用。

将此用于睡眠模式调用。

伪代码:

#include LowPower_Teensy3.h
#include MyButton.h
TEENSY3_LP LP = TEENSY3_LP();
MyButton mySwitch(SWITCH_PIN); // pinMode(SWITCH_PIN, INPUT_PULLUP)

// interrupt handler
void wakeup(void)
{
  digitalWrite(LED, HIGH);
  detachInterrupt(SWITCH_PIN);
}

void setup(){
  // omitted for clarity
}

void loop() {
  switch(menuSelection) {
    // poll switch and encoder to determine menu selection

    // lots of other cases omitted. all work as expected

    case SLEEP_MENU:
      digitalWrite(LED, LOW);
      attachInterrupt(SWITCH_PIN, wakeup, FALLING);
      LP.Sleep();
      break;
  }
}

中断后似乎SWITCH_PIN不再关联。mySwitch

4

1 回答 1

1

在执行中断处理程序时分离中断处理程序可能是一个问题。请记住,一个名为您的库函数 wakeup() 并且在 wakeup() 中您修改了库正在操作的数据。更好的模式是让处理程序留下一条消息,然后主循环将进行清理。

int flagWakeupDone = 0;

void wakeup(void)  {
  ...
  flagWakeupDone = 1;
  return;
}


void loop() {

  if(1 == flagWakeupDone) {
    detachInterrupt(SWITCH_PIN);
    // possibly restablish pin as input with pull up
  }

  ... 

  switch(menuSelection) {

    case SLEEP_MENU:
      ...
      attachInterrupt(SWITCH_PIN, wakeup, FALLING);
      break;
  }

  return;
}
于 2014-08-17T04:08:08.300 回答