• Система автоматизации с открытым исходным кодом на базе 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 года и копируемый без изменений по сей день, со всеми ошибками, является полностью устаревшим чипом. Практически антиквариат.
 
Сверху Снизу