Введение

Почему, ESP32?

Esp32 использует два процессора Xtensa с симметричной адресацией. Это разработка Гарварда, сделанная аж в 1997 году. Заявленная тактовая частота 240/160 МГц.

Частота таймеров 80 МГц

Очень низкое энергопотребление в режиме «глубокого сна» — аж  5-2,5 мкА.

Аналогичные по архитектуре модули STM32, скажем стоят значительно дороже. Да, 400 МГц, да отличная документация. Но, скажем процессор STM32F407 стоит около 1000 рублей на Алиэкспрессе.

И почти нет микропроцессоров, у которых были бы «на борту» Bluetooth и Wi-Fi стоимостью 150-200 рублей.

Удобные для любительской распайки модули с микропроцессором «на борту»

Почему esp-idf VSCode и Eclipse?

https://github.com/espressif/esp-idf

ESP-IDF позиционируется, как Espressif IoT Development Framework — Фреймворк разработки IoT (Интернет Вещей). Плата с процессором Esp32 вполне может стать объектом Интернета Вещей.

А так же, с этим фреймворком легко разрабатывать Bluetooth Low Energy устройства, которыми, скажем, можно легко управлять с мобильного телефона. Подключаться к WiFi и проводной сети Ethernet.

Да, цена входа для непрофессионального разработчика на Arduino IDE, значительно ниже. Для сегмента DIY (Самодельничество, или «сделай сам» (англ. DIY — Do It Yourself), — вид деятельности, при котором люди самостоятельно производят какие-либо изделия для собственного использования), более чем достаточно.

Но всегда же хочется большего, не правда ли? Примитивы FreeRTOS кажутся мне более понятными, логичными и простыми в использовании, чем void setup() и void loop(). Опять же, возможность обращения к LL функциям (Low Level Layer Function)

Так и не понял, можно ли «поднять» BLE GATT Server на Arduino IDE, но во фреймворке esp-idf он пишется почти элементарно.

Часть I. Консоль

Статей о настройке IDE Visual Studio Code и Eclipse под Linux и Windows написано уже много. В принципе, с точностью до небольших деталей, они повторяют друг-друга. Эта заметка не исключение.

Отличие лишь в том, что и Eclipse и Visual Studio Code будут использовать единожды установленные Espressif Framework и набор инструментов — toolchain. Раздражает, что каждая установка плагинов https://github.com/espressif/vscode-esp-idf-extension и https://github.com/espressif/idf-eclipse-plugin «тащит» за собой новую установку пакета ESP-IDF и TOOLCHAIN. Каждая установка в сумме, 3.3 Гб, между прочим.

Linux

Для примера, использую Ubuntu 21.04.

Во-первых, классическое начало для deb систем:

sudo apt update
sudo apt upgrade
sudo apt install python3-pip git cmake ninja-build

Ну или установить cmake и ninja, используя snap

Для полноценной работы esp-idf должны быть установлены git, python3 и pip3. Причём, надо, чтобы python вызывался, как python, а не python3 или python3.9 и т.д. Скажем, в Ubuntu 18.04, 20.10, 21.04 такой команды, как python изначально нет. Есть python3. Так, что надо либо сделать мягкую ссылку:

mkdir ~/.local/bin
ln -sf /usr/bin/python3 ~/.local/bin/python
source ~/.profile

Либо создать Python Virtual Environment (https://docs.python.org/3/tutorial/venv.html)

python3 -m venv ~/python/python3
code ~/python/python3/bin/activate

Последний способ чуть сложнее, но даже в создании мягкой ссылки есть забавный подвох: если Вы не создали каталог ~/.local/bin, то .profile его не «подхватит», потому, что в скрипте профиле есть такой код:

if [ -d "$HOME/.local/bin" ] ; then
	PATH="$PATH:$HOME/.local/bin"
fi

Иными словами, если этот каталог не создан, его в пути и не будет. После создания каталога, нужно вызвать source ~/.profile

Проверим себя. Вызовем из терминала:

$python
Python 3.8.10 (default, Jun  2 2021, 10:49:15)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()

Всё работает. Скачиваем esp-idf. Предпочитаю установить фреймворк в какой-нибудь подкаталог домашеного каталога, вроде ~/espressif. Фреймворков Esp32, аж целых три — esp-adf, esp-idf, esp-mdf, так что, чтобы не засорять «корневое» пространство пользовательского каталога, сложим их в одну кучу. Имена каталогов верхних уровней не должны содержать пробелов.

mkdir ~/espressif
cd ~/espressif
git clone https://github.com/espressif/esp-idf.git --recursive

Имеет смысл сразу добавить в какой-нибудь из пользовательских .*rc-файлов загрузку переменных окружения esp-idf. Переменные ADF_PATH и MDF_PATH предусмотрены на тот случай, если Вы захотите работать на Esp32 со звуком или создавать самоорганизующиеся сети из нескольких плат Esp32.

Скрипт добавляет алиас idfexp. Так удобнее превращать текущую консоль в среду IDF-разработки, чтобы не набирать, скажем каждый раз ~/espressif/esp-idf/export.sh

# Скрипт для экспорта окружения esp-idf, esp-adf, esp-mdf
#
ESP_PATH="$HOME/espressif"
IDF_TOOLS_PATH="$HOME/.espressif"

if [ -d "$ESP_PATH/esp-idf" ] ; then
	IDF_PATH="$ESP_PATH/esp-idf"
	export IDF_PATH
	if [ -f "$IDF_PATH/export.sh" ] ; then
		alias idfexp="\. $IDF_PATH/export.sh"
	fi
fi

if [ -f "$ESP_PATH/esp-adf" ] ; then
	ADF_PATH="$ESP_PATH/esp-adf"
	export ADF_PATH
fi

if [ -f "$ESP_PATH/esp-mdf" ] ; then
	MDF_PATH="$ESP_PATH/esp-mdf"
	export MDF_PATH
fi

if [ -d "$IDF_TOOLS_PATH" ] ; then
	export IDF_TOOLS_PATH
fi

Можно добавить автоматическую загрузку скрипта через любой актуальный ~/.*rc-файл. Например, добавить в ~/.bashrc (\. необходим, поскольку, разрешения .*rc-файлов 0644):

if [ -f "$HOME/.idfrc" ]; then
       	\. "$HOME/.idfrc" # This load Espressif environment 
fi

Далее, осталось установить набор инструментария для сборки проектов. По умолчанию toolchain будет установлен в ~/.espressif

cd ~/espressif/esp-idf
./install.sh

Если всё прошло удачно, то увидим что-то такое (журнал установки укорочен):

Скрытый текст

$ ./install.sh

WARNING: You are using pip version 21.2.3; however, version 21.2.4 is available. You should consider upgrading via the '/home/grandfatherpikhto/.espressif/python_env/idf4.4_py3.8_env/bin/python -m pip install --upgrade pip' command. All done! You can now run:

. ./export.sh

Обратите внимание, что предлагается обновить venv:

WARNING: You are using pip version 21.2.3; however, version 21.2.4 is available.
You should consider upgrading via the '/home/grandfatherpikhto/.espressif/python_env/idf4.4_py3.8_env/bin/python -m pip install --upgrade pip' command.

Обновляем:

~/.espressif/python_env/idf4.4_py3.8_env/bin/python -m pip install --upgrade pip pip

Размер esp-idf приблизительно 2.2 Гб, toolchain — 1.2 Гб. Ну, так на минуточку:

$du -hs ~/espressif/esp-idf
1.1G    esp-idf
$du -hs ~/.espressif
1.9G    .espressif

После установки toolchain можно вызвать source ~/.idfrc и подгрузить переменные окружения ESP-IDF командой idfexp или

. ~/espressif/esp-idf/export.sh

Если всё пошло правильно, должны увидеть что-то такое:

Скрытый текст

$ idfexp Detecting the Python interpreter Checking "python" ... Python 3.8.10 "python" has been detected Adding ESP-IDF tools to PATH... Using Python interpreter in /home/grandfatherpikhto/.espressif/python_env/idf4.4_py3.8_env/bin/python Checking if Python packages are up to date... Python requirements from /home/grandfatherpikhto/espressif/esp-idf/requirements.txt are satisfied. Added the following directories to PATH: /home/grandfatherpikhto/espressif/esp-idf/components/esptool_py/esptool /home/grandfatherpikhto/espressif/esp-idf/components/espcoredump /home/grandfatherpikhto/espressif/esp-idf/components/partition_table /home/grandfatherpikhto/espressif/esp-idf/components/app_update /home/grandfatherpikhto/.espressif/tools/xtensa-esp32-elf/esp-2021r1-8.4.0/xtensa-esp32-elf/bin /home/grandfatherpikhto/.espressif/tools/xtensa-esp32s2-elf/esp-2021r1-8.4.0/xtensa-esp32s2-elf/bin /home/grandfatherpikhto/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin /home/grandfatherpikhto/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin /home/grandfatherpikhto/.espressif/tools/esp32ulp-elf/2.28.51-esp-20191205/esp32ulp-elf-binutils/bin /home/grandfatherpikhto/.espressif/tools/esp32s2ulp-elf/2.28.51-esp-20191205/esp32s2ulp-elf-binutils/bin /home/grandfatherpikhto/.espressif/tools/openocd-esp32/v0.10.0-esp32-20210721/openocd-esp32/bin /home/grandfatherpikhto/.espressif/python_env/idf4.4_py3.8_env/bin /home/grandfatherpikhto/espressif/esp-idf/tools Done! You can now compile ESP-IDF projects. Go to the project directory and run:

idf.py build

В принципе, можно приступить к сборке и прошивке какого-нибудь проекта из каталога ~/espressif/esp-idf/examples, но сначала надо настроить udev — пакет управления устройствами для новых версий ядра Linux.

Ниже привожу «сборную солянку» файла 40-dfuse.rules из правил, которую удалось накопать на форуме Esp32 (https://www.esp32.com/). Думаю, в особых объяснениях этот файл не нуждается. Просто, коллекция idVendor и idProduct различных макетных плат Esp32. Обратите внимание, что расширение файла должно быть именно «rules». Иначе, udev не прочитает правила.

SUBSYSTEMS=="usb", ATTRS{idVendor}=="303a", ATTRS{idProduct}=="00??", GROUP="plugdev", MODE="0666"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6015", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1"

Обновляем правила:

sudo su
cp 40-dfuse.rules /etc/udev/rules.d/
systemctl restart udev.service
udevadm control --reload-rules

Теперь, можно собрать и запустить какой-нибудь простой проект Esp32. Не забудьте подключить макетную плату Esp32 к компьютеру. Если она уже была подключена, отключите и подключите снова. Иначе, правила udev не будут прочитаны для этого устройства.

У вашего покорного слуги наличествует макетная плата ESP32-WROOM. Попробуем собрать и прошить ~/espressif/esp-idf/examples/get-started/hello_world. Обратите внимание, что, в принципе надо указывать порт. Например, idf.py -p /dev/ttyUSB0 flash. Но, на самом деле, это не обязательно. idf.py попробует найти порт, к которому подключено устройство Esp32 и прошьёт первое обнаруженное.

Если всё получилось хорошо, увидим что-то вроде:

Скрытый текст

~/Programs/esp32/hello_world $ idf.py build

Executing action: all (aliases: build)

Running cmake in directory /home/denis/Programs/esp32/hello_world/build

Executing "cmake -G Ninja -DPYTHON_DEPS_CHECKED=1 -DESP_PLATFORM=1 -DCCACHE_ENABLE=0 /home/denis/Programs/esp32/hello_world"...

-- IDF_TARGET not set, using default target: esp32

-- Found Git: /usr/bin/git (found version "2.32.0")

-- The C compiler identification is GNU 8.4.0

-- The CXX compiler identification is GNU 8.4.0

-- The ASM compiler identification is GNU

-- Found assembler: /home/denis/.espressif/tools/xtensa-esp32-elf/esp-2021r1-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc

-- Detecting C compiler ABI info

-- Detecting C compiler ABI info - done

-- Check for working C compiler: /home/denis/.espressif/tools/xtensa-esp32-elf/esp-2021r1-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc - skipped

-- Detecting C compile features

-- Detecting C compile features - done

-- Detecting CXX compiler ABI info

-- Detecting CXX compiler ABI info - done

-- Check for working CXX compiler: /home/denis/.espressif/tools/xtensa-esp32-elf/esp-2021r1-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-g++ - skipped

-- Detecting CXX compile features

-- Detecting CXX compile features - done

-- Project is not inside a git repository, or git repository has no commits; will not use 'git describe' to determine PROJECT_VER.

-- Building ESP-IDF components for target esp32

-- Project sdkconfig file /home/denis/Programs/esp32/hello_world/sdkconfig

-- Found PythonInterp: /home/denis/.espressif/python_env/idf4.4_py3.9_env/bin/python (found version "3.9.6")

-- Found Perl: /usr/bin/perl (found version "5.32.1")

-- App "hello-world" version: 1

-- Adding linker script /home/denis/Programs/esp32/hello_world/build/esp-idf/esp_system/ld/memory.ld

-- Adding linker script /home/denis/espressif/esp-idf/components/esp_system/ld/esp32/sections.ld.in

-- Adding linker script /home/denis/espressif/esp-idf/components/esp_rom/esp32/ld/esp32.rom.ld

-- Adding linker script /home/denis/espressif/esp-idf/components/esp_rom/esp32/ld/esp32.rom.api.ld

-- Adding linker script /home/denis/espressif/esp-idf/components/esp_rom/esp32/ld/esp32.rom.libgcc.ld

-- Adding linker script /home/denis/espressif/esp-idf/components/esp_rom/esp32/ld/esp32.rom.newlib-data.ld

-- Adding linker script /home/denis/espressif/esp-idf/components/esp_rom/esp32/ld/esp32.rom.syscalls.ld

-- Adding linker script /home/denis/espressif/esp-idf/components/esp_rom/esp32/ld/esp32.rom.newlib-funcs.ld

-- Adding linker script /home/denis/espressif/esp-idf/components/esp_rom/esp32/ld/esp32.rom.newlib-time.ld

-- Adding linker script /home/denis/espressif/esp-idf/components/soc/esp32/ld/esp32.peripherals.ld

-- Components: app_trace app_update asio bootloader bootloader_support bt cbor cmock coap console cxx driver efuse esp-tls esp32 esp_adc_cal esp_common esp_eth esp_event esp_gdbstub esp_hid esp_http_client esp_http_server esp_https_ota esp_https_server esp_hw_support esp_ipc esp_lcd esp_local_ctrl esp_netif esp_phy esp_pm esp_ringbuf esp_rom esp_serial_slave_link esp_system esp_timer esp_websocket_client esp_wifi espcoredump esptool_py expat fatfs freemodbus freertos hal heap idf_test ieee802154 jsmn json libsodium log lwip main mbedtls mdns mqtt newlib nghttp nvs_flash openssl openthread partition_table perfmon protobuf-c protocomm pthread sdmmc soc spi_flash spiffs tcp_transport tcpip_adapter tinyusb ulp unity usb vfs wear_levelling wifi_provisioning wpa_supplicant xtensa

-- Component paths: /home/denis/espressif/esp-idf/components/app_trace /home/denis/espressif/esp-idf/components/app_update /home/denis/espressif/esp-idf/components/asio /home/denis/espressif/esp-idf/components/bootloader /home/denis/espressif/esp-idf/components/bootloader_support /home/denis/espressif/esp-idf/components/bt /home/denis/espressif/esp-idf/components/cbor /home/denis/espressif/esp-idf/components/cmock /home/denis/espressif/esp-idf/components/coap /home/denis/espressif/esp-idf/components/console /home/denis/espressif/esp-idf/components/cxx /home/denis/espressif/esp-idf/components/driver /home/denis/espressif/esp-idf/components/efuse /home/denis/espressif/esp-idf/components/esp-tls /home/denis/espressif/esp-idf/components/esp32 /home/denis/espressif/esp-idf/components/esp_adc_cal /home/denis/espressif/esp-idf/components/esp_common /home/denis/espressif/esp-idf/components/esp_eth /home/denis/espressif/esp-idf/components/esp_event /home/denis/espressif/esp-idf/components/esp_gdbstub /home/denis/espressif/esp-idf/components/esp_hid /home/denis/espressif/esp-idf/components/esp_http_client /home/denis/espressif/esp-idf/components/esp_http_server /home/denis/espressif/esp-idf/components/esp_https_ota /home/denis/espressif/esp-idf/components/esp_https_server /home/denis/espressif/esp-idf/components/esp_hw_support /home/denis/espressif/esp-idf/components/esp_ipc /home/denis/espressif/esp-idf/components/esp_lcd /home/denis/espressif/esp-idf/components/esp_local_ctrl /home/denis/espressif/esp-idf/components/esp_netif /home/denis/espressif/esp-idf/components/esp_phy /home/denis/espressif/esp-idf/components/esp_pm /home/denis/espressif/esp-idf/components/esp_ringbuf /home/denis/espressif/esp-idf/components/esp_rom /home/denis/espressif/esp-idf/components/esp_serial_slave_link /home/denis/espressif/esp-idf/components/esp_system /home/denis/espressif/esp-idf/components/esp_timer /home/denis/espressif/esp-idf/components/esp_websocket_client /home/denis/espressif/esp-idf/components/esp_wifi /home/denis/espressif/esp-idf/components/espcoredump /home/denis/espressif/esp-idf/components/esptool_py /home/denis/espressif/esp-idf/components/expat /home/denis/espressif/esp-idf/components/fatfs /home/denis/espressif/esp-idf/components/freemodbus /home/denis/espressif/esp-idf/components/freertos /home/denis/espressif/esp-idf/components/hal /home/denis/espressif/esp-idf/components/heap /home/denis/espressif/esp-idf/components/idf_test /home/denis/espressif/esp-idf/components/ieee802154 /home/denis/espressif/esp-idf/components/jsmn /home/denis/espressif/esp-idf/components/json /home/denis/espressif/esp-idf/components/libsodium /home/denis/espressif/esp-idf/components/log /home/denis/espressif/esp-idf/components/lwip /home/denis/Programs/esp32/hello_world/main /home/denis/espressif/esp-idf/components/mbedtls /home/denis/espressif/esp-idf/components/mdns /home/denis/espressif/esp-idf/components/mqtt /home/denis/espressif/esp-idf/components/newlib /home/denis/espressif/esp-idf/components/nghttp /home/denis/espressif/esp-idf/components/nvs_flash /home/denis/espressif/esp-idf/components/openssl /home/denis/espressif/esp-idf/components/openthread /home/denis/espressif/esp-idf/components/partition_table /home/denis/espressif/esp-idf/components/perfmon /home/denis/espressif/esp-idf/components/protobuf-c /home/denis/espressif/esp-idf/components/protocomm /home/denis/espressif/esp-idf/components/pthread /home/denis/espressif/esp-idf/components/sdmmc /home/denis/espressif/esp-idf/components/soc /home/denis/espressif/esp-idf/components/spi_flash /home/denis/espressif/esp-idf/components/spiffs /home/denis/espressif/esp-idf/components/tcp_transport /home/denis/espressif/esp-idf/components/tcpip_adapter /home/denis/espressif/esp-idf/components/tinyusb /home/denis/espressif/esp-idf/components/ulp /home/denis/espressif/esp-idf/components/unity /home/denis/espressif/esp-idf/components/usb /home/denis/espressif/esp-idf/components/vfs /home/denis/espressif/esp-idf/components/wear_levelling /home/denis/espressif/esp-idf/components/wifi_provisioning /home/denis/espressif/esp-idf/components/wpa_supplicant /home/denis/espressif/esp-idf/components/xtensa

-- Configuring done

-- Generating done

-- Build files have been written to: /home/denis/Programs/esp32/hello_world/build

Running ninja in directory /home/denis/Programs/esp32/hello_world/build

Executing "ninja all"...

[8/994] Generating ../../partition_table/partition-table.bin

Partition table binary generated. Contents:


ESP-IDF Partition Table

Name, Type, SubType, Offset, Size, Flags

nvs,data,nvs,0x9000,24K,

phy_init,data,phy,0xf000,4K,

factory,app,factory,0x10000,1M,


[210/994] Performing configure step for 'bootloader'

-- Found Git: /usr/bin/git (found version "2.32.0")

-- The C compiler identification is GNU 8.4.0

-- The CXX compiler identification is GNU 8.4.0

-- The ASM compiler identification is GNU

-- Found assembler: /home/denis/.espressif/tools/xtensa-esp32-elf/esp-2021r1-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc

-- Detecting C compiler ABI info

-- Detecting C compiler ABI info - done

-- Check for working C compiler: /home/denis/.espressif/tools/xtensa-esp32-elf/esp-2021r1-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc - skipped

-- Detecting C compile features

-- Detecting C compile features - done

-- Detecting CXX compiler ABI info

-- Detecting CXX compiler ABI info - done

-- Check for working CXX compiler: /home/denis/.espressif/tools/xtensa-esp32-elf/esp-2021r1-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-g++ - skipped

-- Detecting CXX compile features

-- Detecting CXX compile features - done

-- Building ESP-IDF components for target esp32

-- Project sdkconfig file /home/denis/Programs/esp32/hello_world/sdkconfig

-- Adding linker script /home/denis/espressif/esp-idf/components/soc/esp32/ld/esp32.peripherals.ld

-- Adding linker script /home/denis/espressif/esp-idf/components/esp_rom/esp32/ld/esp32.rom.ld

-- Adding linker script /home/denis/espressif/esp-idf/components/esp_rom/esp32/ld/esp32.rom.api.ld

-- Adding linker script /home/denis/espressif/esp-idf/components/esp_rom/esp32/ld/esp32.rom.libgcc.ld

-- Adding linker script /home/denis/espressif/esp-idf/components/esp_rom/esp32/ld/esp32.rom.newlib-funcs.ld

-- Adding linker script /home/denis/espressif/esp-idf/components/bootloader/subproject/main/ld/esp32/bootloader.ld

-- Adding linker script /home/denis/espressif/esp-idf/components/bootloader/subproject/main/ld/esp32/bootloader.rom.ld

-- Components: bootloader bootloader_support efuse esp32 esp_common esp_hw_support esp_rom esp_system esptool_py freertos hal log main micro-ecc newlib partition_table soc spi_flash xtensa

-- Component paths: /home/denis/espressif/esp-idf/components/bootloader /home/denis/espressif/esp-idf/components/bootloader_support /home/denis/espressif/esp-idf/components/efuse /home/denis/espressif/esp-idf/components/esp32 /home/denis/espressif/esp-idf/components/esp_common /home/denis/espressif/esp-idf/components/esp_hw_support /home/denis/espressif/esp-idf/components/esp_rom /home/denis/espressif/esp-idf/components/esp_system /home/denis/espressif/esp-idf/components/esptool_py /home/denis/espressif/esp-idf/components/freertos /home/denis/espressif/esp-idf/components/hal /home/denis/espressif/esp-idf/components/log /home/denis/espressif/esp-idf/components/bootloader/subproject/main /home/denis/espressif/esp-idf/components/bootloader/subproject/components/micro-ecc /home/denis/espressif/esp-idf/components/newlib /home/denis/espressif/esp-idf/components/partition_table /home/denis/espressif/esp-idf/components/soc /home/denis/espressif/esp-idf/components/spi_flash /home/denis/espressif/esp-idf/components/xtensa

-- Configuring done

-- Generating done

-- Build files have been written to: /home/denis/Programs/esp32/hello_world/build/bootloader

[272/994] Performing build step for 'bootloader'

[1/95] Generating project_elf_src_esp32.c

[2/95] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32/esp_efuse_table.c.obj

[3/95] Building C object CMakeFiles/bootloader.elf.dir/project_elf_src_esp32.c.obj

[4/95] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mpu_hal.c.obj

[5/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/lldesc.c.obj

[6/95] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/cpu_hal.c.obj

[7/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/adc_periph.c.obj

[8/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/soc_include_legacy_warn.c.obj

[9/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/dac_periph.c.obj

[10/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/i2c_periph.c.obj

[11/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/i2s_periph.c.obj

[12/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/gpio_periph.c.obj

[13/95] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/wdt_hal_iram.c.obj

[14/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/interrupts.c.obj

[15/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/lcd_periph.c.obj

[16/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/rmt_periph.c.obj

[17/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/ledc_periph.c.obj

[18/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/mcpwm_periph.c.obj

[19/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/rtc_io_periph.c.obj

[20/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/sdmmc_periph.c.obj

[21/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/pcnt_periph.c.obj

[22/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/sigmadelta_periph.c.obj

[23/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/sdio_slave_periph.c.obj

[24/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/timer_periph.c.obj

[25/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/uart_periph.c.obj

[26/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/spi_periph.c.obj

[27/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/touch_sensor_periph.c.obj

[28/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_clock_init.c.obj

[29/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common_loader.c.obj

[30/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_mem.c.obj

[31/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common.c.obj

[32/95] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/esp32/spi_flash_rom_patch.c.obj

[33/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random.c.obj

[34/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random_esp32.c.obj

[35/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_flash.c.obj

[36/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_partitions.c.obj

[37/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/secure_boot.c.obj

[38/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_encrypt.c.obj

[39/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_qio_mode.c.obj

[40/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_efuse_esp32.c.obj

[41/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_utility.c.obj

[42/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_flash_config_esp32.c.obj

[43/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_console_loader.c.obj

[44/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_init.c.obj

[45/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp_image_format.c.obj

[46/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_clock_loader.c.obj

[47/95] Building C object esp-idf/micro-ecc/CMakeFiles/__idf_micro-ecc.dir/uECC_verify_antifault.c.obj

[48/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_panic.c.obj

[49/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_console.c.obj

[50/95] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32/esp_efuse_fields.c.obj

[51/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32/bootloader_sha.c.obj

[52/95] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32/esp_efuse_utility.c.obj

[53/95] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_api_key_esp32.c.obj

[54/95] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_api.c.obj

[55/95] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_fields.c.obj

[56/95] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_err.c.obj

[57/95] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/compare_set.c.obj

[58/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32/bootloader_esp32.c.obj

[59/95] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_utility.c.obj

[60/95] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32/rtc_clk_init.c.obj

[61/95] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32/rtc_pm.c.obj

[62/95] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/cpu_util.c.obj

[63/95] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32/rtc_init.c.obj

[64/95] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32/chip_info.c.obj

[65/95] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32/rtc_sleep.c.obj

[66/95] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/eri.c.obj

[67/95] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32/rtc_wdt.c.obj

[68/95] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_crc.c.obj

[69/95] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xt_trax.c.obj

[70/95] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_longjmp.S.obj

[71/95] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_sys.c.obj

[72/95] Building C object esp-idf/esp_common/CMakeFiles/__idf_esp_common.dir/src/esp_err_to_name.c.obj

[73/95] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_uart.c.obj

[74/95] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32/rtc_time.c.obj

[75/95] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/bootloader_start.c.obj

[76/95] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/log_noos.c.obj

[77/95] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/log_buffers.c.obj

[78/95] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/log.c.obj

[79/95] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32/rtc_clk.c.obj

[80/95] Linking C static library esp-idf/log/liblog.a

[81/95] Linking C static library esp-idf/esp_rom/libesp_rom.a

[82/95] Linking C static library esp-idf/esp_common/libesp_common.a

[83/95] Linking C static library esp-idf/xtensa/libxtensa.a

[84/95] Linking C static library esp-idf/esp_hw_support/libesp_hw_support.a

[85/95] Linking C static library esp-idf/esp_system/libesp_system.a

[86/95] Linking C static library esp-idf/efuse/libefuse.a

[87/95] Linking C static library esp-idf/bootloader_support/libbootloader_support.a

[88/95] Linking C static library esp-idf/spi_flash/libspi_flash.a

[89/95] Linking C static library esp-idf/micro-ecc/libmicro-ecc.a

[90/95] Linking C static library esp-idf/soc/libsoc.a

[91/95] Linking C static library esp-idf/hal/libhal.a

[92/95] Linking C static library esp-idf/main/libmain.a

[93/95] Linking C executable bootloader.elf

[94/95] Generating binary image from built executable

esptool.py v3.2-dev

Merged 1 ELF section

Generated /home/denis/Programs/esp32/hello_world/build/bootloader/bootloader.bin

[95/95] cd /home/denis/Programs/esp32/hello_world/build/bootloader/esp-idf/esptool_py && /home/denis/.espressif/python_env/idf4.4_py3.9_env/bin/python /home/denis/espressif/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x1000 /home/denis/Programs/esp32/hello_world/build/bootloader/bootloader.bin

Bootloader binary size 0x6330 bytes. 0xcd0 bytes (13%) free.

[993/994] Generating binary image from built executable

esptool.py v3.2-dev

Merged 2 ELF sections

Generated /home/denis/Programs/esp32/hello_world/build/hello-world.bin

[994/994] cd /home/denis/Programs/esp32/hello_world/build/esp-idf/esptool_py && /home/denis/.espressif/python_env/idf...32/hello_world/build/partition_table/partition-table.bin /home/denis/Programs/esp32/hello_world/build/hello-world.bin

hello-world.bin binary size 0x28eb0 bytes. Smallest app partition is 0x100000 bytes. 0xd7150 bytes (84%) free.

Project build complete. To flash, run this command:

/home/denis/.espressif/python_env/idf4.4_py3.9_env/bin/python ../../../espressif/esp-idf/components/esptool_py/esptool/esptool.py -p (PORT) -b 460800 --before default_reset --after hard_reset --chip esp32 write_flash --flash_mode dio --flash_size detect --flash_freq 40m 0x1000 build/bootloader/bootloader.bin 0x8000 build/partition_table/partition-table.bin 0x10000 build/hello-world.bin

or run 'idf.py -p (PORT) flash'

Теперь, можем прошить полученное приложение на борт процессора esp. Порт, конечно, можно не указывать, но тогда idf.py начнёт перебирать все доступные порты. Лучше, idf.py -p /dev/ttyUSB0 flash

idf.py flash
Скрытый текст

~/Programs/esp32/hello_world $ idf.py -p /dev/ttyUSB0 flash

Executing action: flash

Running ninja in directory /home/denis/Programs/esp32/hello_world/build

Executing "ninja flash"...

[1/5] cd /home/denis/Programs/esp32/hello_world/build/esp-idf/esptool_py && /home/denis/.espressif/python_env/idf4.4_...32/hello_world/build/partition_table/partition-table.bin /home/denis/Programs/esp32/hello_world/build/hello-world.bin

hello-world.bin binary size 0x28eb0 bytes. Smallest app partition is 0x100000 bytes. 0xd7150 bytes (84%) free.

[2/5] Performing build step for 'bootloader'

[1/1] cd /home/denis/Programs/esp32/hello_world/build/bootloader/esp-idf/esptool_py && /home/denis/.espressif/python_env/idf4.4_py3.9_env/bin/python /home/denis/espressif/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x1000 /home/denis/Programs/esp32/hello_world/build/bootloader/bootloader.bin

Bootloader binary size 0x6330 bytes. 0xcd0 bytes (13%) free.

[2/3] cd /home/denis/espressif/esp-idf/components/esptool_py && /home/denis/.espressif/tools/cmake/3.20.3/bin/cmake -.../denis/Programs/esp32/hello_world/build" -P /home/denis/espressif/esp-idf/components/esptool_py/run_serial_tool.cmake

esptool.py esp32 -p /dev/ttyUSB0 -b 460800 --before=default_reset --after=hard_reset write_flash --flash_mode dio --flash_freq 40m --flash_size 2MB 0x1000 bootloader/bootloader.bin 0x10000 hello-world.bin 0x8000 partition_table/partition-table.bin

esptool.py v3.2-dev

Serial port /dev/ttyUSB0

Connecting....

Chip is ESP32-D0WDQ6 (revision 1)

Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None

Crystal is 40MHz

MAC: 08:3a:f2:a9:a8:c0

Uploading stub...

Running stub...

Stub running...

Changing baud rate to 460800

Changed.

Configuring flash size...

Flash will be erased from 0x00001000 to 0x00007fff...

Flash will be erased from 0x00010000 to 0x00038fff...

Flash will be erased from 0x00008000 to 0x00008fff...

Compressed 25392 bytes to 15839...

Writing at 0x00001000... (100 %)

Wrote 25392 bytes (15839 compressed) at 0x00001000 in 0.7 seconds (effective 297.5 kbit/s)...

Hash of data verified.

Compressed 167600 bytes to 88661...

Writing at 0x00010000... (16 %)

Writing at 0x0001ae43... (33 %)

Writing at 0x000205e9... (50 %)

Writing at 0x00025dcf... (66 %)

Writing at 0x0002e3d4... (83 %)

Writing at 0x000367a3... (100 %)

Wrote 167600 bytes (88661 compressed) at 0x00010000 in 2.3 seconds (effective 593.9 kbit/s)...

Hash of data verified.

Compressed 3072 bytes to 103...

Writing at 0x00008000... (100 %)

Wrote 3072 bytes (103 compressed) at 0x00008000 in 0.0 seconds (effective 546.2 kbit/s)...

Hash of data verified.

Leaving...

Hard resetting via RTS pin...

Done

Осталось запустить мониторинг работы программы:

idf.py -p /dev/ttyUSB0 monitor
Скрытый текст

~/Programs/esp32/hello_world $ idf.py -p /dev/ttyUSB0 monitor 127 ↵

Executing action: monitor

Running idf_monitor in directory /home/denis/Programs/esp32/hello_world

Executing "/home/denis/.espressif/python_env/idf4.4_py3.9_env/bin/python /home/denis/espressif/esp-idf/tools/idf_monitor.py -p /dev/ttyUSB0 -b 115200 --toolchain-prefix xtensa-esp32-elf- --target esp32 --revision 0 /home/denis/Programs/esp32/hello_world/build/hello-world.elf -m '/home/denis/.espressif/python_env/idf4.4_py3.9_env/bin/python' '/home/denis/espressif/esp-idf/tools/idf.py' '-p' '/dev/ttyUSB0'"...

--- idf_monitor on /dev/ttyUSB0 115200 ---

--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---

ets Jun 8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)

configsip: 0, SPIWP:0xee

clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00

mode:DIO, clock div:2

load:0x3fff0030,len:6724

load:0x40078000,len:14780

load:0x40080400,len:3792

0x40080400: _init at ??:?

entry 0x40080694

I (27) boot: ESP-IDF v4.4-dev-2740-gf65c8249af 2nd stage bootloader

I (27) boot: compile time 23:51:51

I (27) boot: chip revision: 1

I (32) boot_comm: chip revision: 1, min. bootloader chip revision: 0

I (39) boot.esp32: SPI Speed : 40MHz

I (43) boot.esp32: SPI Mode : DIO

I (48) boot.esp32: SPI Flash Size : 2MB

I (52) boot: Enabling RNG early entropy source...

I (58) boot: Partition Table:

I (61) boot: ## Label Usage Type ST Offset Length

I (69) boot: 0 nvs WiFi data 01 02 00009000 00006000

I (76) boot: 1 phy_init RF data 01 01 0000f000 00001000

I (84) boot: 2 factory factory app 00 00 00010000 00100000

I (91) boot: End of partition table

I (95) boot_comm: chip revision: 1, min. application chip revision: 0

I (102) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=07444h ( 29764) map

I (122) esp_image: segment 1: paddr=0001746c vaddr=3ffb0000 size=0236ch ( 9068) load

I (126) esp_image: segment 2: paddr=000197e0 vaddr=40080000 size=06838h ( 26680) load

I (139) esp_image: segment 3: paddr=00020020 vaddr=400d0020 size=147f8h ( 83960) map

I (169) esp_image: segment 4: paddr=00034820 vaddr=40086838 size=04650h ( 18000) load

I (177) esp_image: segment 5: paddr=00038e78 vaddr=50000000 size=00010h ( 16) load

I (183) boot: Loaded app from partition at offset 0x10000

I (183) boot: Disabling RNG early entropy source...

I (198) cpu_start: Pro cpu up.

I (198) cpu_start: Starting app cpu, entry point is 0x40080fc4

0x40080fc4: call_start_cpu1 at /home/denis/espressif/esp-idf/components/esp_system/port/cpu_start.c:156

I (0) cpu_start: App cpu up.

I (212) cpu_start: Pro cpu start user code

I (212) cpu_start: cpu freq: 160000000

I (212) cpu_start: Application information:

I (217) cpu_start: Project name: hello-world

I (222) cpu_start: App version: 1

I (227) cpu_start: Compile time: Aug 24 2021 23:51:46

I (233) cpu_start: ELF file SHA256: e60ccc33c95bd333...

I (239) cpu_start: ESP-IDF: v4.4-dev-2740-gf65c8249af

I (245) heap_init: Initializing. RAM available for dynamic allocation:

I (253) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM

I (259) heap_init: At 3FFB2C48 len 0002D3B8 (180 KiB): DRAM

I (265) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM

I (271) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM

I (278) heap_init: At 4008AE88 len 00015178 (84 KiB): IRAM

I (285) spi_flash: detected chip: generic

I (288) spi_flash: flash io: dio

W (292) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.

I (307) cpu_start: Starting scheduler on PRO CPU.

I (0) cpu_start: Starting scheduler on APP CPU.

Hello world!

This is esp32 chip with 2 CPU core(s), WiFi/BT/BLE, silicon revision 1, 2MB external flash

Minimum free heap size: 294448 bytes

Restarting in 10 seconds...

Restarting in 9 seconds...

Restarting in 8 seconds...

Restarting in 7 seconds...

Restarting in 6 seconds...

Restarting in 5 seconds...

Restarting in 4 seconds...

Restarting in 3 seconds...

Restarting in 2 seconds...

Restarting in 1 seconds...

Restarting in 0 seconds...

Restarting now.

ets Jun 8 2016 00:22:57

Т.е., программа «Здравствуй Мир!» считывает параметры MCU, печатает их и начинает обратный отсчёт с периодом в одну секунду. Когда доходит до нуля, перезагружает процессор.

У утилиты idf.py есть ещё несколько полезных параметров. Вы их можете посмотреть, запустив

idf.py --help

Можете на них взглянуть, хотя, скорее всего, Вы уже установили программу

Скрытый текст

~/Programs/esp32/hello_world $ idf.py --help

Usage: idf.py [OPTIONS] COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]...

ESP-IDF CLI build management tool. For commands that are not known to idf.py an attempt to execute it as a build system target will be

made.

Options:

--version Show IDF version and exit.

--list-targets Print list of supported targets and exit.

-C, --project-dir PATH Project directory.

-B, --build-dir PATH Build directory.

-w, --cmake-warn-uninitialized / -n, --no-warnings

                              Enable CMake uninitialized variable warnings for CMake files inside the project directory. (--no-

                              warnings is now the default, and doesn't need to be specified.) The default value can be set with the

                              IDF_CMAKE_WARN_UNINITIALIZED environment variable.

-v, --verbose Verbose build output.

--preview Enable IDF features that are still in preview.

--ccache / --no-ccache Use ccache in build. Disabled by default. The default value can be set with the IDF_CCACHE_ENABLE

                              environment variable.

-G, --generator [Ninja|Unix Makefiles]

                              CMake generator.

-D, --define-cache-entry TEXT Create a cmake cache entry. This option can be used at most once either globally, or for one subcommand.

-b, --baud INTEGER Baud rate for flashing. The default value can be set with the ESPBAUD environment variable. This option

                              can be used at most once either globally, or for one subcommand.

-p, --port TEXT Serial port. The default value can be set with the ESPPORT environment variable. This option can be used

                              at most once either globally, or for one subcommand.

--help Show this message and exit.

Commands:

add-dependency Add dependency to the manifest file. For now we only support adding dependencies on the default service.

all Aliases: build. Build the project.

app Build only the app.

app-flash Flash the app only.

bootloader Build only bootloader.

bootloader-flash Flash bootloader only.

build-system-targets Print list of build system targets.

clean Delete build output files from the build directory.

confserver Run JSON configuration server.

create-component Create a new component.

create-manifest Create manifest for specified component.

create-project Create a new project.

create-remote-component Register a new component on the component service.

delete-version Delete version in dist directory from the component service.

docs Open web browser with documentation for ESP-IDF

efuse_common_table Generate C-source for IDF's eFuse fields.

efuse_custom_table Generate C-source for user's eFuse fields.

encrypted-app-flash Flash the encrypted app only.

encrypted-flash Flash the encrypted project.

erase_flash Erase entire flash chip.

erase_otadata Erase otadata partition.

flash Flash the project.

fullclean Delete the entire build directory contents.

gdb Run the GDB.

gdbgui GDB UI in default browser.

gdbtui GDB TUI mode.

menuconfig Run "menuconfig" project configuration tool.

monitor Display serial output.

openocd Run openocd from current path

pack-component Create component archive.

partition_table Build only partition table.

partition_table-flash Flash partition table only.

post_debug Utility target to read the output of async debug action and stop them.

python-clean Delete generated Python byte code from the IDF directory

read_otadata Read otadata partition.

reconfigure Re-run CMake.

set-target Set the chip target to build.

show_efuse_table Print eFuse table.

size Print basic size information about the app.

size-components Print per-component size information.

size-files Print per-source-file size information.

uf2 Generate the UF2 binary with all the binaries included

uf2-app Generate an UF2 binary for the application only

upload-component Upload component in dist directory to the component service.

upload-component-status Check status of component upload

Windows

Обратите внимание, что %USERPROFILE% (Путь к домашнему каталогу пользователя) не должен содержать пробелов. Иначе, установка инструментария esp-idf просто не запустится. Если путь содержит пробелы, устанавливайте куда-нибудь ещё. Например, на другой диск или в корневой каталог диска C:\

Обычно, git.exe (https://git-scm.com/downloads) устанавливается в каталог %ProgramFiles%/git/bin. python.exe (на момент написания актуальна версия Python3.9 — https://www.python.org/downloads/, Обычно, находится в каталоге %ProgramFiles%/Python39 )

Не стоит устанавливать пакеты ninja и cmake. Пакет установки Windows «вытянет» сам нужные версии и установит их локально.

Необходимо сразу проверить, чтобы git и python были уже прописаны в Path. Можно глобально, можно локально:

Находим в настройках Windows изменение системных/пользовательских переменных среды
Находим в настройках Windows изменение системных/пользовательских переменных среды

Также, под Windows, можно сразу прописать переменную IDF_PATH. Обычно, устанавливаю esp-idf в %USERPROFILE%\espressif. Можно сразу добавить IDF_TOOLS_PATH. По умолчанию, esp-idf toolchain (инструментарий) установится в каталог %USERPROFILE%/.espressif. Для ускорения настройки vscode-esp-idf-extension можно ещё добавить переменную IDF_PATH_ENV_PATH — путь к каталогу, куда устанавливается python venv для работы esp-idf. На данный момент IDF_PYTHON_ENV_PATH=%USERPROFILE%\.espressif\python_env\idf4.4_py3.9_env. Проблема в том, что с каждой новой версией Python и ESP-IDF этот путь будет меняться.

Настраиваем переменные окружения для ESP-IDF, чтобы плагин VSCode мог бы «подхватить» уже настроенный пакет
Настраиваем переменные окружения для ESP-IDF, чтобы плагин VSCode мог бы «подхватить» уже настроенный пакет

Для установки под Windows можно использовать export.bat из Командной Строки (cmd.exe)

mkdir %USERPROFILE%\espressif
cd %USERPROFILE%\espressif
git clone https://github.com/espressif/esp-idf --recursive
.\install.bat

Равно, можно использовать установщик для PowerShell:

cd $env:USERPROFILE
mkdir espressif
git clone https://github.com/espressif/esp-idf.git --recursive
cd .\esp-idf\
.\install.ps1

Если получилось, увидим примерно следующее (вывод сокращён):

Скрытый текст

C:\Users\grand\esp32\hello_world>cd %USERPROFILE%\espressif\esp-idf

C:\Users\grand\espressif\esp-idf>install.bat

Installing ESP-IDF tools

Selected targets are: esp32s2, esp32c3, esp32, esp32s3

Installing tools: xtensa-esp32-elf, xtensa-esp32s2-elf, xtensa-esp32s3-elf, riscv32-esp-elf, esp32ulp-elf, esp32s2ulp-elf, cmake, openocd-esp32, ninja, idf-exe, ccache, dfu-util

Skipping xtensa-esp32-elf@esp-2021r1-8.4.0 (already installed)

Skipping xtensa-esp32s2-elf@esp-2021r1-8.4.0 (already installed)

Skipping xtensa-esp32s3-elf@esp-2021r1-8.4.0 (already installed)

Skipping riscv32-esp-elf@esp-2021r1-8.4.0 (already installed)

Skipping esp32ulp-elf@2.28.51-esp-20191205 (already installed)

Skipping esp32s2ulp-elf@2.28.51-esp-20191205 (already installed)

Skipping cmake@3.20.3 (already installed)

Skipping openocd-esp32@v0.10.0-esp32-20210721 (already installed)

Skipping ninja@1.10.2 (already installed)

Skipping idf-exe@1.0.1 (already installed)

Skipping ccache@4.3 (already installed)

Skipping dfu-util@0.9 (already installed)

Setting up Python environment

Python 3.9.6

pip 21.2.4 from C:\Users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages\pip (python 3.9)

Installing Python packages from C:\Users\grand\espressif\esp-idf\requirements.txt

Looking in indexes: https://pypi.org/simple, https://dl.espressif.com/pypi

Processing c:\users\grand\espressif\esp-idf\tools\kconfig_new\esp-windows-curses

DEPRECATION: A future pip version will change local packages to be built in-place without first copying to a temporary directory. We recommend you use --use-feature=in-tree-build to test your packages with this new behavior before it becomes the default.

pip 21.3 will remove support for this functionality. You can find discussion regarding this at https://github.com/pypa/pip/issues/7555.

Requirement already satisfied: setuptools>=21 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 4)) (57.4.0)

Requirement already satisfied: click>=7.0 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 8)) (8.0.1)

Requirement already satisfied: pyserial>=3.3 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 9)) (3.5)

Requirement already satisfied: future>=0.15.2 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 10)) (0.18.2)

Requirement already satisfied: cryptography>=2.1.4 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 11)) (3.4.7)

Requirement already satisfied: pyparsing<2.4.0,>=2.0.3 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 12)) (2.3.1)

Requirement already satisfied: pyelftools>=0.22 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 13)) (0.27)

Requirement already satisfied: gdbgui==0.13.2.0 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (0.13.2.0)

Requirement already satisfied: pygdbmi<=0.9.0.2 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 18)) (0.9.0.2)

Requirement already satisfied: python-socketio<5 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 21)) (4.6.1)

Requirement already satisfied: kconfiglib==13.7.1 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 23)) (13.7.1)

Requirement already satisfied: reedsolo<=1.5.4,>=1.5.3 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 26)) (1.5.4)

Requirement already satisfied: bitstring>=3.1.6 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 27)) (3.1.9)

Requirement already satisfied: ecdsa>=0.16.0 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 28)) (0.17.0)

Requirement already satisfied: construct==2.10.54 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 32)) (2.10.54)

Requirement already satisfied: Flask-SocketIO<3.0,>=2.9 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from gdbgui==0.13.2.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (2.9.6)

Requirement already satisfied: gevent<2.0,>=1.2.2 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from gdbgui==0.13.2.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (1.5.0)

Requirement already satisfied: Flask-Compress<2.0,>=1.4.0 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from gdbgui==0.13.2.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (1.10.1)

Requirement already satisfied: Pygments<3.0,>=2.2.0 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from gdbgui==0.13.2.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (2.10.0)

Requirement already satisfied: Flask<1.0,>=0.12.2 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from gdbgui==0.13.2.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (0.12.5)

Requirement already satisfied: colorama in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from click>=7.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 8)) (0.4.4)

Requirement already satisfied: cffi>=1.12 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from cryptography>=2.1.4->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 11)) (1.14.6)

Requirement already satisfied: six>=1.9.0 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from python-socketio<5->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 21)) (1.16.0)

Requirement already satisfied: python-engineio<4,>=3.13.0 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from python-socketio<5->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 21)) (3.14.2)

Requirement already satisfied: windows-curses in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from esp-windows-curses==0.1->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 38)) (2.2.0)

Requirement already satisfied: pycparser in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from cffi>=1.12->cryptography>=2.1.4->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 11)) (2.20)

Requirement already satisfied: itsdangerous>=0.21 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from Flask<1.0,>=0.12.2->gdbgui==0.13.2.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (2.0.1)

Requirement already satisfied: Werkzeug<1.0,>=0.7 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from Flask<1.0,>=0.12.2->gdbgui==0.13.2.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (0.16.1)

Requirement already satisfied: Jinja2>=2.4 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from Flask<1.0,>=0.12.2->gdbgui==0.13.2.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (3.0.1)

Requirement already satisfied: brotli in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from Flask-Compress<2.0,>=1.4.0->gdbgui==0.13.2.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (1.0.9)

Requirement already satisfied: greenlet>=0.4.14 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from gevent<2.0,>=1.2.2->gdbgui==0.13.2.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (1.1.1)

Requirement already satisfied: MarkupSafe>=2.0 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from Jinja2>=2.4->Flask<1.0,>=0.12.2->gdbgui==0.13.2.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (2.0.1)

Building wheels for collected packages: esp-windows-curses

Building wheel for esp-windows-curses (setup.py) ... done

Created wheel for esp-windows-curses: filename=esp_windows_curses-0.1-py3-none-any.whl size=1170 sha256=bdbf62d5861e86804fd97c0398bc76ab1a95cffea827b1215a340c406b564246

Stored in directory: c:\users\grand\appdata\local\pip\cache\wheels\c0\a0\63\a4fd89175a7346f567d984c78f1f3749b6e026098b0098ef22

Successfully built esp-windows-curses

Installing collected packages: esp-windows-curses

Attempting uninstall: esp-windows-curses

Found existing installation: esp-windows-curses 0.1

Uninstalling esp-windows-curses-0.1:

  Successfully uninstalled esp-windows-curses-0.1

Successfully installed esp-windows-curses-0.1

All done! You can now run:

export.bat

Теперь, нужно запустить export.bat:

Скрытый текст

C:\Users\grand\espressif\esp-idf>export.bat Setting IDF_PATH: C:\Users\grand\espressif\esp-idf

Adding ESP-IDF tools to PATH... No directories added to PATH:

C:\Users\grand.espressif\tools\xtensa-esp32-elf\esp-2021r1-8.4.0\xtensa-esp32-elf\bin;C:\Users\grand.espressif\tools\xtensa-esp32s2-elf\esp-2021r1-8.4.0\xtensa-esp32s2-elf\bin;C:\Users\grand.espressif\tools\xtensa-esp32s3-elf\esp-2021r1-8.4.0\xtensa-esp32s3-elf\bin;C:\Users\grand.espressif\tools\riscv32-esp-elf\esp-2021r1-8.4.0\riscv32-esp-elf\bin;C:\Users\grand.espressif\tools\esp32ulp-elf\2.28.51-esp-20191205\esp32ulp-elf-binutils\bin;C:\Users\grand.espressif\tools\esp32s2ulp-elf\2.28.51-esp-20191205\esp32s2ulp-elf-binutils\bin;C:\Users\grand.espressif\tools\cmake\3.20.3\bin;C:\Users\grand.espressif\tools\openocd-esp32\v0.10.0-esp32-20210721\openocd-esp32\bin;C:\Users\grand.espressif\tools\idf-exe\1.0.1;C:\Users\grand.espressif\tools\ccache\4.3\ccache-4.3-windows-64;C:\Users\grand.espressif\tools\dfu-util\0.9\dfu-util-0.9-win64;C:\Users\grand.espressif\python_env\idf4.4_py3.9_env\Scripts;C:\Users\grand\espressif\esp-idf\tools;C:\ActiveTcl\bin;C:\Program Files (x86)\Common Files\Intel\Shared Libraries\redist\intel64\compiler;C:\Program Files\Python39\Scripts;C:\Program Files\Python39;C:\Program Files\Common Files\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Program Files (x86)\Calibre2;C:\Program Files\PuTTY;C:\Program Files\MiKTeX\miktex\bin\x64;C:\Program Files\nodejs;C:\ProgramData\chocolatey\bin;C:\Program Files\Polyspace\R2021a\runtime\win64;C:\Program Files\Polyspace\R2021a\bin;C:\Program Files\Polyspace\R2021a\polyspace\bin;C:\Program Files\Microchip\xc8\v2.31\bin;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn;C:\Program Files (x86)\Microsoft SQL Server\120\Tools\Binn;C:\Program Files\Microsoft SQL Server\120\Tools\Binn;C:\Program Files\Microsoft SQL Server\120\DTS\Binn;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit;C:\Utils;C:\Program Files\dotnet;C:\Program Files\Python39;C:\Program Files\Notepad++;C:\Program Files\Git\cmd;C:\Users\grand\AppData\Local\Microsoft\WindowsApps;C:\Program Files\Python39;C:\Program Files\Git\bin;;C:\Users\grand\AppData\Local\Programs\Microsoft VS Code\bin

Checking if Python packages are up to date... Python requirements from C:\Users\grand\espressif\esp-idf\requirements.txt are satisfied.

Done! You can now compile ESP-IDF projects. Go to the project directory and run:

idf.py build

Или, если Вы используете PowerShell:

$env:USERPROFILE\espressif\esp-idf\install.ps1

По умолчанию toolchain установится в %USERPROFILE%\.espressif ($env:USERPROFILE\.espressif)

Не пропускаем предупреждение об обновлении Python Virtual Environment. Обновляем:

$env:USERPROFILE\.espressif\python_env\idf4.4_py3.9_env\Scripts\python.exe -m pip install --upgrade pip

Осталось сделать ярлыки для запуска среды консольной разработки. Открываем в проводнике. Правой кнопкой в проводникеSystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe (расположение по умолчанию). Правой кнопкой мыши вызываем «Создать ярлык». В свойствах ярлыка добавляем: "%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe" -noexit -ExecutionPolicy Bypass -File %USERPROFILE%\espressif\esp-idf\export.ps1. При желании можно поставить какую-нибудь красивую иконку.

Неплохо указать рабочий каталог. Например, "%USERPOFILE%\esp32"

Или тоже самое можно сделать для cmd.exe — правой кнопкой мыши на экране, «Создать ярлык», указать команду: %comspec% /k "%IDF_PATH%\export.bat". И, опять-таки, не забудьте установить путь к рабочему каталогу (Например, %USERPROFILE%\esp32) и можете поменять иконку.

Итак, после запуска консоли, мы получили приглашение к сборке проекта: idf.py build. т.е., если мы находимся в каталоге проекта, то можно его собрать и прошить Можно скопировать из примеров проект «hello world», скажем в каталог %USERPROFILE%\esp32\hello_world:

cd %USERPROFILE%
mkdir esp32
mkdir hello_world
copy  %USERPROFILE%\espressif\esp-idf\examples\get-started\hello_world %USERPROFILE%\esp32
cd .\esp32\hello_world
idf.py build
idf.py flash
idf.py monitor

Команда idf.py build строит проект, idf.py flash — прошивает устройство (плата уже должна быть подключена к компьютеру), idf.py — запускает монитор сообщений платы.

Если всё прошло успешно, увидим что-то вроде:

Скрытый текст

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)

configsip: 0, SPIWP:0xee

clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00

mode:DIO, clock div:2

load:0x3fff0030,len:6388

load:0x40078000,len:14252

load:0x40080400,len:3820

0x40080400: _init at ??:?

entry 0x40080698

I (27) boot: ESP-IDF v4.4-dev-2594-ga20df743f1 2nd stage bootloader

I (27) boot: compile time 23:44:15

I (27) boot: chip revision: 1

I (31) boot_comm: chip revision: 1, min. bootloader chip revision: 0

I (39) boot.esp32: SPI Speed : 40MHz

I (43) boot.esp32: SPI Mode : DIO

I (48) boot.esp32: SPI Flash Size : 2MB

I (52) boot: Enabling RNG early entropy source...

I (58) boot: Partition Table:

I (61) boot: ## Label Usage Type ST Offset Length

I (69) boot: 0 nvs WiFi data 01 02 00009000 00006000

I (76) boot: 1 phy_init RF data 01 01 0000f000 00001000

I (83) boot: 2 factory factory app 00 00 00010000 00100000

I (91) boot: End of partition table

I (95) boot_comm: chip revision: 1, min. application chip revision: 0

I (102) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=073dch ( 29660) map

I (122) esp_image: segment 1: paddr=00017404 vaddr=3ffb0000 size=0236ch ( 9068) load

I (125) esp_image: segment 2: paddr=00019778 vaddr=40080000 size=068a0h ( 26784) load

I (139) esp_image: segment 3: paddr=00020020 vaddr=400d0020 size=14808h ( 83976) map

I (169) esp_image: segment 4: paddr=00034830 vaddr=400868a0 size=044e0h ( 17632) load

I (177) esp_image: segment 5: paddr=00038d18 vaddr=50000000 size=00010h ( 16) load

I (183) boot: Loaded app from partition at offset 0x10000

I (183) boot: Disabling RNG early entropy source...

I (198) cpu_start: Pro cpu up.

I (198) cpu_start: Starting app cpu, entry point is 0x40080fb4

0x40080fb4: call_start_cpu1 at C:/Users/grand/espressif/esp-idf/components/esp_system/port/cpu_start.c:156

I (185) cpu_start: App cpu up.

I (213) cpu_start: Pro cpu start user code

I (213) cpu_start: cpu freq: 160000000

I (213) cpu_start: Application information:

I (217) cpu_start: Project name: hello-world

I (222) cpu_start: App version: 1

I (227) cpu_start: Compile time: Aug 24 2021 23:44:00

I (233) cpu_start: ELF file SHA256: 64100d65401fe87b...

I (239) cpu_start: ESP-IDF: v4.4-dev-2594-ga20df743f1

I (246) heap_init: Initializing. RAM available for dynamic allocation:

I (253) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM

I (259) heap_init: At 3FFB2C48 len 0002D3B8 (180 KiB): DRAM

I (265) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM

I (271) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM

I (278) heap_init: At 4008AD80 len 00015280 (84 KiB): IRAM

I (285) spi_flash: detected chip: generic

I (289) spi_flash: flash io: dio

W (293) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.

I (307) cpu_start: Starting scheduler on PRO CPU.

I (0) cpu_start: Starting scheduler on APP CPU.

Hello world!

This is esp32 chip with 2 CPU core(s), WiFi/BT/BLE, silicon revision 1, 2MB external flash

Minimum free heap size: 294448 bytes

Restarting in 10 seconds...

C:\Users\grand\esp32\hello_world>

Т.е. выводится информация о процессоре, дальше запускается обратный отсчёт от 10 до 0 и процессор перезапускается.

Сам код программы Вы можете посмотреть в %USERPROFILE%\esp32\hello_world\main\hello_world_main.c

Система мониторинга Esp32 настолько мощная, что в использовании отладчика, как правило нет необходимости. Впрочем, что выгодно отличает Esp32 от собратьев STM32 или ATmega, это дешевизна отладчика. Бюджетная плата FT2232HL обойдётся в районе одной тысячи рублей.

В принципе, если не претендовать на полнофункциональную Интегрированную Среду Разработки, фреймворк готов к работе. Редактировать исходный код примера ~/espressif/esp-idf/examples/get-started/hello_world/main/hello_world_main.c можно хоть при помощи того же notepad++.

В этом нет необходимости. esp-idf прекрасно «сотрудничает» с Visual Studio Code и Eclipse.

Часть II. Установка Visual Studio Code

Если Вы не установили VSCode глобально при помощи какого-нибудь пакетного менеджера, стоит скачать дистрибутив c https://code.visualstudio.com/download.

Под Windows, качаем User/System Installer. Я предпочитаю User Installer, чтобы VSCode установилась в %USERPROFILE%. Увы, здесь трюк с «подхватыванием» переменных окружения из Командной Строки не пройдёт. Поэтому, надо, чтобы были установлены переменные окружения IDF_PATH=%USERPROFILE%\espressif\esp-idf и IDF_PYTHON_ENV_PATH=%USERPROFILE%\.espressif\python_env\idf4.4_py3.9_env

Эту переменную можно скопировать при помощи Ctrl+M, вызвав set в командной строке, после запуска скрипта %USERPROFILE%\espressif\esp-idf\export.bat

Будьте внимательны: обратные слэши в пути!

Для Linux скачиваем, например .tar.gz архив. Или устанавливаем из стандартного пакетного менеджера. Сейчас трудно найти сборку Linux, в которой не было бы в стандартной поставке Visual Studio Code.

Если скачан .tar.gz архив под Linux можем распаковать полученный архив code-stable-x64-xxxxxxxxx-.tar.gz архив куда-нибудь вроде каталога ~/IDE

mkdir ~/IDE
cd ~/IDE
cp ~/Загрузки/code-stable-x64-xxxxx.tar.gz ~/IDE/
tar -zxvf code-stable-x64.tar.gz 

В случае локальной установки, нужно сделать «мягкую» ссылку на ~/IDE/VSCode-linux-x64/bin/code в ~/.local/bin. Причём, ссылка должна быть именно «мягкой», иначе, code при вызове из командной строки будет искать сопутствующие библиотеки в каталоге вызова ~/.local/bin. Теперь, code можно вызвать из терминала из любого каталога.

ln -sf ~/IDE/VSCode-linux-x64/bin/code ~/.local/bin/

Если у вас установлена среда рабочего стола GNOME desktop и вы установились в локальный каталог пользователя, неплохо создать *.desktop файл в каталоге ~/.local/share/applications/vscode.desktop (видит только пользователь) или /usr/share/applications/vscode.desktop. Не забудьте заменить ${HOME} на путь к домашнему каталогу. destop переменных окружения не понимает! Если установка была сделана из пакетного менеджера программ, этого делать не нужно.

[Desktop Entry]
Type=Application
Exec="${HOME}/IDE/VSCode-linux-x64/bin/code" %F
Name=VSCode
GenericName=The Microsoft IDE for C/C++, Javascript, Python e.t.c. development.
Icon=${HOME}/IDE/VSCode-linux-x64/resources/app/resources/linux/code.png
StartupWMClass=code
Terminal=false
Categories=Development;IDE;C/C++;Python;Java;Java Script;Node;NodeJS
MimeType=text/x-c++src;text/x-c++hdr;text/x-xsrc;application/x-designer;

Итак, если всё сделано правильно, то можно из любого каталога из терминала, где был запущен idfexp, запустить code. Важно, что code запускается из терминала, где экспортированы переменные окружения esp-idf.

. ~/espressif/esp-idf/export.sh
code 

или если настроен алиас:

idfexp && code

Далее, установка и настройка VSCode под Linux и Windows не будут отличаться.

Если в среде Linux или Windows настроен русский язык, VSCode запросит установку русскоязычного пакета. Можно установить. Ищем в списке расширений esp-idf и устанавливаем его.

Установка плагина Espressif IDF
Установка плагина Espressif IDF

Далее, нажимаем F1 и ищем команду «>ESP-IDF Настроить расширения ESP-IDF». Если всё было сделано правильно, увидим меню, которое будет предлагать «штатные» пути для установки (плагин будет устанавливать снова окружение eps-idf и инструментарий) и предложит использовать текущую установку esp-idf.

Выбираем «USE EXISTING SETUP»
Выбираем «USE EXISTING SETUP»

Если всё прошло удачно, увидим сообщение, что окружение Espressif IDF настроено:

Расширение Espressif IDF настроено
Расширение Espressif IDF настроено

Можем создавать новый проект. Это можно сделать через меню команд «F1»/«Ctrl+Shift+P»/«>ESP-IDF: Новый проект» или использовать «Ctrl+E N». Все команды плагина esp-idf начинаются на «Ctrl+E» (См. https://github.com/espressif/vscode-esp-idf-extension#Available-commands — список команд)

Создание нового проекта
Создание нового проекта

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

Осталось выбрать исходный шаблон. Сойдёт и простейший «template-app». Это уже знакомый нам «Hello World», считывающий параметры чипа, выводящий на экран некоторые из них и запускающий обратный отсчёт на десять секунд с последующей перезагрузкой Esp32.

Выбираем шаблон проекта
Выбираем шаблон проекта

Осталось нажать «Ctrl+E D» (собрать проект, прошить плату и запустить монитор). Видим знакомый журнал работы программы «Hello World!» с обратным отсчётом.

Монитор работы Esp32
Монитор работы Esp32

Выход из монитора, опять таки по сочетанию клавиш «Ctrl+]»

Можно, также создавать проекты, используя в качестве шаблонов, примеры, находящиеся в каталоге ~/espressif/esp-idf/examples. Для этого надо вызвать F1, и найти команду «>ESP-IDF: Показать примеры проектов». Правда, к сожалению, тут доступны далеко не все примеры.

Создание проекта из примера
Создание проекта из примера

Всё. Visual Studio Code — рабочая полноценная IDE для разработки Esp32 приложений. Вы можете использовать, к примеру, F2 для рефакторинга, F12 для перехода к исходному коду включаемых файлов, функций и т.д.

Eclipse

Установка Eclipse под Windows и Linux, вообще, не отличается. Качаем с https://www.eclipse.org/downloads/ установщик Eclipse. Под Windows и Linux должен быть установлен JDK: https://www.oracle.com/ru/java/technologies/javase-jdk16-downloads.html

Запускаем установщик и, если видим в правом верхнем углу восклицательный знак, обновляем установщик.

«Выбираем Eclipse IDE for C/C++ Developers». После установки открываем «Help/Market Place» и ищем «esp-idf». Устанавливаем. После перезагрузки Eclipse вызываем «Help/Download and configure ESP-IDF». Указываем, что используем существующий пакет esp-idf:

Указать путь к esp-idf
Указать путь к esp-idf

Единственная проблема в том, что Eclipse иногда почему-то не подхватывает пути к git или python. Но их несложно прописать вручную:

Указать пути к необходимым файлам (обычно приходится делать это вручную)
Указать пути к необходимым файлам (обычно приходится делать это вручную)

Если текущая среда разработки была интегрирована успешно, можем перейти к «File/New Project/Espressif IDF Project» (ещё можно создавать встраиваемые компоненты IDF)

Если после перехода к экрану нового проекта нажать «Next>» и выбрать «Create a project from using one of the templates», можно создать проект из одного из примеров, находящихся в esp-idf/expamles.

Чтобы собрать проект, необходимо в ESP-IDF тулбаре установить нужную архитектуру процессора (обычно, это esp32, а не esp32s2) и нажатием на шестерёнку настроек в выпадающем списке «on» указать порт прошивки.

Выбираем процессор
Выбираем процессор

Указываем порт прошивки нажатием на шестерёнку около выбранного процессора. Теперь, можно нажать «Run». Если всё прошло удачно, видим процесс прошивки. ESP-IDF Terminal запускается нажатием на иконку монитора на ESP-тулбаре

Включение Espressif IDF монитора
Включение Espressif IDF монитора

Нажатие «Ctrl+]» здесь не работает. Чтобы прекратить мониторинг приложения, нужно просто закрыть монитор.

Мониторинг приложения Espressif на Eclipse
Мониторинг приложения Espressif на Eclipse

Выводы

Espressif IDF — полноценный фреймворк разработки, подключаемый к IDE Visual Studio Code и Eclipse. И, увы, если бы не очень подробная документация и некоторое количество багов, возникающих с выпуском каждой новой версии, она бы вполне могла и должна была претендовать на звание «профессиональной».

Комментарии (10)


  1. Pafnutyi
    28.08.2021 23:30

    Самое странное: такой прекрасный чип, а кроме игрушек/розеток/датчиков на нём ничего дельного на рынке не присутствует... Первый вариант 8266 был безбожно глючный, счас вроде как исправились, но нет - кроме любителей альДурины пользовать этот чип желающих очереди особо не наблюдаются.


    1. Hisoka
      29.08.2021 00:43

      Вполне возможно, что всё из-за достаточно лёгкой перешиваемости модуля и отсутствия локов. Я вот точно не помню - а есть ли там хотя бы шифрование прошивки и хранение ключа в самом чипе. Если нет - вот и ответ, номер 1. Любой повторит схему и скопирует прошивку.

      Проблема номер 2 - китайский разработчик МК. Соответственно в основном это будут сами китайцы разрабатывать на этих МК.

      Жручесть данных МК, ещё. Хотя официально встречал ответ на форумах, что следующие МК будут уже на чём-то другом. Возможно или арм, или риск-в. Вот тогда, думается, может появиться интерес (особенно если риск-в)


      1. DCNick3
        29.08.2021 16:45

        В esp32 есть и Secure Boot, и шифрование прошивки, в esp8266 — нет


        1. Hisoka
          29.08.2021 19:30

          Вот как. Неплохо. Я ещё не добрался до 32, т.к. хватало мощности 8266. Но вот esp32-s2/3 хочу испробовать, т.к. хардварный usb.


          1. DCNick3
            29.08.2021 19:39

            А ещё очень похоже, что espressif подзабили на софтовую поддержку esp8266. По-идее в планах смержить его SDK с esp-idf, но сейчас он находится в каком-то лимбо с отдельным SDK, и неактуальными доками, но API похожим на esp-idf. Лучше к 8266 не лезть ИМХО


    1. AlanDrakes
      30.08.2021 07:07

      От использования esp8266 меня отталкивает их кривые фреймворки.
      Ситуация: Ставим VSCode и муравья (PlatformIO). Выбираем платформу espressif8266, плату esp07 (их есть у меня - пылились на полочке одно время, купленые рублей по 80 пару лет назад), и начинаем играть с фреймворками.
      > arduino - вроди бы собирается, но нет никаких подсказок в коде. Отлично. Serial и serial - разные вещи. Прекрасно. Попадается SERIAL. Хорошо, что редко. Запуск без WiFi вроди бы возможен, но непонятно как.
      > Rath-HAL - присутствует, но не поддерживает данный чип. Почему тогда присутствует?
      > esp8266-rtos-sdk - Отлично! Будем писать под RTOS! Спойлер: Нет. Пустой проект не собирается, т.к. не хватает каких-то исходников. Каких - не подсказывает.
      > esp-idf? Фигушки. Он есть у производителя чипов, но просто так подсунуть его к VSCode не выходит. Шикарно.
      > esp8266-nonos-sdk - Последний вариант из того, что компилится и работает. Пустой проект занимает 36% RAM и 61% ROM. Прекрасно. :\

      Немногим ранее баловался с ESP32 в той же IDE.
      Хочешь WiFi? Подключи вот эти файлы, сделай вот так. Обработка будет вот через эти функции.
      Не хочешь WiFi? Не вопрос. При компиляции они не будут добавлены в эту прошивку.
      Хочешь логи в консоль? Вот тебе функция, которая это делает. Она похожа на sprintf, только нужно указать какой тип сообщения отправляешь - лог, событие, ошибка и тому подобное. Вот примеры.
      У тебя есть экран? Легко. Настрой шину, настрой пины, пиши как в память. DMA тебе в помощь.

      Два контроллера разных поколений, а такая разница в кодовой базе.


      1. DedaPikhto Автор
        04.09.2021 17:56

        Фреймворк 8266 IMHO, не просто кривой, он категорически непонятный. А вот в том, что касается Esp32, ситуация чуть лучше. Но, увы, не поддерживается ассемблер (китайцы сами не в теме, как это всё работает) А если очень хочется, то см. Xtensa Instruction Set Architecture. Архитектура 1997 года. Чуть не старше Дурины.

        Короче, ситуация, действительно унылая. Но всё-таки... работает. И для сегмента DIY, более чем.


  1. jenya7
    04.09.2021 17:49

    У меня в Eclipse проект компилируется но когда я нажимаю на Run получаю сообщение -

    Exception occurred executing command line. Cannot run program "C:\cygwin64\bin\python" (in directory "D:\Workspace_Eclipse\agro_sense"): CreateProcess error=193, %1 is not a valid Win32 application

    Почему то при Run он ищет путь в C:\cygwin64\bin\python и как изменить настройки я не нашёл.


    1. DedaPikhto Автор
      07.09.2021 10:40

      Попробуйте Help->ESP-IDF Tool Manager->Install Tools. И укажите путь до Python явно. Должно сработать


  1. DedaPikhto Автор
    04.09.2021 17:50

    Хм... мне кажется, что причина в том, что Вы поставили cygwin python.