Работа с ESP8266: Собираем компилятор и пишем первую прошивку

Отсюда

В прошлой статье мы рассмотрели первоначальную настройку и работу модуля ESP-01 с базовой AT-прошивкой. Возможности данной прошивки достаточно ограничены и использовать её для каких-то повседневных задач достаточно сложно. Как я писал в первой статье, для ESP8266 можно написать свою прошивку с нужным функционалом и тем самым сделать плату ESP-01 самодостаточным устройством. Всем кому это интересно, прошу под хабракат.

Как известно, SoC ESP8266 построен на базе процессора Xtensa LX106 фирмы Tensilica, если кому-то интересно, то в сети есть статья про конфигурируемые процессоры этой фирмы. Компания Espressif предоставляет полную документацию, а так же компилятор и среду разработки для SoC ESP8266 только после подписания партнерского соглашения и не со всеми подряд, на мое письмо они так и не ответили. Немного погуглив можно найти утекший в сеть официальный компилятор, среду разработки, основанную на Eclipse, множество документации и лицензии, но это не наш путь. Мы будем использовать неофициальный компилятор на основе Crosstool-NG

В этой статье я расскажу как собрать компилятор под Ubuntu Linux, а так же мы попробуем написать простейшую прошивку. Основной упор я сделаю на работу с компилятором под Windows, а так же настройку среды Eclipse для написания прошивок для ESP8266.

Часть 1: Сборка компилятора под Ubuntu Linux, настройка SDK, сборка стандартных примеров и прошивок.

Установка среды сборки

Для 32-разрядной Debian (Linux) выполняем:

Для 64-разрядной Debian (Linux) выполняем:

Далее:
USER меняем на логин текущего пользователя.

После этого можно откинуться на спинку кресла минут на 40-50 и попить кофе. Если все завершится без ошибок, то можно двигаться дальше.

Установка SDK

Добавляем библиотеки libc, libhal и заголовочные файлы в SDK

Установка ESP image tool

ESP tool можно собрать из исходников,
для Linux можно скачать здесь
для Debian/Ubuntu здесь
Готовый пакет для Ubuntu качаем отсюда

Установка ESP upload tool

Сборка примеров прошивок

Для начала откройте файл /opt/Espressif/ESP8266_SDK/include/osapi.h и закомментируйте строку #include «user_config.h»

Скачиваем и собираем примеры blinky и basic_example:

Если все шаги были сделаны правильно, то сборка пройдет без ошибок и в каталоге firmware появятся 2 файла прошивки 0x00000.bin и 0x40000.bin

Скачиваем и собираем пример базовой прошивки AT:

Для правильной сборки AT прошивки необходимо отредактировать базовый Makefile в строке
LIBS = c gcc hal pp phy net80211 lwip wpa main
добавить линковку библиотеки upgrade, итоговая строка будет выглядеть так
LIBS = c gcc hal pp phy net80211 lwip wpa upgrade main
после этого прошивку можно собрать командой make

Cобираем пример прошивки IoT:

Так же как и для AT прошивки, для правильной сборки IoT прошивки необходимо отредактировать базовый Makefile в строку
MODULES = driver user
нужно добавить дополнительные модули, итоговая строка будет выглядеть так
MODULES = driver user json ssl upgrade lwip
а в строку
LIBS = c gcc hal pp phy net80211 lwip wpa main
добавить линковку библиотеки json, итоговая строка будет выглядеть так
LIBS = c gcc hal pp phy net80211 lwip wpa main json
после этого прошивку можно собрать командой make

Для того чтобы прошить плату ESP-01 нужно использовать команду make flash
Не забываем, что для переключения в режим обновления прошивки нужно подать низкий уровень на GPIO0 и высокий на CH_PD.
Чтобы понять, что делает make flash стоит открыть любой Makefile и найти строку flash:
после подстановки всех аргументов получаем команду прошивки SoC:

Формат файла прошивки, собственно и как протокол обмена можно почитать тут на русском или здесь на английском языках.
На этом рассмотрение сборки компилятора и SDK под Linux закончено.

Часть 2: Установка компилятора под Windows, настройка SDK, сборка стандартных примеров и прошивок.

Т.к. моя основная ОС под которой я работаю 90% времени это Windows, то разработка в Linux меня не сильно интересовала.
Ниже я расскажу, как установить и настроить компилятор и SDK в Windows, а так же как настроить среду разработки Eclipse для комфортной разработки прошивок в ней.
Рассматривать процесс сборки компилятора под Windows я не буду, т.к. это довольно сложная процедура, она намного сложнее сборки в Linux.
Дабы избавить Вас от всех тонкостей и нюансов, я подготовил рабочий комплект Espressif DevKit, включающий в себя компилятор, последнюю версию SDK, стандартные примеры прошивок, а так же мои собственные примеры прошивок.

Итак приступим:
1. Cкачиваем (86Mb) и устанавливаем мой комплект Espressif-ESP8266-DevKit-v1.0.x-x86.exe
2. Скачиваем и устанавливаем Java Runtime x86 (jre-7uXX-windows-i586.exe)
3. Скачиваем и устанавливаем Eclipse Luna x86 для разработки на С++ (eclipse-cpp-luna-SR1-win32.zip). Распаковываем архив в корень диска С.
4. Скачиваем и устанавливаем MinGW. Запускаем mingw-get-setup.exe, в процессе установки выберите режим без GUI, то есть уберите галочку «…also install support for the graphical user interface».
5. Скачиваем (84Mb) набор моих скриптов для автоматизации установки доп.модулей для MinGW.
6. Запустите из моего набора файл install-mingw-package.bat.
Он установит основные модули для MinGW, установка должна пройти без ошибок.
7. Запустите Eclipse Luna из каталога c:\eclipse\eclipse.exe
8. В Eclipse выберите меню File -> Import -> General -> Existing Project into Workspace, в строке Select root directory выберите каталог C:\Espressif\examples и импортируйте рабочие проекты.
Далее справа в Make Target выберите нужный проект, например hello-world и запустите цель all на сборку,
при этом в окне Console должен отобразиться ход сборки, если все сделано правильно, то будет примерно такая картина:

Это значит, что прошивка для ESP8266 собрана и находится в каталоге C:\Espressif\examples\hello-world\firmware
Для прошивки ESP8266 используйте цель flash, предварительно отредактировав файл сборки проекта Makefile, строка
ESPPORT ?= COM2
, где после COM цифра 2 указывает номер COM-порта к которому подключена плата с ESP8266.

Видео с демонстрацией подключения проектов в Eclipse, сборкой и прошивкой ESP8266.

Видео с демонстрацией создания нового проекта в Eclipse.

Как было сказано выше, для переключения в режим обновления прошивки нужно подать низкий уровень на GPIO0 и высокий на CH_PD, после этого либо передернуть питание платы, либо выполнить Сброс, подачей низкого уровня на EXT_RSBT (он же RESET). Выполнять эти действия постоянно очень неудобно. Немного подумав, я изменил схему подключения платы ESP-01 к преобразователю USB-to-RS232, смысл изменений сводится к подключению вывода RTS преобразователя USB-to-RS232 к выводу EXT_RSBT (он же RESET) платы ESP-01 и вывода DTR преобразователя USB-to-RS232 к выводу GPIO0 платы ESP-01. Так же я подправил утилиту esptool.py в процедуре connect для того, чтобы при запуске происходил сброс платы по сигналу RTS и вход в режим загрузчика по сигналу DTR.

Изменения в esptool.py

Итоговая схема подключения:

Таким легким финтом ушами я решил проблему ручного перехода в режим обновления прошивки.
Теперь, выполняя цель flash в Eclipse, мы одним кликом мышки шьем плату новой прошивкой. Не нужно ничего перетыкать на макетке и ничего соединять.

Но в связи с этим финтом ушами пришлось поискать нормальную программу Terminal, т.к. то же Putty уже не подходил, в нем нельзя управлять линиями RTS и DTR и более того, сразу после подключения к COM-порту через Putty, он ставил линию DTR в низкий уровень, что приводило к постоянному входу в режим загрузчика. Удобная и в то же время богатая функционалам программа Terminal легко нашлась, она находится в каталоге C:\Espressif\utils\

Часть 3: Написание простейших прошивок.

Для того, чтобы начать писать прошивки нужно изучить документацию на сам чип ESP8266 и на SDK, я не стал включать документацию в состав своей сборки Espressif-ESP8266-DevKit, дабы не нарушать разного рода лицензионных соглашений, все таки вся документация идет с пометкой confidential. Тем не менее, в интернете есть масса источников, где её можно раздобыть, например:
Спецификация на чип ESP8266
Описание SDK ESP8266 — это основной документ, который нам понадобится.

В прошлой статье на примере AT-прошивки мы подключались к Wi-Fi точке доступа и запускали TCP-сервер (TCP-клиент) на ESP8266, а так же отправляли тестовые данные на ПК. Как я писал ранее, данный способ не совсем удобен, т.к. для выполнения AT-команд по запуску TCP-сервера (TCP-клиента) требуется отдельный контроллер. Ниже мы рассмотрим пример написания простейшей прошивки для ESP8266, которая реализует все это без внешнего контроллера.
Итак задание:
1. Плата ESP-01 должна переключаться в режим STA (Wi-Fi клиента), устанавливать соединение с нашей AP.
2. После установки соединения с AP необходимо установить TCP-соединение с ПК и отправить тестовую строку.
3. К GPIO0 подключаем кнопку, при замыкании отправляем текстовую строку.
3. Процедуру отправки повторять каждые 5 сек.

Открываем в Eclipse пример wifi-sta-tcp-client из C:\Espressif\examples\
Типичная структуры папок в любом проекте для ESP8266 примерно такая:

, где
— файл Makefile — это набор инструкций для программы make, которая помогает собирать наш проект
— каталог driver — содержит драйвера для различных устройств, пока у нас там только файл uart.c, для работы с портом rs232 чипа ESP8266, в принципе там могут быть драйвера для работы с gpio, i2c, spi, pwm и др., смотрите пример IoT_Demo, там более наглядно видно что может быть.
— каталог include — содержит вспомогательные заголовочные файлы, пока там только файлы для работы с портом rs232
— каталог user — основной каталог, в нем находятся основные файлы прошивки, файл user_main.c и user_config.h

Могут присутствовать и другие каталоги, все зависит от модели и принципов разработки, но Makefile настроен именно на такую структуру, и если Вы начнете что-то менять, то придется переписывать инструкции Makefile’а.
В текущем виде для того чтобы добавить доп. каталог с исходниками в сборку достаточно в Makefile в строку
MODULES = driver user
добавить наш новый каталог, например ssl и он будет участвовать в сборке прошивки.
Для добавления доп. библиотек в Makefile’е нужно дополнить строку
LIBS = c gcc hal phy pp net80211 lwip wpa main
нужными нам библиотеками, например если нам нужна в проекте библиотека по работе с json, то пишем
LIBS = c gcc hal phy pp net80211 lwip wpa main json

Открываем файл user\user_main.c

Основная процедура, которая выполняется при старте прошивке это

В начало файла user\user_main.c добавляем заголовочные файлы:

Данные файлы, за исключением user_config.h и driver/uart.h находятся C:\Espressif\ESP8266_SDK\include\
ets_sys.h — спецефичные структуры и определения для работы с событиями и таймерами
osapi.h — таймеры и некоторые системные функции, например os_strcat, os_memcpy, os_delay_us и т.п.
os_type.h — мапинг структур из ets_sys.h
user_interface.h — множество вспомогательных структур и процедур API, в частности для работы с wi-fi, процедуры system_restart, system_deep_sleep и т.д.
espconn.h — основной файл API со структурами и процедурами по работе с TCP и UDP соединениями
mem.h — работа с памятью, os_malloc, os_free и т.п.
gpio.h — вспомогательные структуры и процедуры API для работы с GPIO

Итак пишем в user_init() следующее:

Процедура инициализации GPIO

Процедура проверки сделана в лоб, без какого либо устранения дребезга контактов, по уму нужно делать иначе, так же ниже будет видно, что в senddata не идет никакой проверки на поднятие интерфейса wi-fi, что тоже следует учитывать.

Процедура проверки GPIO

Процедура проверки Wi-Fi подключения (вызывается по таймеру)

Процедура отправки данных на ПК

callback функция, вызываемая после установки соединения

callback функции, вызываемые после отправки данных и после отключения

И в заключении видео, с демонстрацией работы этой прошивки

Как Вы уже заметили, плата на чипе Espressif ESP8266 обладает достаточно внушительным потенциалом для написания собственных прошивок.
В следующей статье я приведу пример работы ESP8266 в связке с модулем передатчика nooLite MT1132 и мы попробуем управлять освещением в реальной квартире. Возможно в этой же статье мы разберем работу простейшего Web-сервера для ESP8266.

P.S. Если у Вас возникли вопросы и пожелания, то я буду рад их выслушать, но ввиду низкой кармы я не смогу отвечать оперативно в комментариях, поэтому пишите в ПМ или на email.