Таймер - больше похож на секундомер, который используются для измерения и управления временными событиями, обеспечивая точную временную задержку. Большинство микроконтроллеров имеют встроенные таймеры, которые используются не только для генерации временных задержек, но и в качестве счетчика.
Чип 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 и почувствовать разницу....
Пример кода доступен по этой ссылке, качаем и мигаем на здоровье.
Оглавление канала доступно тут:
Всем удачи!