ESP32 Урок 13. Программные таймеры



Когда мы знакомились с семейством микроконтроллеров ESP32, то мы видели, что в данном контроллере существует несколько аппаратных таймеров.

Но порой бывают такие задачи, когда нет смысла задействовать аппаратный таймер, обрабатывать лишние прерывания. В таких случаях нам на помощь приходят программные таймеры. И начнём мы изучение таймеров именно с них ещё по той причине, что работа с ними несколько попроще.

В использовании программных таймеров есть свои ограничения, например такие:

  1. Период срабатывания таких таймеров обязательно должен быть кратен системному кванту времени. К примеру, если у нас системный квант 1 милисекунда, то мы не можем запустить таймер с периодом 1500 микросекунд. Либо 1000 либо 2000.
  2. Обратные вызовы таймера отправляются из задачи с низким приоритетом.

Давайте попробуем такие таймеры реализовать в нашем проекте.

Проект был сделан из проекта урока 7 с именем I2C_LCD2004 и получил имя SOFT_TIMER, так как нам пригодится дисплей для мониторинга работы таймеров.

Подключим сразу схему

 

 

Откроем наш проект в Espressif IDE и в функции app_main файла main.c удалим весь код, начинающийся после строки

 

LCD_ini();

 

до бесконечного цикла.

А в бесконечном цикле оставим только задержку

 

 

Также в данной функции удалим переменную для счётчика и массив

 

  uint16_t i=0;
  char str01[10];

И ещё удалим переменную для параметров очереди

 

qLCDData xLCDData;

 

В файле main.h подключим заголовочный файл для работы с программными таймерами

 

 

Мы создадим один таймер для периодического срабатывания, другой — для однократного.

Вернёмся в файл main.c и выше функции app_main добавим пока пустотелые функции обратного вызова для обоих таймеров

 

 

 

В функции app_main объявим переменную типа структуры для параметры первого таймера и сразу проинициализируем её

 

 

После сборки мы получим ошибку, так как такой указатель должен быть обязательно использован.

Объявим указатель-ссылку для первого таймера

 

 

Создадим наш первый таймер, указав в параметрах всё вышеобъявленное

 

 

Теперь проект соберётся без ошибок.

Мы пока проверим работу одного таймера, а уж потом возьмёмся за другой.

Запустим наш таймер, указав в параметре период срабатывания в микросекунднах

 

 

Перейдём в функцию обратного вызова данного таймера periodic_timer_callback и объявим там символьный массив, переменную для параметров очереди, проинициализируем в ней координаты вывода на дисплей и приравняем указатель на символьный массив

 

 

Затем с помощью специальной функции узнаем время с момента загрузки таймера и выводим его на экран дисплея с помощью очереди

 

 

Соберём код, прошьём контроллер.

 

 

Мы видим, что счётчик наш постоянно увеличивается, причём младшие пять разрядов не меняются, так как выводится время в микросекундах

 

  

 

 

 

В функции app_main создадим переменную типа структуры параметров для второго — однократного таймера

 

 

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

Создадим наш таймер

 

 

После запуска периодического таймера немного подождём и запустим наш второй таймер

 

 

В функции обратного вызова для однократного таймера oneshot_timer_callback мы объявим переменную для кода ошибки, а также символьный массив и переменную для параметров очереди, проинициализировав в ней также поля позиции вывода текста и указателя на символьный массив

 

 

Выведем на экран дисплея количество микросекунд, прошедших с момента запуска таймера

 

 

Из аргументов получим указатель на первый таймер и попытаемся его остановить

 

 

Затем запустим его, но уже с другим интервалом

 

 

Соберём код, прошьём контроллер и увидим, что через 10 секунд у нас на дисплее появится вторая строка с временем, прошедшим с момента запуска второго таймера, и после этого в верхней строке счётчик будет обновляться уже раз не в полсекунды, а раз в секунду (неизменными будут шесть младших разрядов)

 

 

 

 

Строка с временем второго таймера будет оставаться прежней постоянно, что доказывает нам то, что данный таймер срабатывает только один раз.

Итак, на данном уроке мы познакомились с программными таймерами контроллера ESP32.

 

Всем спасибо за внимание!

 

Данная статья в Дзен.

 

 

Предыдущий урок Программирование МК ESP32 Следующий урок

 

Исходный код

 

 

Недорогие отладочные платы ESP32 можно купить здесь: Недорогие отладочные платы ESP32

Логический анализатор 16 каналов можно приобрести здесь

Дисплей LCD 20×4 можно приобрести здесь Дисплей LCD 20×4

Дисплей LCD 16×2

Переходник I2C to LCD можно приобрести здесь I2C to LCD1602 2004

 

 

Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)

ESP32 Программные таймеры

 

Смотреть ВИДЕОУРОК в Дзен (нажмите на картинку)

ESP32 Программные таймеры

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

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

*