Когда мы знакомились с семейством микроконтроллеров ESP32, то мы видели, что в данном контроллере существует несколько аппаратных таймеров.
Но порой бывают такие задачи, когда нет смысла задействовать аппаратный таймер, обрабатывать лишние прерывания. В таких случаях нам на помощь приходят программные таймеры. И начнём мы изучение таймеров именно с них ещё по той причине, что работа с ними несколько попроще.
В использовании программных таймеров есть свои ограничения, например такие:
- Период срабатывания таких таймеров обязательно должен быть кратен системному кванту времени. К примеру, если у нас системный квант 1 милисекунда, то мы не можем запустить таймер с периодом 1500 микросекунд. Либо 1000 либо 2000.
- Обратные вызовы таймера отправляются из задачи с низким приоритетом.
Давайте попробуем такие таймеры реализовать в нашем проекте.
Проект был сделан из проекта урока 6 с именем 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 можно купить здесь
Логический анализатор 16 каналов можно приобрести здесь
Дисплей LCD 20x4 можно приобрести тут
Дисплей LCD 16x2 можно приобрести тут
Переходник I2C to LCD1602 2004 можно приобрести здесь
Видео в RuTube
Видео в Дзен
Видео в Youtube