对外部中断只响应一次,直到任务执行完,并且在任务中存在延时。如何实现开启关闭中断和延时呢?
如下代码功能,中断后灯改变频率闪烁10次。之后回到初始频率的闪烁。
delay(ms)在中断中不可使用,存在定时器的冲突,可以用delayMicroseconds()来代替。Serial.println()也会受影响。
const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;
void setup() {
Serial.begin(115200);
Serial.println('Start:');
pinMode(ledPin, OUTPUT);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), blink, RISING);
}
void loop() {
digitalWrite(ledPin, HIGH); // sets the LED on
delay(1000); // waits for a second
digitalWrite(ledPin, LOW); // sets the LED off
delay(1000);
}
void blink() {
detachInterrupt(digitalPinToInterrupt(interruptPin));
Serial.println(">>>>");
//noInterrupts();
for(int counter = 1;counter <= 10;counter++) {
state = !state;
digitalWrite(ledPin, state);
for(int i=0;i<300;i++){
delayMicroseconds(1000);}
//Serial.println(counter);
}
//interrupts();
attachInterrupt(digitalPinToInterrupt(interruptPin), blink, RISING);
}
参考资料:
https://www.arduino.cc/en/Reference.digitalWrite
https://blog.csdn.net/qq_42860728/article/details/88097128
https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/