Пишем программный код для настройки внешнего прерывания микроконтроллера ESP8266.

В данном уроке мы рассмотрим работу внешнего прерывания.

Функция которая отвечает за настройку прерывания:

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 имеет ограничение и помещать в нее огромный код надо с осторожностью.