ESP8266 Espressif получили обновление. Некоторые из них могут даже назвать его спорным. Все началось с ESP8266, Wi-Fi модуля с базовым интерфейсом UART. Но позже выяснилось, что он достаточно мощный для встраиваемых систем. Это модуль, который может быть использован для запуска полноценных приложений.
Espressif понял это и выпустил SDK. В первых версиях было много ошибок, но с тех пор стало значительно лучше. Другой SDK был выпущен и его предложили Freertos для портирования на ESP. Здесь я хочу поговорить о версии без ОС. Конечно, есть сторонние прошивки, которые предлагают поддержку языка сценариев для упрощения разработки (только Google), но по-прежнему ESP8266 является микрочипом (акцент на MICRO) и язык сценариев может быть излишним. Так что мы собираемся вернуться к ESP SDK и C. Вы будете удивлены тем, что это проще, чем кажется!
Первые шаги
Для разработки встроенного программного обеспечения вам нужно:
- подключить ESP8266 к компьютеру через порт USB .
Есть много статей , как подключить ESP к компьютеру. Вам понадобится несколько кабелей Дюпона и адаптер UART-к-USB. Если у вас есть плата Arduino вы можете использовать ее в качестве UART-к-USB. В Google по запросу “подключить esp8266 к компьютеру” – есть много статей.
- SDK . Я предлагаю использовать этот: https://github.com/pfalcon/esp-open-sdk
Загрузите его и установите по инструкции. Нет ничего необычного в этом процессе, все, что вам нужно, это установить и нажать “сделать”.
В общем, этот SDK предназначен для систем * Nix, но есть порт для Windows.
Короче говоря, чтобы начать разработку вы должны иметь устройство ESP, / DEV / ttyUSB0 (/ DEV / ttyACM0, если вы используете Arduino или COMn в операционной системе Windows) и SDK, установленный в определенной папке.
Main()
В C int main()является точкой входа в программу. Но, в случае ESP точка входа void user_init(). Эта функция должна использоваться только для инициализации, а не для длительной логики.
1 2 3 4 5 6 7 |
void sdk_init_done_cb(void) { /* You app Initialization here */ } void user_init() { system_init_done_cb(sdk_init_done_cb); } |
Обратите внимание, что все , что мы делаем в user_init называет system_init_done_cb функции API. Эта функция принимает один параметр, который является указателем на функцию , которая будет вызываться , как только все системные модули будут правильно инициализированы. Вы можете поместить свой код инициализации в user_init, но вы можете столкнуться с проблемами с некоторыми функциями системы (например , Wi – Fi), только потому ,что соответствующие модули еще не инициализированы. Таким образом, лучше использовать system_init_done_cb и выполнить инициализацию в функции обратного вызова.
Осторожно, злая собака
ESP8266 имеет функциональность сторожевого пса. и не обладает недокументированным API , чтобы контролировать его (есть некоторые недокументированные вещи, но это выходит за рамки данного урока). Его таймаут составляет 1 секунду.
Что это значит? Это означает, что вы должны вернуть поток управления к системе каждую секунду, в противном случае устройство будет перезагружено. Этот код приводит к перезагрузке устройства:
1 2 3 |
void sdk_init_done_cb(void) { while(1); /* or any long operation */ } |
В общем, таймер это не плохо, он помогает, если программа зависает. И, 1 секунда не так мало. Просто имейте это в виду.
Что он делает
Принимая то, что мы узнали мы сталкиваемся с очевидный вопросом: где я могу запустить свои задачи?
Самый простой ответ таймеры. API таймер очень прост в ESP.
1 2 3 4 5 6 7 8 9 10 11 |
os_timer_t start_timer; /* declare a variable which will be used to control the timer */ void start_timer_cb(void *arg) { /* callback function for timer */ /* Our code here, remember about watchdog */ } void sdk_init_done_cb(void) { os_timer_disarm(&start_timer); os_timer_setfn(&start_timer, start_timer_cb, NULL); /* Set callback for timer */ os_timer_arm(&start_timer, 5000 /* call every 5 second */, 1 /* repeat */); } |
Если последний параметр os_time_arm функции равен 0, то обратный вызов таймера будет вызван только один раз. Если он равен 1, то будет вызываться несколько раз , пока os_timer_disarm не выключится.
И, наконец, у нас есть место , чтобы поместить наш код: The start_timer_cb.
Наша задача, чтобы светодиоды мигали. Некоторые платы ESP имеют светодиодный индикатор, прикрепленный к GPIO16, если ваша плата не имеет его, вы можете подключить светодиод к любому свободному GPIO.
1 2 3 4 5 6 7 8 9 10 |
void start_timer_cb(void *arg) { static int on = 0; if (!on) { /* if LED is OFF - turn it on */ gpio_output_set(BIT16, 0, BIT16, 0); on = 1; } else { /* if LED is ON - turn is off */ gpio_output_set(0, BIT12, BIT12, 0): on = 0; }
} |
Как вы помните start_timer_cb является функцией таймера обратного вызова, и он вызывается каждые 5 секунд. При первом вызове переменная равна 0 , и мы устанавливаем GPIO16 до высокого – в результате светодиод будет включен. На втором вызове мы устанавливаем GPIO16 к низкому уровню – и светодиод выключен. И так далее, и так далее.
Построение проекта
Теперь настало время собрать наш проект. Скажем, у нас есть только один исходный файл – main.c. Я не могу рекомендовать мейкфайлы, которые используются для построения примеров. Они слишком сложны и немного странны. Итак, я предлагаю, написать свой собственный (просто!) Makefile.
Вот шаги:
- Компиляция main.c к main.o.
Используйте Xtensa-lx106-эльф-GCC компилятор , который является частью SDK.
- . Проект Link
Linker использует – одну и ту же Xtensa-lx106-ELF-GCC. Библиотеку для установления связей с НКУ гал м С. PHY net80211 ВПА главная
Кроме того, вам нужно поставить скрипт компоновщика (.LD файл). Выберите один из SDK, который соответствует размеру флэш-устройства. После этого шага вы будете иметь .elf файл.
- Преобразование .elf файл в .bin
Для этого используйте esptool.py скрипт из SDK. Выполните его следующим образом :
Если все в порядке, вы должны иметь 3 файла в <выходной каталог> с такими именами, как 0x00000.bin, 0x11000.bin 0x66000.bin.
Мигание
Заключительный шаг- установка прошивки на устройство. Для этого мы будем использовать esptool снова, но теперь мы должны использовать опцию write_flash. Как это:
1 2 |
esptool --port <port name here> --baud 115200 write_flash 0x00000 0x000000.bin 0x11000 0x11000.bin 0x66000 0x66000.bin |
Вы должны использовать реальные имена файлов из предыдущего шага. И, если все в порядке, светодиод прилагаемый к устройству начнет мигать каждые 5 секунд.
Следующие шаги
Запись микропрограммы возможна для любого устройства. Работа с ESP8266 не является исключением. Таким образом, цель данной статьи состоит в том, чтобы указать только направление. Есть много различных интерфейсов в ESP8266 SDK: WiFi, GPIO, TCP / UDP и многое другое. Убедитесь в том , чтобы проверить документацию. Можно проверить примеры поставщиков программно – аппаратного и открытого SDK. Если вы хотите начать с примера, то проверьте , который проходит через запущенный Мангуст встроенного Web -сервера на ESP8266.
Благодарим сайт cnx-software.com за предоставленную информацию
Оригинал статьи тут