Благодаря возможностям библиотеки 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
Многофункциональный переходник CJMCU FT232H USB к JTAG UART FIFO SPI I2C можно приобрести здесь ftdi ft232rl
Логический анализатор 16 каналов можно приобрести здесь
Смотреть ВИДЕОУРОК (нажмите на картинку)
Ничего непонятно, но интересно! Спасибо!