ESP8266 Урок 5. Настраиваем toolchain и пишем свою прошивку в IDE Eclipse. Часть 2

 

 

 

 

В предыдущей части урока мы подготовили все инструменты (тулчейн) для сборки прошивки из исходных файлов, создали проект и начали писать файл сценария Makefile, а также исходный код.

Будет тут у нас ещё небольшой подводный камень, но о нём потом. А пока нам хочется создать прошивку и залить её в наш контроллер.

Поэтому идём в Makefile и добавим там ещё одну команду

 

 

Здесь мы используем утилиту AR, которая в Linux используется для создания архива без сжатия, для того, чтобы соединить все объектные файлы в один архив. У нас пока только один объектный файл, поэтому мы собираем в архив только его.

После очередной сборки проекта у нас появится архивный файл в папке build

 

 

Следующий этап — линковка (или компоновка). На данном этапе мы создадим исполняемый файл формата elf

 

 

Здесь также используется ряд параметров, знать которые нам пока не столь важно, голову мы этим также забивать пока не будем. Скажу лишь про некоторые. Параметр -L показывает путь к статическим библиотекам, а параметр -T показывает скрипт, который используется для компоновки — agle.app.v6.ld. Также после параметра -o мы говорим сборщику о том, с каким именем мы формируем elf-файл.

Теперь скорей всего мы опять не сможем собрать наш проект и получим вот такие две ошибки

 

 

Данные ошибки говорят о том, что в наш код мы должны обязательно добавить функцию с именем user_rf_cal_sector_set.

Данная функция устанавливает размер сектора в разделе хранения калибровочных параметров wifi модуля. Хотя мы сейчас вроде и не пользуемся функционалом WiFi, но функция быть должна. Образец её есть практически во всех примерах SDK. Добавим такую функцию в наш main.c выше функции user_init

 

 

Теперь у нас всё прекрасно соберётся и на выходе мы получим исполняемый файл

 

 

С помощью следующей команды в нашем Makefile мы выведем в консоль размеры секций, используя при этом специальную утилиту из набора кросс-компилятора

 

 

Соберём проект и увидим размеры секций в консоли

 

С помощью следующей команды в Makefile, используя специально-обученную утилиту, мы сформируем два образа для заливки в наш контроллер, так как у нас не установлен на нём Linux и мы не можем там запустить elf-файл

 

 

Если мы теперь соберём наш проект, то мы уже получим два файла-образа для заливки в наш ESP

 

 

Ну вот мы и получили заветную прошивку! Из наименований файлов мы даже видим, с каких адресов их заливать в контроллер.

Только прежде чем прошивать наш ESP, если в нём до этого была нестандартная прошивка, то его надо подготовить. Да и если стандартная, то лучше тоже подготовить. Первым делом мы очистим полностью FLASH-память нашего контроллера. Как это делается, мы отлично знаем. А так как затем нам для подготовки к заливки нашей прошивки надо будет в контроллер ещё кое-что залить, то сначала откроем каталог со стандартной прошивкой в SDK

 

 

Запустим командную строку и очистим FLASH-память

 

 

Также, думаю, все мы знаем, что путь к утилите esptool для работы с ней, должен быть доступен.

Если вдруг она не будет работать из папки с утилитами, то можно подключить другую.

Теперь нам нужно прошить с определённого адреса файл с настройками по умолчанию в наш ESP

 

 

Мы использовали адрес 0x3FC000, так как у нас модуль с 4 мегабайтами FLASH-памяти.

Вот теперь наш модуль готов к прошиванию только что созданной нами прошивки, а если всего этого не проделать, то мы рискуем получить зацикливание.

Вернёмся в наш проект и прежде чем в Makefile добавлять ещё одну цель для заливки прошивки, давайте с помощью применения переменных немного сделаем наш сценарий поприличнее.

Для этого в самом верху добавим путь к нашему SDK

 

 

Затем добавим путь к заголовочным файлам SDK

 

 

Также добавим путь к кросс-компилятору

 

 

Также добавим переменные отдельно к каждой утилите кросскомпилятора

 

 

 

Добавим флаги для компиляции и линковки

 

 

Добавим также переменную для команды esptool с полным путём к ней

 

 

Применим наши переменные в цели All, также заэкранируем наши команды, чтобы не выводились в консоли, а выведем туда красивые читабельные команды вместо них. После этого цель All примет следующий вид

 

 

Попробуем собрать наш проект.

Вывод в консоли после этого будет иметь вот такой красивый вид

 

 

Теперь давайте добавим цель в Makefile для заливки наших образов в микроконтроллер

 

 

Чтобы эту цель запускать, мы добавим её в дерево целей. Для этого зайдём во вкладку Build Targe в левой панели и, используя контекстное меню нашего проекта, добавим новую цель с именем flash

 

 

Аналогичным образом добавим в дерево цель clean, такую цель в наш Makefile мы добавим чуть позже.

Наши цели появятся в дереве слева

 

 

Также они появятся и в основном дереве проекта в соответствующей ветке

 

 

Теперь данные цели будут выполняться по двойному щелчку мыши на них.

Давайте выполним цель flash.

У нас начнётся процесс заливки прошивки в контроллер

 

 

Только вот после заливки наша прошивка будет работать неправильно. Вот это и есть подводный камень, о котором я предупреждал.

Мигнув пару раз, светодиод погаснет не вовремя.

Всё дело в том, что в нашем ESP, впрочем, как и у практически каждого микроконтроллера, есть сторожевой таймер (watchdog), который по умолчанию включен, и, если его не выключить заранее при помощи функции system_soft_wdt_stop, что настоятельно не рекомендуется, то его хотя бы раз в полсекунды надо перезагружать при помощью функции SDK system_soft_wdt_feed. А иначе будет происходить то, что у нас и происходит. Не дождавшись перезагрузки таймера, контроллер перезагрузится сам.

Добавим данную функцию в бесконечном цикле в двух местах

 

 

Теперь всё нормально. Светодиод мигает регулярно

 

 

Также чтобы процесс заливки прошивки шел побыстрее, в команде в Makefile добавим ему скорости, используя для этого соответствующий параметр. Также при проблемах с автоопределением COM-порта при наличии нескольких можно жёстко указать требуемый (у меня 29-й, у вас может быть другой)

 

@$(ESPTOOL) -b 512800 -p COM29 write_flash --no-compress -ff 40m -fm dio -fs 32m 0x00000 build/app.out-0x00000.bin 0x10000 build/app.out-0x10000.bin

 

Также добавим ещё цель для очистки каталога от скомпилированных файлов.

 

 

Данный пункт мы можем запускать как двойным щелчком по добавленной цели, так и по пункту контекстного меню clean. Попробуем запустить данную цель

 

 

Всё прекрасно очистилось.

Итак, на данном занятии нам удалось создать свою программу для микроконтроллера и залить её в его FLASH-память. Пусть данная программа пока не обладает серьёзной функциональностью, это всё будет, но самое тяжёлое, можно считать, мы уже сделали. Мы создали тулчейн с SDK, кросскомпилятором и подключили всё это в IDE Eclipse, получив возможность писать программы для контроллера ESP8266. После этого нам станет проще писать дальнейшее ПО для работы с функционалом WiFi и работы с прочими модулями данного контроллера.

Всем спасибо за внимание!

 

Предыдущая часть Программирование МК ESP8266 Следующий урок

 

Исходный код

 

Утилиты для прошивки

 

 

Модуль ESP NodeMCU можно купить здесь: Модуль ESP NodeMCU

Различные модули ЕSP8266 можно приобрести здесь Модули ЕSP8266

Переходник USB to TTL можно приобрести здесь ftdi ft232rl

Многофункциональный переходник CJMCU FT232H USB к JTAG UART FIFO SPI I2C можно приобрести здесь ftdi ft232rl

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

ESP8266 Настраиваем toolchain и пишем свою прошивку в IDE Eclipse

5 комментариев на “ESP8266 Урок 5. Настраиваем toolchain и пишем свою прошивку в IDE Eclipse. Часть 2
  1. Владимир:

    Спасибо за урок.
    у меня при пути D:/ESP8266/utils/esptool elf2image build/app.out
    при питоне 3.8 не работало. В ком. строке -> (esptool version) , не видело этого файла. (esptool.py version) сработало.
    В Makefile вместо (D:/ESP8266/utils/esptool elf2image build/app.out) запустилось в следующем варианте: esptool.py elf2image build/app.out
    Если у кого либо такая проблема, надеюсь, что поможет этот комментарий.

  2. Федоров:

    c:/anaconda3/scripts/esptool.exe elf2image build/app.out
    Для тех у кого не видится еспитул. Устанавливаем пайсон 3 как на видео а потом вставляем эту строчку и все соберется…

  3. megger380:

    Добрый день! Застопорился на этапе сборки файла elf из app_app.a
    xtensa-lx106-elf-gcc: error: : No such file or directory
    xtensa-lx106-elf-gcc: fatal error: no input files
    compilation terminated.
    Все пути верные…

    • megger380:

      Вопрос снят, разобрался.
      Всё работает, спасибо!
      Кстати, в esp-01 не задействовать gpio1. При сборке выдаёт ошибку. PERIPHS_IO_MUX_GPIO1_U нет такого макроса. Вывел gpio2 на внешний светодиод, работает.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*