Чуть подробнее о настройке среды разработки 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, можно сразу прописать переменную 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 мог бы «подхватить» уже настроенный пакет
Для установки под 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