Использование прерываний в модуле ESP32


Прерывания используются для обработки событий, которые не происходят во время "нормального" функционирования программы, эти события происходят при срабатывании каких-нибудь триггеров. К примеру, в программе мигания светодиодом микроконтроллер исполняет команды последовательно, одну за другой. Но если мы хотим проконтролировать состояние светодиода в произвольный момент времени, это можно сделать только после того как все операции перед командой проверки будут выполнены, то есть это уже будет не в "реальном времени". Для решения подобных проблем и приходят на помощь прерывания. При использовании прерываний у нас нет необходимости непрерывно проверять состояние цифрового контакта микроконтроллера. При срабатывании прерывания микроконтроллер останавливает выполнение основной программы и вызывается функция/процедура обработки прерывания (Interrupt Service Routine, ISR). После выполнения всех команд внутри этой функции микроконтроллер возвращается к выполнению основной программы.

Использование прерываний в модуле ESP32: руководство для начинающих

Модуль ESP32 имеет 32 прерывания на каждое ядро. Каждое прерывание имеет определенный уровень приоритета, большинство (но не все) прерывания подключены к мультиплексору прерываний. В связи с тем, что источников прерываний больше чем самих прерываний, некоторые прерывания делят общие источники прерываний.

Ранее на нашем сайте мы уже рассматривали практическое использование прерываний в модуле ESP32 в статье про использование спящих режимов в нем, в этой же статье мы рассмотрим общие принципы использования прерываний в данном модуле.

Типы прерываний в модуле ESP32

Основная классификация прерываний в модуле ESP32 разделяет их по источникам прерываний. Таким образом, можно выделить аппаратные и программные прерывания.

Внешние или аппаратные прерывания

Внешние прерывания срабатывают как отклик на какое внешнее аппаратное событие. Например, существует прерывание прикосновения (Touch Interrupt), которое срабатывает при обнаружении прикосновения. Также в эту категорию попадают и прерывания, срабатывающие при изменении состояния контактов ввода/вывода (GPIO) микроконтроллера.

Программные прерывания

Эти прерывания формируются при работе программы. Их типовым примером являются прерывания от таймеров. Более подробно эти прерывания рассмотрены в статье про таймеры в модуле ESP32.

Часто задаваемые вопросы про прерывания в модуле ESP32

Сколько прерываний может обрабатывать модуль ESP32?
Модуль ESP32 может обрабатывать до 32 прерываний на каждое ядро.

Как использовать внешние прерывания в модуле ESP32?
Для этого вам необходимо прикрепить (attach) один из доступных цифровых контактов к этому прерыванию и назначить для этого прерывания функцию его обработки (ISR) с помощью функции attachInterrupt.

Какие контакты модуля ESP32 поддерживают обработку внешних прерываний?
Это могут делать все контакты модуля ESP32, а 10 из этих контактов поддерживают обработку прерываний прикосновения (touch interrupt) – их называют сенсорными входами.

Какие режимы прерываний поддерживает модуль ESP32?
Модуль ESP32 поддерживает 5 типов следующих прерываний: LOW, HIGH, CHANGE, FALLING и RISING.

Аппаратные прерывания в модуле ESP32

Все контакты ввода/вывода (GPIO pins) модуля ESP32 мы можем использовать в качестве источников внешних прерываний. Для этого нужно прикрепить контакт в обработке прерывания и назначить ему функцию обработки прерывания. Сделать это можно с помощью функции attachInterrupt(), которая имеет следующий формат:

Функция attachInterrupt() имеет три аргумента:

GPIOpin – это номер контакта, к которому мы прикрепляем прерывание.
ISR – это имя функции, которая будет вызываться при срабатывании прерывания.
Event – событие, в результате которого прерывание наступает (срабатывает).
В модуле ESP32 возможно пять типов таких событий:

- LOW: прерывание срабатывает когда контакт находится в состоянии LOW;

Пример прерывания, срабатывающего по уровню LOW

- HIGH: прерывание срабатывает когда контакт находится в состоянии HIGH;

Пример прерывания, срабатывающего по уровню HIGH

- CHANGE: прерывание срабатывает когда состояние контакта изменяется, с HIGH на LOW или с LOW на HIGH;

Пример прерывания, срабатывающего при измении состояния контакта

- FALLING: прерывание срабатывает когда состояние контакта изменяется с HIGH на LOW;

Пример прерывания, срабатывающего при измении состояния контакта с HIGH на LOW

- RISING: прерывание срабатывает когда состояние контакта изменяется с LOW на HIGH.

Пример прерывания, срабатывающего при измении состояния контакта с LOW на HIGH

К примеру, чтобы использовать прерывание, которое будет срабатывать при изменении состояния 4-го контакта (GPIO4), мы можем использовать команду вида:

Как отключить прерывание

В некоторых случаях бывает необходимо временно отключить обработку прерываний. Для этого можно использовать функцию detachInterrupt. Аргументом данной функции является номер контакта, на котором нужно отключить обработку прерывания. Функция detachInterrupt отключает обработку прерывания на указанном контакте до тех пор пока на нем не будет снова вызвана функция attachInterrupt, либо система перезагрузится. Синтаксис этой функции следующий:

Функция (процедура) обработки прерывания (ISR)

Эта функция будет вызываться при срабатывании определенного прерывания. Ее синтаксис выглядит следующим образом:

Здесь ISR() – имя функции, а statements – это операции, которые выполняются при вызове данной функции. Поскольку функция (процедура) обработки прерывания блокирует выполнение основной программы рекомендуется чтобы ее тело было как можно более коротким, то есть чтобы функция выполнялась максимально быстро. Параметр IRAM_ATTR перед именем функции (ISR) гарантирует что она будет помещена в память IRAM, а не во флэш-память модуля ESP32. Благодаря этому повысится скорость загрузки данной функции.

Пример работы с аппаратным прерыванием – включение/выключение светодиода

В данном примере мы будем включать и выключать светодиод при нажатии кнопки. Для этого мы будем использовать обработку прерывания на контакте, к которому подключена кнопка. Для этого соберите схему проекта, показанную на следующем рисунке.

Схема проекта для демонстрации возможностей прерываний в модуле ESP32Внешний вид собранной на макетной плате конструкции проекта показан на следующем рисунке.

Внешний вид собранной на макетной плате конструкции проекта

Код программы для данного примера обработки прерывания будет следующим:

При нажатии кнопки в схеме нашего проекта уровень напряжения на контакте GPIO33 модуля ESP32 будет падать до 0V. При отпускании кнопки уровень напряжения на нем будет снова возрастать до VCC. При повышении уровня напряжения (rising) будет срабатывать прерывание на контакте GPIO33, в результате чего будет вызываться функция обработки прерывания toggleLED(). Поскольку данная функция будет вызываться у нас только при повышении уровня напряжения на контакте, то проблемы дребезга контактов кнопки не возникает.

Прерывания прикосновения в ESP32

Аналогично обычным прерываниям на контактах ввода/вывода (GPIO) модуль ESP32 может обрабатывать прерывания прикосновения (touch Interrupt) на своих 10 сенсорных входах (touch inputs). Для их использования также необходимо применять функцию touchAttachInterrupt, ее синтаксис в данном случае выглядит следующим образом:

Здесь GPIOPin – это номер контакта, который поддерживает обработку прерываний прикосновения, ISR – имя функции для обработки прерывания, Threshold – значение прикосновения (touch value), при котором прерывание будет срабатывать. Во всем остальном работа с данными прерываниями аналогична работе с обычными аппаратными прерываниями в модуле ESP32.

Необходимые файлы для рассмотренного проекта можно скачать по следующей ссылке.

Источник статьи

(Проголосуй первым!)
Загрузка...
6 132 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *