Чуть подробнее о настройке среды разработки esp-idf для разработки приложений Esp32

Введение

Почему, 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,0×9000,24K,

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

factory, app, factory,0×10000,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 0×8000 bootloader 0×1000 /home/denis/Programs/esp32/hello_world/build/bootloader/bootloader.bin

Bootloader binary size 0×6330 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 0×28eb0 bytes. Smallest app partition is 0×100000 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 0×1000 build/bootloader/bootloader.bin 0×8000 build/partition_table/partition-table.bin 0×10000 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 0×28eb0 bytes. Smallest app partition is 0×100000 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 0×8000 bootloader 0×1000 /home/denis/Programs/esp32/hello_world/build/bootloader/bootloader.bin

Bootloader binary size 0×6330 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 0×1000 bootloader/bootloader.bin 0×10000 hello-world.bin 0×8000 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 0×00001000 to 0×00007fff…

Flash will be erased from 0×00010000 to 0×00038fff…

Flash will be erased from 0×00008000 to 0×00008fff…

Compressed 25392 bytes to 15839…

Writing at 0×00001000… (100%)

Wrote 25392 bytes (15839 compressed) at 0×00001000 in 0.7 seconds (effective 297.5 kbit/s)…

Hash of data verified.

Compressed 167600 bytes to 88661…

Writing at 0×00010000… (16%)

Writing at 0×0001ae43… (33%)

Writing at 0×000205e9… (50%)

Writing at 0×00025dcf… (66%)

Writing at 0×0002e3d4… (83%)

Writing at 0×000367a3… (100%)

Wrote 167600 bytes (88661 compressed) at 0×00010000 in 2.3 seconds (effective 593.9 kbit/s)…

Hash of data verified.

Compressed 3072 bytes to 103…

Writing at 0×00008000… (100%)

Wrote 3072 bytes (103 compressed) at 0×00008000 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:0×1 (POWERON_RESET), boot:0×13 (SPI_FAST_FLASH_BOOT)

configsip: 0, SPIWP:0xee

clk_drv:0×00, q_drv:0×00, d_drv:0×00, cs0_drv:0×00, hd_drv:0×00, wp_drv:0×00

mode: DIO, clock div:2

load:0×3fff0030, len:6724

load:0×40078000, len:14780

load:0×40080400, len:3792

0×40080400: _init at?:?

entry 0×40080694

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 0×10000

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 0×40080fc4

0×40080fc4: 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 не стоит использовать PowerShell, поскольку, скрипт export.bat из пакета не сможет экспортировать переменные окружения.

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

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

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

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_curse

© Habrahabr.ru