Благодаря возможностям библиотеки SDK, поставляемой для ESP8266, мы можем использовать программные таймеры. Причём использовать их не сложно, и мы в этом на данном уроке убедимся.
Схема у нас будет простейшая — отладочная плата, подключенная к USB компьютера
А проект мы создадим из проекта урока 7 с именем UART_TX и назовём его OS_TIMER.
Откроем наш проект в Eclipse и в файле main.c удалим полностью бесконечный цикл (а не только его тело), он нам будет не нужен, так как таймер у нас будет работать в циклическом режиме.
Объявление вот этой локальной переменной также удалим, также удалим и инициализацию UART, он нам сегодня не потребуется
uint16_t i=0;
// Configure the UART
uart_init(BIT_RATE_115200, BIT_RATE_115200);
Удалим также и подключение заголовочного файла
#include «driver/uart.h»
Объявим глобальную переменную структуры таймера
1 2 3 4 |
#define LED 2 //------------------------------------------------------ static os_timer_t os_timer01; //------------------------------------------------------ |
В функции user_init() сначала отключаем наш таймер, таков порядок
1 2 |
gpio_output_set(0, 0, (1 << LED), 0); os_timer_disarm(&os_timer01); |
Добавим функцию обратного вызова для нашего таймера
1 2 3 4 5 6 7 |
static ETSTimer os_timer01; //------------------------------------------------------ static void ICACHE_FLASH_ATTR timer_func_user(void *arg) { } //------------------------------------------------------ |
Также добавим глобальную переменную для состояния нашего светодиода
1 2 |
static os_timer_t os_timer01; static uint8_t led_state=0; |
Давайте в функции обработчике применим тернарный оператор для переключения состояния светодиода
1 2 3 |
static void ICACHE_FLASH_ATTR timer_func_user(void *arg) { led_state = (led_state==0) ? 1 : 0; |
Установим вывод ножки порта, к которой подключен светодиод, в нужное состояние
1 2 |
led_state = (led_state==0) ? 1 : 0; GPIO_OUTPUT_SET(LED, led_state); |
В функции user_init() с помощью нужной функции произведём инициализацию нашего таймера, передав ей в параметрах указатель на переменную структуры и на функцию обратного вызова, которой мы никакие параметры не передаём, поэтому в качестве третьего аргумента используем NULL
1 2 |
os_timer_disarm(&os_timer01); os_timer_setfn(&os_timer01, (os_timer_func_t *)timer_func_user, NULL); |
И осталось нам лишь запустить таймер, передав ему в качестве параметра величину периода между срабатываниями в милисекундах
1 2 |
os_timer_setfn(&os_timer01, (os_timer_func_t *)timer_func_user, NULL); os_timer_arm(&os_timer01, 500, 1); |
В качестве третьего параметра мы говорим таймеру, что срабатывание его будет не однократным, а периодическим, если бы нужно было, чтобы таймер сработал только один раз, мы бы передали 0.
Соберём код, прошьём контроллер и увидим, что наш светодиод будет мигать раз в секунду (зажигаться и потухать)
Итак, сегодня мы познакомились с использованием программного таймера, что нам в дальнейшем обязательно пригодится.
Всем спасибо за внимание!
Предыдущий урок Программирование МК ESP8266 Следующий урок
Модуль ESP NodeMCU можно купить здесь: Модуль ESP NodeMCU
Различные модули ЕSP8266 можно приобрести здесь Модули ЕSP8266
Переходник USB to TTL можно приобрести здесь ftdi ft232rl
Многофункциональный переходник JTAG UART FIFO SPI I2C можно приобрести здесь CJMCU FT232H USB к JTAG UART FIFO SPI I2C
Логический анализатор 16 каналов можно приобрести здесь
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Ничего непонятно, но интересно! Спасибо!