В данном уроке мы рассмотрим работу внешнего прерывания.
Функция которая отвечает за настройку прерывания:
attachInterrupt(digitalPinToInterrupt(GPIO), ISR, mode);
В данной функции:
digitalPinToInterrupt(GPIO) - выбираем номер ножки, которая будет работать на прерывание. В модуле который я использую можно настроить любые ножки на прерывание, кроме 16.
ISR — имя функции, которая будет вызываться, при наступлении прерывания.причем функция должна иметь ICACHE_RAM_ATTR перед описанием функции для запуска кода прерывания в оперативной памяти.
mode — режим работы:
CHANGE: прерывание запускается каждый раз, когда вывод меняет значение(с высокого на низкий и с низкого на высокий).
FALLING: при переходе с высокого уровня в низкий.
RISING: при переходе с низкого уровня в высокий.
Для проверки работы прерывания, на ножку D2 мы будем подавать сигнал, а на ножку D3 подключим светодиод, который будет сигнализировать о факте срабатывания прерывания.
Так же в мониторинге можно будет наблюдать факт отрабатывания прерывания по надписям: on и off.
Программный код:
#define interruptPin D2
#define GPIO0 D3
volatile uint8_t k=0;
volatile uint8_t n=0;
void ICACHE_RAM_ATTR test(){
if (n==1){
k=1;
Serial.println("on");
n=0;
}
else {
n=1;
k=0;
Serial.println("off");
}
}
void setup() {
Serial.begin(115200);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin),test, FALLING);
pinMode(GPIO0, OUTPUT);
digitalWrite(GPIO0, LOW);
}
void loop() {
if (k==1){digitalWrite(GPIO0,HIGH);}
else digitalWrite(GPIO0, LOW);
}
В данном программном коде есть небольшой макрос: ICACHE_RAM_ATTR — который указывает, где будет храниться вызываемая функция. В данном случаи она будет храниться в RAM. Так как флэш используется для хранения данных и программы и доступ к этим данным происходит в течении 1 потока, вызов второго потока (при срабатывании прерывания) может привести к краху работы микроконтроллера. Таким образом при вызове функции прерывания, даже если будет идти запись/чтение с flash памяти ошибки не будет. Единственно надо понимать, что RAM имеет ограничение и помещать в нее огромный код надо с осторожностью.