Функция прерываний не вызывается с ESP32 Arduino - PullRequest
0 голосов
/ 26 января 2020

Я использую плату разработчика ESP32 с Arduino и wi sh, чтобы использовать прерывание, чтобы определить, отправило ли ведущее устройство флаг выбора ведомого на ESP32.

Вот что я до сих пор пробовал

1)

#define SS 34

void enableSend() {
    Serial.println("SS Enabled");
}

void setup(){
  pinMode(SS, INPUT);
  attachInterrupt(digitalPinToInterrupt(SS), enableSend, RISING);
}

2)

#define SS 34

void IRAM_ATTR enableSend() {
    Serial.println("SS Enabled");
}

void setup(){
  pinMode(SS, INPUT);
  attachInterrupt(digitalPinToInterrupt(SS), enableSend, RISING);
}

Я использовал обе версии без digitalPinToInterrupt.

Что мне нужно сделать, чтобы прерывания работали? В настоящее время функция enableSend не вызывается, когда на выводе 34 установлено высокое значение.

Если это помогает, здесь - это распиновка для интерфейса разработчика ESP, которая у меня есть.

1 Ответ

2 голосов
/ 26 января 2020

Вам определенно нужен IRAM_ATTR (см. 2), чтобы поместить ISR (подпрограмму обработки прерываний) во внутреннюю память (IRAM) ESP32.

Я думаю, что Serial.println("SS Enabled");, который вы sh для выполнения в ISR слишком сложен для ISR.

ESP32 останавливает обычный поток выполнения для выполнения ISR, который должен быть выполнен за минимальное время, всего лишь несколькими инструкциями ЦП.

Отправка данных через последовательный порт занимает довольно много миллисекунд, что слишком много для ISR.

Вы можете использовать ISR для изменения переменной / флага, который вы оцениваете в обычном потоке выполнение, таким образом вы минимизируете риск запутать поток выполнения устройств ... вы можете отправить "SS Enabled" оттуда.

...