Atmega328P 使用边沿触发中断从掉电模式唤醒

问题描述

Atmega328P 数据表的快照:

enter image description here

根据 Atmega328P 数据表的上述部分,只有电平或引脚更改中断才能从掉电睡眠模式唤醒 cpu

但是,在以下代码中,使用上升沿将 cpu 从掉电模式唤醒。

#include <LowPower.h>

const byte led_pin = 8;
const byte interrupt_pin = 2;
volatile byte state = LOW;

void setup() {
  Serial.begin(9600);
  pinMode(led_pin,OUTPUT);
}

void loop() {
  // the interrupt must be attached each loop
  attachInterrupt(digitalPinToInterrupt(interrupt_pin),interrupt_routine,RISING);
  LowPower.powerDown(SLEEP_FOREVER,ADC_OFF,BOD_OFF);     // sleep until interrupt
  detachInterrupt(digitalPinToInterrupt(interrupt_pin)); // remove interrupt

  // the usual wake routine that turns on the LED
  if (state == HIGH) {
    digitalWrite(led_pin,HIGH);
    delay(500);
  }

  if (state == HIGH){
    state = LOW;
    digitalWrite(led_pin,LOW);
  }
}

void interrupt_routine() {
  state = HIGH;
}

代码取自“Arduino Interrupts with PIR Motion Sensor”。

我不明白这段代码是如何工作的?

解决方法

Atmel 的数据表让人相信你只能在 MCU 处于睡眠模式时使用 LOW 中断来唤醒它。然而,长期以来确认您可以使用任何类型的中断(上升沿/下降沿/低电平/任何逻辑变化)将 Atmega328p 从睡眠模式唤醒。 Atmel 的数据表上有一个错误。 Nick Gammon 在 Interrupts 上的帖子中证实并记录了这一点。