19,3K подписчиков

ESP32 Прерывания по таймеру

1,3K прочитали

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

Чип ESP32 содержит две группы аппаратных таймеров.

  • Timer_0 64Bit
  • Timer_1 64Bit
  • Timer_2 64Bit
  • Timer_3 64Bit

Каждая группа имеет два аппаратных таймера общего назначения. Все они являются 64-битными универсальными таймерами, основанными на 16-битных предварительных делителях и 64-битных счетчиках увеличения/уменьшения, которые могут перезагружаться автоматически.

Прерывания по таймеру — это эффективный способ гарантировать, что синхронизированные события происходят с точностью до миллисекунды.

Прерывания таймера — это программные прерывания, генерируемые таймером. Прерывания по таймеру позволяют выполнять задачу через определенные промежутки времени независимо от того, что еще происходит в коде. Они аналогичны внешним прерываниям, но запускаются не внешним событием, а таймером. После запуска они прервут поток выполнения после завершения текущей инструкции, вызовут ISR и вернутся к следующей инструкции с того места, где она была остановлена, когда она завершилась, точно так же, как аппаратное или внешнее прерывание.

Рисунок, демонстрирующий концепцию таймера.
Рисунок, демонстрирующий концепцию таймера.

Скорость таймера можно определить по следующей формуле:

timer speed (Hz) = Timer clock speed (Mhz) / prescaler

Например, скорость таймера в ESP32, работающем на тактовой частоте 80 МГц, будет равна 80 МГц или 8 000 000 МГц для установленного значения предварительного делителя 1. Соответственно для значения предварительного делителя 80 - будет составлять 1 МГц или 1 000 000 Гц.

Предварительный делитель - это то, на что вышеприведенная частота делится, чтобы сформировать «тик» таймера (увеличить его счетчик). Затем ISR настраивается на запуск после определенного количества тиков.

Поток процесса с прерыванием по таймеру
Поток процесса с прерыванием по таймеру

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

Пользоваться таймером из среды Arduino IDE ну... очень просто! Попереключаем встроенный светодиодом (на PIN2) 1 раз в секунду.

Код настройки таймера.
Код настройки таймера.

Весь код настройки таймера в ESP32 занимает 4 строки - кто там в комментариях писал про не дружелюбность платформы к пользователю? Если интересно, можете посмотреть для сравнения, как подобное можно реализовать для Arduino и почувствовать разницу....

Пример кода доступен по этой ссылке, качаем и мигаем на здоровье.

Оглавление канала доступно тут:

Всем удачи!