• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Работа с прерываниями на GPIO

SjiE

New member
Разбираюсь с прерываниями в esp8266. Софт visual studio +platformio + rtos-sdk

Создано два типа кода.

1.
Код:
    ConfigBtn.GPIO_IntrType = GPIO_PIN_INTR_NEGEDGE;
    ConfigBtn.GPIO_Mode = GPIO_Mode_Input;
    ConfigBtn.GPIO_Pin = BUTTON;
    ConfigBtn.GPIO_Pullup = GPIO_PullUp_EN;
    gpio_config(&ConfigBtn);
    GPIO_OUTPUT_SET(BUTTON,1);
    gpio_intr_handler_register(io_intr_handler, NULL);  // регистрация прерывания
    gpio_pin_intr_state_set(GPIO_ID_PIN(BUTTON),GPIO_PIN_INTR_NEGEDGE); // почему выше прописан уровень прерывания, но без этой строки они не происходят?
    _xt_isr_unmask(1 << ETS_GPIO_INUM);   // Разрешение прерываний GPIO
2.
Код:
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,FUNC_GPIO4);
    GPIO_AS_INPUT(GPIO_ID_PIN(BUTTON));
    GPIO_OUTPUT_SET(BUTTON,1);
    _xt_isr_mask(1 << ETS_GPIO_INUM);   // запрет прерываний GPIO
    gpio_intr_handler_register(io_intr_handler, NULL);  // регистрация прерывания
    gpio_pin_intr_state_set(GPIO_ID_PIN(BUTTON),GPIO_PIN_INTR_NEGEDGE);
    _xt_isr_unmask(1 << ETS_GPIO_INUM);   // Разрешение прерываний GPIO
Параллельно работает задача миганием светодиода но другой ножке.
При 1м типа кода в обработчик программа попадает не только при нажатии кнопки, которая вывод BUTTON садит на землю, но и при низком уровне на ножке питания светодиода. Почему? При 2м кода типе этого не происходит, здесь в прерывание попадает программа только по нажатию кнопки.

И здесь
Код:
gpio_config(&ConfigBtn);
в 1м коде
конфигурация вывода произведена по уровню сработки. Но её видимо не происходит,
пока не вставил код
Код:
gpio_pin_intr_state_set(GPIO_ID_PIN(BUTTON),GPIO_PIN_INTR_NEGEDGE);
.
Разве этот способ конфигурации не равен
Код:
ConfigBtn.GPIO_IntrType = GPIO_PIN_INTR_NEGEDGE;
?
 

pvvx

Активный участник сообщества
Это всё вопросы к разработчикам Espressif.
Разве этот способ конфигурации не равен
Код:
ConfigBtn.GPIO_IntrType = GPIO_PIN_INTR_NEGEDGE;
?
Смотрите исходники вызываемых функций.
И у ESP8266 есть разные проблемы в коде прерывания по пину. Прошло уже 10 лет и по памяти, что помню, там нужно отключать или переключать тип прерывания (типа GPIO_PIN_INTR_NEGEDGE) иначе происходит повторный вызов...
 

SjiE

New member
Смотрите исходники вызываемых функций.
Так вот хочется в них залезть, но не пойму как. Т.к. здесь нет режима отладки, в отличие от большинства микроконтроллеров. Где можно в дизассемблере посмотреть что на самом деле вытворяют команды из SDK.
 

pvvx

Активный участник сообщества
Так вот хочется в них залезть, но не пойму как. Т.к. здесь нет режима отладки, в отличие от большинства микроконтроллеров. Где можно в дизассемблере посмотреть что на самом деле вытворяют команды из SDK.
Многие используемые у вас функции находятся в ROM чипа.
Остальное, не включая закрытых либ, наверно тут -> https://github.com/espressif/ESP8266_RTOS_SDK/tree/release/v3.4

Не знаю, что произошло по поводу документации к ROM функциям у ESP8266, но более 10 лет назад накидывал примерный дизасм в C для нужных мне тогда функций.

К примеру void gpio_pin_intr_state_set(uint32 i, GPIO_INT_TYPE intr_state)
Прерывания по пину с максимальной производительностью тоже где-то лепил и не помню где валяется...
Предпочитаю забыть всё это, т.к. ESP8266 (он-же ESP8089) выпущенный ещё до 2012 года и копируемый без изменений по сей день, со всеми ошибками, является полностью устаревшим чипом. Практически антиквариат.
 
Сверху Снизу