Введение
Почему, ESP32?
Esp32 использует два процессора Xtensa с симметричной адресацией. Это разработка Гарварда, сделанная аж в 1997 году. Заявленная тактовая частота 240/160 МГц.
Частота таймеров 80 МГц
Очень низкое энергопотребление в режиме «глубокого сна» — аж 5-2,5 мкА.
Аналогичные по архитектуре модули STM32, скажем стоят значительно дороже. Да, 400 МГц, да отличная документация. Но, скажем процессор STM32F407 стоит около 1000 рублей на Алиэкспрессе.
И почти нет микропроцессоров, у которых были бы «на борту» Bluetooth и Wi-Fi стоимостью 150-200 рублей.
Удобные для любительской распайки модули с микропроцессором «на борту»
Почему esp-idf VSCode и Eclipse?
https://github.com/espressif/esp-idf
ESP-IDF позиционируется, как Espressif IoT Development Framework — Фреймворк разработки IoT (Интернет Вещей). Плата с процессором Esp32 вполне может стать объектом Интернета Вещей.
А так же, с этим фреймворком легко разрабатывать Bluetooth Low Energy устройства, которыми, скажем, можно легко управлять с мобильного телефона. Подключаться к WiFi и проводной сети Ethernet.
Да, цена входа для непрофессионального разработчика на Arduino IDE, значительно ниже. Для сегмента DIY (Самодельничество, или «сделай сам» (англ. DIY — Do It Yourself), — вид деятельности, при котором люди самостоятельно производят какие-либо изделия для собственного использования), более чем достаточно.
Но всегда же хочется большего, не правда ли? Примитивы FreeRTOS кажутся мне более понятными, логичными и простыми в использовании, чем void setup() и void loop(). Опять же, возможность обращения к LL функциям (Low Level Layer Function)
Так и не понял, можно ли «поднять» BLE GATT Server на Arduino IDE, но во фреймворке esp-idf он пишется почти элементарно.
Часть I. Консоль
Статей о настройке IDE Visual Studio Code и Eclipse под Linux и Windows написано уже много. В принципе, с точностью до небольших деталей, они повторяют друг-друга. Эта заметка не исключение.
Отличие лишь в том, что и Eclipse и Visual Studio Code будут использовать единожды установленные Espressif Framework и набор инструментов — toolchain. Раздражает, что каждая установка плагинов https://github.com/espressif/vscode-esp-idf-extension и https://github.com/espressif/idf-eclipse-plugin «тащит» за собой новую установку пакета ESP-IDF и TOOLCHAIN. Каждая установка в сумме, 3.3 Гб, между прочим.
Linux
Для примера, использую Ubuntu 21.04.
Во-первых, классическое начало для deb систем:
sudo apt update
sudo apt upgrade
sudo apt install python3-pip git cmake ninja-build
Ну или установить cmake и ninja, используя snap
Для полноценной работы esp-idf должны быть установлены git, python3 и pip3. Причём, надо, чтобы python вызывался, как python, а не python3 или python3.9 и т.д. Скажем, в Ubuntu 18.04, 20.10, 21.04 такой команды, как python изначально нет. Есть python3. Так, что надо либо сделать мягкую ссылку:
mkdir ~/.local/bin
ln -sf /usr/bin/python3 ~/.local/bin/python
source ~/.profile
Либо создать Python Virtual Environment (https://docs.python.org/3/tutorial/venv.html)
python3 -m venv ~/python/python3
code ~/python/python3/bin/activate
Последний способ чуть сложнее, но даже в создании мягкой ссылки есть забавный подвох: если Вы не создали каталог ~/.local/bin, то .profile его не «подхватит», потому, что в скрипте профиле есть такой код:
if [ -d "$HOME/.local/bin" ] ; then
PATH="$PATH:$HOME/.local/bin"
fi
Иными словами, если этот каталог не создан, его в пути и не будет. После создания каталога, нужно вызвать source ~/.profile
Проверим себя. Вызовем из терминала:
$python
Python 3.8.10 (default, Jun 2 2021, 10:49:15)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()
Всё работает. Скачиваем esp-idf. Предпочитаю установить фреймворк в какой-нибудь подкаталог домашеного каталога, вроде ~/espressif. Фреймворков Esp32, аж целых три — esp-adf, esp-idf, esp-mdf, так что, чтобы не засорять «корневое» пространство пользовательского каталога, сложим их в одну кучу. Имена каталогов верхних уровней не должны содержать пробелов.
mkdir ~/espressif
cd ~/espressif
git clone https://github.com/espressif/esp-idf.git --recursive
Имеет смысл сразу добавить в какой-нибудь из пользовательских .*rc-файлов загрузку переменных окружения esp-idf. Переменные ADF_PATH и MDF_PATH предусмотрены на тот случай, если Вы захотите работать на Esp32 со звуком или создавать самоорганизующиеся сети из нескольких плат Esp32.
Скрипт добавляет алиас idfexp. Так удобнее превращать текущую консоль в среду IDF-разработки, чтобы не набирать, скажем каждый раз ~/espressif/esp-idf/export.sh
# Скрипт для экспорта окружения esp-idf, esp-adf, esp-mdf
#
ESP_PATH="$HOME/espressif"
IDF_TOOLS_PATH="$HOME/.espressif"
if [ -d "$ESP_PATH/esp-idf" ] ; then
IDF_PATH="$ESP_PATH/esp-idf"
export IDF_PATH
if [ -f "$IDF_PATH/export.sh" ] ; then
alias idfexp="\. $IDF_PATH/export.sh"
fi
fi
if [ -f "$ESP_PATH/esp-adf" ] ; then
ADF_PATH="$ESP_PATH/esp-adf"
export ADF_PATH
fi
if [ -f "$ESP_PATH/esp-mdf" ] ; then
MDF_PATH="$ESP_PATH/esp-mdf"
export MDF_PATH
fi
if [ -d "$IDF_TOOLS_PATH" ] ; then
export IDF_TOOLS_PATH
fi
Можно добавить автоматическую загрузку скрипта через любой актуальный ~/.*rc-файл. Например, добавить в ~/.bashrc (\. необходим, поскольку, разрешения .*rc-файлов 0644):
if [ -f "$HOME/.idfrc" ]; then
\. "$HOME/.idfrc" # This load Espressif environment
fi
Далее, осталось установить набор инструментария для сборки проектов. По умолчанию toolchain будет установлен в ~/.espressif
cd ~/espressif/esp-idf
./install.sh
Если всё прошло удачно, то увидим что-то такое (журнал установки укорочен):
Скрытый текст
$ ./install.sh
WARNING: You are using pip version 21.2.3; however, version 21.2.4 is available. You should consider upgrading via the '/home/grandfatherpikhto/.espressif/python_env/idf4.4_py3.8_env/bin/python -m pip install --upgrade pip' command. All done! You can now run:
. ./export.sh
Обратите внимание, что предлагается обновить venv:
WARNING: You are using pip version 21.2.3; however, version 21.2.4 is available.
You should consider upgrading via the '/home/grandfatherpikhto/.espressif/python_env/idf4.4_py3.8_env/bin/python -m pip install --upgrade pip' command.
Обновляем:
~/.espressif/python_env/idf4.4_py3.8_env/bin/python -m pip install --upgrade pip pip
Размер esp-idf приблизительно 2.2 Гб, toolchain — 1.2 Гб. Ну, так на минуточку:
$du -hs ~/espressif/esp-idf
1.1G esp-idf
$du -hs ~/.espressif
1.9G .espressif
После установки toolchain можно вызвать source ~/.idfrc и подгрузить переменные окружения ESP-IDF командой idfexp или
. ~/espressif/esp-idf/export.sh
Если всё пошло правильно, должны увидеть что-то такое:
Скрытый текст
$ idfexp Detecting the Python interpreter Checking "python" ... Python 3.8.10 "python" has been detected Adding ESP-IDF tools to PATH... Using Python interpreter in /home/grandfatherpikhto/.espressif/python_env/idf4.4_py3.8_env/bin/python Checking if Python packages are up to date... Python requirements from /home/grandfatherpikhto/espressif/esp-idf/requirements.txt are satisfied. Added the following directories to PATH: /home/grandfatherpikhto/espressif/esp-idf/components/esptool_py/esptool /home/grandfatherpikhto/espressif/esp-idf/components/espcoredump /home/grandfatherpikhto/espressif/esp-idf/components/partition_table /home/grandfatherpikhto/espressif/esp-idf/components/app_update /home/grandfatherpikhto/.espressif/tools/xtensa-esp32-elf/esp-2021r1-8.4.0/xtensa-esp32-elf/bin /home/grandfatherpikhto/.espressif/tools/xtensa-esp32s2-elf/esp-2021r1-8.4.0/xtensa-esp32s2-elf/bin /home/grandfatherpikhto/.espressif/tools/xtensa-esp32s3-elf/esp-2021r1-8.4.0/xtensa-esp32s3-elf/bin /home/grandfatherpikhto/.espressif/tools/riscv32-esp-elf/esp-2021r1-8.4.0/riscv32-esp-elf/bin /home/grandfatherpikhto/.espressif/tools/esp32ulp-elf/2.28.51-esp-20191205/esp32ulp-elf-binutils/bin /home/grandfatherpikhto/.espressif/tools/esp32s2ulp-elf/2.28.51-esp-20191205/esp32s2ulp-elf-binutils/bin /home/grandfatherpikhto/.espressif/tools/openocd-esp32/v0.10.0-esp32-20210721/openocd-esp32/bin /home/grandfatherpikhto/.espressif/python_env/idf4.4_py3.8_env/bin /home/grandfatherpikhto/espressif/esp-idf/tools Done! You can now compile ESP-IDF projects. Go to the project directory and run:
idf.py build
В принципе, можно приступить к сборке и прошивке какого-нибудь проекта из каталога ~/espressif/esp-idf/examples, но сначала надо настроить udev — пакет управления устройствами для новых версий ядра Linux.
Ниже привожу «сборную солянку» файла 40-dfuse.rules из правил, которую удалось накопать на форуме Esp32 (https://www.esp32.com/). Думаю, в особых объяснениях этот файл не нуждается. Просто, коллекция idVendor и idProduct различных макетных плат Esp32. Обратите внимание, что расширение файла должно быть именно «rules». Иначе, udev не прочитает правила.
SUBSYSTEMS=="usb", ATTRS{idVendor}=="303a", ATTRS{idProduct}=="00??", GROUP="plugdev", MODE="0666"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6015", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1"
Обновляем правила:
sudo su
cp 40-dfuse.rules /etc/udev/rules.d/
systemctl restart udev.service
udevadm control --reload-rules
Теперь, можно собрать и запустить какой-нибудь простой проект Esp32. Не забудьте подключить макетную плату Esp32 к компьютеру. Если она уже была подключена, отключите и подключите снова. Иначе, правила udev не будут прочитаны для этого устройства.
У вашего покорного слуги наличествует макетная плата ESP32-WROOM. Попробуем собрать и прошить ~/espressif/esp-idf/examples/get-started/hello_world. Обратите внимание, что, в принципе надо указывать порт. Например, idf.py -p /dev/ttyUSB0 flash. Но, на самом деле, это не обязательно. idf.py попробует найти порт, к которому подключено устройство Esp32 и прошьёт первое обнаруженное.
Если всё получилось хорошо, увидим что-то вроде:
Скрытый текст
~/Programs/esp32/hello_world $ idf.py build
Executing action: all (aliases: build)
Running cmake in directory /home/denis/Programs/esp32/hello_world/build
Executing "cmake -G Ninja -DPYTHON_DEPS_CHECKED=1 -DESP_PLATFORM=1 -DCCACHE_ENABLE=0 /home/denis/Programs/esp32/hello_world"...
-- IDF_TARGET not set, using default target: esp32
-- Found Git: /usr/bin/git (found version "2.32.0")
-- The C compiler identification is GNU 8.4.0
-- The CXX compiler identification is GNU 8.4.0
-- The ASM compiler identification is GNU
-- Found assembler: /home/denis/.espressif/tools/xtensa-esp32-elf/esp-2021r1-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /home/denis/.espressif/tools/xtensa-esp32-elf/esp-2021r1-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /home/denis/.espressif/tools/xtensa-esp32-elf/esp-2021r1-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Project is not inside a git repository, or git repository has no commits; will not use 'git describe' to determine PROJECT_VER.
-- Building ESP-IDF components for target esp32
-- Project sdkconfig file /home/denis/Programs/esp32/hello_world/sdkconfig
-- Found PythonInterp: /home/denis/.espressif/python_env/idf4.4_py3.9_env/bin/python (found version "3.9.6")
-- Found Perl: /usr/bin/perl (found version "5.32.1")
-- App "hello-world" version: 1
-- Adding linker script /home/denis/Programs/esp32/hello_world/build/esp-idf/esp_system/ld/memory.ld
-- Adding linker script /home/denis/espressif/esp-idf/components/esp_system/ld/esp32/sections.ld.in
-- Adding linker script /home/denis/espressif/esp-idf/components/esp_rom/esp32/ld/esp32.rom.ld
-- Adding linker script /home/denis/espressif/esp-idf/components/esp_rom/esp32/ld/esp32.rom.api.ld
-- Adding linker script /home/denis/espressif/esp-idf/components/esp_rom/esp32/ld/esp32.rom.libgcc.ld
-- Adding linker script /home/denis/espressif/esp-idf/components/esp_rom/esp32/ld/esp32.rom.newlib-data.ld
-- Adding linker script /home/denis/espressif/esp-idf/components/esp_rom/esp32/ld/esp32.rom.syscalls.ld
-- Adding linker script /home/denis/espressif/esp-idf/components/esp_rom/esp32/ld/esp32.rom.newlib-funcs.ld
-- Adding linker script /home/denis/espressif/esp-idf/components/esp_rom/esp32/ld/esp32.rom.newlib-time.ld
-- Adding linker script /home/denis/espressif/esp-idf/components/soc/esp32/ld/esp32.peripherals.ld
-- Components: app_trace app_update asio bootloader bootloader_support bt cbor cmock coap console cxx driver efuse esp-tls esp32 esp_adc_cal esp_common esp_eth esp_event esp_gdbstub esp_hid esp_http_client esp_http_server esp_https_ota esp_https_server esp_hw_support esp_ipc esp_lcd esp_local_ctrl esp_netif esp_phy esp_pm esp_ringbuf esp_rom esp_serial_slave_link esp_system esp_timer esp_websocket_client esp_wifi espcoredump esptool_py expat fatfs freemodbus freertos hal heap idf_test ieee802154 jsmn json libsodium log lwip main mbedtls mdns mqtt newlib nghttp nvs_flash openssl openthread partition_table perfmon protobuf-c protocomm pthread sdmmc soc spi_flash spiffs tcp_transport tcpip_adapter tinyusb ulp unity usb vfs wear_levelling wifi_provisioning wpa_supplicant xtensa
-- Component paths: /home/denis/espressif/esp-idf/components/app_trace /home/denis/espressif/esp-idf/components/app_update /home/denis/espressif/esp-idf/components/asio /home/denis/espressif/esp-idf/components/bootloader /home/denis/espressif/esp-idf/components/bootloader_support /home/denis/espressif/esp-idf/components/bt /home/denis/espressif/esp-idf/components/cbor /home/denis/espressif/esp-idf/components/cmock /home/denis/espressif/esp-idf/components/coap /home/denis/espressif/esp-idf/components/console /home/denis/espressif/esp-idf/components/cxx /home/denis/espressif/esp-idf/components/driver /home/denis/espressif/esp-idf/components/efuse /home/denis/espressif/esp-idf/components/esp-tls /home/denis/espressif/esp-idf/components/esp32 /home/denis/espressif/esp-idf/components/esp_adc_cal /home/denis/espressif/esp-idf/components/esp_common /home/denis/espressif/esp-idf/components/esp_eth /home/denis/espressif/esp-idf/components/esp_event /home/denis/espressif/esp-idf/components/esp_gdbstub /home/denis/espressif/esp-idf/components/esp_hid /home/denis/espressif/esp-idf/components/esp_http_client /home/denis/espressif/esp-idf/components/esp_http_server /home/denis/espressif/esp-idf/components/esp_https_ota /home/denis/espressif/esp-idf/components/esp_https_server /home/denis/espressif/esp-idf/components/esp_hw_support /home/denis/espressif/esp-idf/components/esp_ipc /home/denis/espressif/esp-idf/components/esp_lcd /home/denis/espressif/esp-idf/components/esp_local_ctrl /home/denis/espressif/esp-idf/components/esp_netif /home/denis/espressif/esp-idf/components/esp_phy /home/denis/espressif/esp-idf/components/esp_pm /home/denis/espressif/esp-idf/components/esp_ringbuf /home/denis/espressif/esp-idf/components/esp_rom /home/denis/espressif/esp-idf/components/esp_serial_slave_link /home/denis/espressif/esp-idf/components/esp_system /home/denis/espressif/esp-idf/components/esp_timer /home/denis/espressif/esp-idf/components/esp_websocket_client /home/denis/espressif/esp-idf/components/esp_wifi /home/denis/espressif/esp-idf/components/espcoredump /home/denis/espressif/esp-idf/components/esptool_py /home/denis/espressif/esp-idf/components/expat /home/denis/espressif/esp-idf/components/fatfs /home/denis/espressif/esp-idf/components/freemodbus /home/denis/espressif/esp-idf/components/freertos /home/denis/espressif/esp-idf/components/hal /home/denis/espressif/esp-idf/components/heap /home/denis/espressif/esp-idf/components/idf_test /home/denis/espressif/esp-idf/components/ieee802154 /home/denis/espressif/esp-idf/components/jsmn /home/denis/espressif/esp-idf/components/json /home/denis/espressif/esp-idf/components/libsodium /home/denis/espressif/esp-idf/components/log /home/denis/espressif/esp-idf/components/lwip /home/denis/Programs/esp32/hello_world/main /home/denis/espressif/esp-idf/components/mbedtls /home/denis/espressif/esp-idf/components/mdns /home/denis/espressif/esp-idf/components/mqtt /home/denis/espressif/esp-idf/components/newlib /home/denis/espressif/esp-idf/components/nghttp /home/denis/espressif/esp-idf/components/nvs_flash /home/denis/espressif/esp-idf/components/openssl /home/denis/espressif/esp-idf/components/openthread /home/denis/espressif/esp-idf/components/partition_table /home/denis/espressif/esp-idf/components/perfmon /home/denis/espressif/esp-idf/components/protobuf-c /home/denis/espressif/esp-idf/components/protocomm /home/denis/espressif/esp-idf/components/pthread /home/denis/espressif/esp-idf/components/sdmmc /home/denis/espressif/esp-idf/components/soc /home/denis/espressif/esp-idf/components/spi_flash /home/denis/espressif/esp-idf/components/spiffs /home/denis/espressif/esp-idf/components/tcp_transport /home/denis/espressif/esp-idf/components/tcpip_adapter /home/denis/espressif/esp-idf/components/tinyusb /home/denis/espressif/esp-idf/components/ulp /home/denis/espressif/esp-idf/components/unity /home/denis/espressif/esp-idf/components/usb /home/denis/espressif/esp-idf/components/vfs /home/denis/espressif/esp-idf/components/wear_levelling /home/denis/espressif/esp-idf/components/wifi_provisioning /home/denis/espressif/esp-idf/components/wpa_supplicant /home/denis/espressif/esp-idf/components/xtensa
-- Configuring done
-- Generating done
-- Build files have been written to: /home/denis/Programs/esp32/hello_world/build
Running ninja in directory /home/denis/Programs/esp32/hello_world/build
Executing "ninja all"...
[8/994] Generating ../../partition_table/partition-table.bin
Partition table binary generated. Contents:
ESP-IDF Partition Table
Name, Type, SubType, Offset, Size, Flags
nvs,data,nvs,0x9000,24K,
phy_init,data,phy,0xf000,4K,
factory,app,factory,0x10000,1M,
[210/994] Performing configure step for 'bootloader'
-- Found Git: /usr/bin/git (found version "2.32.0")
-- The C compiler identification is GNU 8.4.0
-- The CXX compiler identification is GNU 8.4.0
-- The ASM compiler identification is GNU
-- Found assembler: /home/denis/.espressif/tools/xtensa-esp32-elf/esp-2021r1-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /home/denis/.espressif/tools/xtensa-esp32-elf/esp-2021r1-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /home/denis/.espressif/tools/xtensa-esp32-elf/esp-2021r1-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Building ESP-IDF components for target esp32
-- Project sdkconfig file /home/denis/Programs/esp32/hello_world/sdkconfig
-- Adding linker script /home/denis/espressif/esp-idf/components/soc/esp32/ld/esp32.peripherals.ld
-- Adding linker script /home/denis/espressif/esp-idf/components/esp_rom/esp32/ld/esp32.rom.ld
-- Adding linker script /home/denis/espressif/esp-idf/components/esp_rom/esp32/ld/esp32.rom.api.ld
-- Adding linker script /home/denis/espressif/esp-idf/components/esp_rom/esp32/ld/esp32.rom.libgcc.ld
-- Adding linker script /home/denis/espressif/esp-idf/components/esp_rom/esp32/ld/esp32.rom.newlib-funcs.ld
-- Adding linker script /home/denis/espressif/esp-idf/components/bootloader/subproject/main/ld/esp32/bootloader.ld
-- Adding linker script /home/denis/espressif/esp-idf/components/bootloader/subproject/main/ld/esp32/bootloader.rom.ld
-- Components: bootloader bootloader_support efuse esp32 esp_common esp_hw_support esp_rom esp_system esptool_py freertos hal log main micro-ecc newlib partition_table soc spi_flash xtensa
-- Component paths: /home/denis/espressif/esp-idf/components/bootloader /home/denis/espressif/esp-idf/components/bootloader_support /home/denis/espressif/esp-idf/components/efuse /home/denis/espressif/esp-idf/components/esp32 /home/denis/espressif/esp-idf/components/esp_common /home/denis/espressif/esp-idf/components/esp_hw_support /home/denis/espressif/esp-idf/components/esp_rom /home/denis/espressif/esp-idf/components/esp_system /home/denis/espressif/esp-idf/components/esptool_py /home/denis/espressif/esp-idf/components/freertos /home/denis/espressif/esp-idf/components/hal /home/denis/espressif/esp-idf/components/log /home/denis/espressif/esp-idf/components/bootloader/subproject/main /home/denis/espressif/esp-idf/components/bootloader/subproject/components/micro-ecc /home/denis/espressif/esp-idf/components/newlib /home/denis/espressif/esp-idf/components/partition_table /home/denis/espressif/esp-idf/components/soc /home/denis/espressif/esp-idf/components/spi_flash /home/denis/espressif/esp-idf/components/xtensa
-- Configuring done
-- Generating done
-- Build files have been written to: /home/denis/Programs/esp32/hello_world/build/bootloader
[272/994] Performing build step for 'bootloader'
[1/95] Generating project_elf_src_esp32.c
[2/95] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32/esp_efuse_table.c.obj
[3/95] Building C object CMakeFiles/bootloader.elf.dir/project_elf_src_esp32.c.obj
[4/95] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mpu_hal.c.obj
[5/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/lldesc.c.obj
[6/95] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/cpu_hal.c.obj
[7/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/adc_periph.c.obj
[8/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/soc_include_legacy_warn.c.obj
[9/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/dac_periph.c.obj
[10/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/i2c_periph.c.obj
[11/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/i2s_periph.c.obj
[12/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/gpio_periph.c.obj
[13/95] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/wdt_hal_iram.c.obj
[14/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/interrupts.c.obj
[15/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/lcd_periph.c.obj
[16/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/rmt_periph.c.obj
[17/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/ledc_periph.c.obj
[18/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/mcpwm_periph.c.obj
[19/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/rtc_io_periph.c.obj
[20/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/sdmmc_periph.c.obj
[21/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/pcnt_periph.c.obj
[22/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/sigmadelta_periph.c.obj
[23/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/sdio_slave_periph.c.obj
[24/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/timer_periph.c.obj
[25/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/uart_periph.c.obj
[26/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/spi_periph.c.obj
[27/95] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32/touch_sensor_periph.c.obj
[28/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_clock_init.c.obj
[29/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common_loader.c.obj
[30/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_mem.c.obj
[31/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common.c.obj
[32/95] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/esp32/spi_flash_rom_patch.c.obj
[33/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random.c.obj
[34/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random_esp32.c.obj
[35/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_flash.c.obj
[36/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_partitions.c.obj
[37/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/secure_boot.c.obj
[38/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_encrypt.c.obj
[39/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_qio_mode.c.obj
[40/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_efuse_esp32.c.obj
[41/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_utility.c.obj
[42/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_flash_config_esp32.c.obj
[43/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_console_loader.c.obj
[44/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_init.c.obj
[45/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp_image_format.c.obj
[46/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_clock_loader.c.obj
[47/95] Building C object esp-idf/micro-ecc/CMakeFiles/__idf_micro-ecc.dir/uECC_verify_antifault.c.obj
[48/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_panic.c.obj
[49/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_console.c.obj
[50/95] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32/esp_efuse_fields.c.obj
[51/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32/bootloader_sha.c.obj
[52/95] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32/esp_efuse_utility.c.obj
[53/95] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_api_key_esp32.c.obj
[54/95] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_api.c.obj
[55/95] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_fields.c.obj
[56/95] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_err.c.obj
[57/95] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/compare_set.c.obj
[58/95] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32/bootloader_esp32.c.obj
[59/95] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_utility.c.obj
[60/95] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32/rtc_clk_init.c.obj
[61/95] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32/rtc_pm.c.obj
[62/95] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/cpu_util.c.obj
[63/95] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32/rtc_init.c.obj
[64/95] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32/chip_info.c.obj
[65/95] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32/rtc_sleep.c.obj
[66/95] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/eri.c.obj
[67/95] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32/rtc_wdt.c.obj
[68/95] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_crc.c.obj
[69/95] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xt_trax.c.obj
[70/95] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_longjmp.S.obj
[71/95] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_sys.c.obj
[72/95] Building C object esp-idf/esp_common/CMakeFiles/__idf_esp_common.dir/src/esp_err_to_name.c.obj
[73/95] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_uart.c.obj
[74/95] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32/rtc_time.c.obj
[75/95] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/bootloader_start.c.obj
[76/95] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/log_noos.c.obj
[77/95] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/log_buffers.c.obj
[78/95] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/log.c.obj
[79/95] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32/rtc_clk.c.obj
[80/95] Linking C static library esp-idf/log/liblog.a
[81/95] Linking C static library esp-idf/esp_rom/libesp_rom.a
[82/95] Linking C static library esp-idf/esp_common/libesp_common.a
[83/95] Linking C static library esp-idf/xtensa/libxtensa.a
[84/95] Linking C static library esp-idf/esp_hw_support/libesp_hw_support.a
[85/95] Linking C static library esp-idf/esp_system/libesp_system.a
[86/95] Linking C static library esp-idf/efuse/libefuse.a
[87/95] Linking C static library esp-idf/bootloader_support/libbootloader_support.a
[88/95] Linking C static library esp-idf/spi_flash/libspi_flash.a
[89/95] Linking C static library esp-idf/micro-ecc/libmicro-ecc.a
[90/95] Linking C static library esp-idf/soc/libsoc.a
[91/95] Linking C static library esp-idf/hal/libhal.a
[92/95] Linking C static library esp-idf/main/libmain.a
[93/95] Linking C executable bootloader.elf
[94/95] Generating binary image from built executable
esptool.py v3.2-dev
Merged 1 ELF section
Generated /home/denis/Programs/esp32/hello_world/build/bootloader/bootloader.bin
[95/95] cd /home/denis/Programs/esp32/hello_world/build/bootloader/esp-idf/esptool_py && /home/denis/.espressif/python_env/idf4.4_py3.9_env/bin/python /home/denis/espressif/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x1000 /home/denis/Programs/esp32/hello_world/build/bootloader/bootloader.bin
Bootloader binary size 0x6330 bytes. 0xcd0 bytes (13%) free.
[993/994] Generating binary image from built executable
esptool.py v3.2-dev
Merged 2 ELF sections
Generated /home/denis/Programs/esp32/hello_world/build/hello-world.bin
[994/994] cd /home/denis/Programs/esp32/hello_world/build/esp-idf/esptool_py && /home/denis/.espressif/python_env/idf...32/hello_world/build/partition_table/partition-table.bin /home/denis/Programs/esp32/hello_world/build/hello-world.bin
hello-world.bin binary size 0x28eb0 bytes. Smallest app partition is 0x100000 bytes. 0xd7150 bytes (84%) free.
Project build complete. To flash, run this command:
/home/denis/.espressif/python_env/idf4.4_py3.9_env/bin/python ../../../espressif/esp-idf/components/esptool_py/esptool/esptool.py -p (PORT) -b 460800 --before default_reset --after hard_reset --chip esp32 write_flash --flash_mode dio --flash_size detect --flash_freq 40m 0x1000 build/bootloader/bootloader.bin 0x8000 build/partition_table/partition-table.bin 0x10000 build/hello-world.bin
or run 'idf.py -p (PORT) flash'
Теперь, можем прошить полученное приложение на борт процессора esp. Порт, конечно, можно не указывать, но тогда idf.py начнёт перебирать все доступные порты. Лучше, idf.py -p /dev/ttyUSB0 flash
idf.py flash
Скрытый текст
~/Programs/esp32/hello_world $ idf.py -p /dev/ttyUSB0 flash
Executing action: flash
Running ninja in directory /home/denis/Programs/esp32/hello_world/build
Executing "ninja flash"...
[1/5] cd /home/denis/Programs/esp32/hello_world/build/esp-idf/esptool_py && /home/denis/.espressif/python_env/idf4.4_...32/hello_world/build/partition_table/partition-table.bin /home/denis/Programs/esp32/hello_world/build/hello-world.bin
hello-world.bin binary size 0x28eb0 bytes. Smallest app partition is 0x100000 bytes. 0xd7150 bytes (84%) free.
[2/5] Performing build step for 'bootloader'
[1/1] cd /home/denis/Programs/esp32/hello_world/build/bootloader/esp-idf/esptool_py && /home/denis/.espressif/python_env/idf4.4_py3.9_env/bin/python /home/denis/espressif/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x1000 /home/denis/Programs/esp32/hello_world/build/bootloader/bootloader.bin
Bootloader binary size 0x6330 bytes. 0xcd0 bytes (13%) free.
[2/3] cd /home/denis/espressif/esp-idf/components/esptool_py && /home/denis/.espressif/tools/cmake/3.20.3/bin/cmake -.../denis/Programs/esp32/hello_world/build" -P /home/denis/espressif/esp-idf/components/esptool_py/run_serial_tool.cmake
esptool.py esp32 -p /dev/ttyUSB0 -b 460800 --before=default_reset --after=hard_reset write_flash --flash_mode dio --flash_freq 40m --flash_size 2MB 0x1000 bootloader/bootloader.bin 0x10000 hello-world.bin 0x8000 partition_table/partition-table.bin
esptool.py v3.2-dev
Serial port /dev/ttyUSB0
Connecting....
Chip is ESP32-D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 08:3a:f2:a9:a8:c0
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Flash will be erased from 0x00001000 to 0x00007fff...
Flash will be erased from 0x00010000 to 0x00038fff...
Flash will be erased from 0x00008000 to 0x00008fff...
Compressed 25392 bytes to 15839...
Writing at 0x00001000... (100 %)
Wrote 25392 bytes (15839 compressed) at 0x00001000 in 0.7 seconds (effective 297.5 kbit/s)...
Hash of data verified.
Compressed 167600 bytes to 88661...
Writing at 0x00010000... (16 %)
Writing at 0x0001ae43... (33 %)
Writing at 0x000205e9... (50 %)
Writing at 0x00025dcf... (66 %)
Writing at 0x0002e3d4... (83 %)
Writing at 0x000367a3... (100 %)
Wrote 167600 bytes (88661 compressed) at 0x00010000 in 2.3 seconds (effective 593.9 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 103...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (103 compressed) at 0x00008000 in 0.0 seconds (effective 546.2 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...
Done
Осталось запустить мониторинг работы программы:
idf.py -p /dev/ttyUSB0 monitor
Скрытый текст
~/Programs/esp32/hello_world $ idf.py -p /dev/ttyUSB0 monitor 127 ↵
Executing action: monitor
Running idf_monitor in directory /home/denis/Programs/esp32/hello_world
Executing "/home/denis/.espressif/python_env/idf4.4_py3.9_env/bin/python /home/denis/espressif/esp-idf/tools/idf_monitor.py -p /dev/ttyUSB0 -b 115200 --toolchain-prefix xtensa-esp32-elf- --target esp32 --revision 0 /home/denis/Programs/esp32/hello_world/build/hello-world.elf -m '/home/denis/.espressif/python_env/idf4.4_py3.9_env/bin/python' '/home/denis/espressif/esp-idf/tools/idf.py' '-p' '/dev/ttyUSB0'"...
--- idf_monitor on /dev/ttyUSB0 115200 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
ets Jun 8 2016 00:22:57
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:6724
load:0x40078000,len:14780
load:0x40080400,len:3792
0x40080400: _init at ??:?
entry 0x40080694
I (27) boot: ESP-IDF v4.4-dev-2740-gf65c8249af 2nd stage bootloader
I (27) boot: compile time 23:51:51
I (27) boot: chip revision: 1
I (32) boot_comm: chip revision: 1, min. bootloader chip revision: 0
I (39) boot.esp32: SPI Speed : 40MHz
I (43) boot.esp32: SPI Mode : DIO
I (48) boot.esp32: SPI Flash Size : 2MB
I (52) boot: Enabling RNG early entropy source...
I (58) boot: Partition Table:
I (61) boot: ## Label Usage Type ST Offset Length
I (69) boot: 0 nvs WiFi data 01 02 00009000 00006000
I (76) boot: 1 phy_init RF data 01 01 0000f000 00001000
I (84) boot: 2 factory factory app 00 00 00010000 00100000
I (91) boot: End of partition table
I (95) boot_comm: chip revision: 1, min. application chip revision: 0
I (102) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=07444h ( 29764) map
I (122) esp_image: segment 1: paddr=0001746c vaddr=3ffb0000 size=0236ch ( 9068) load
I (126) esp_image: segment 2: paddr=000197e0 vaddr=40080000 size=06838h ( 26680) load
I (139) esp_image: segment 3: paddr=00020020 vaddr=400d0020 size=147f8h ( 83960) map
I (169) esp_image: segment 4: paddr=00034820 vaddr=40086838 size=04650h ( 18000) load
I (177) esp_image: segment 5: paddr=00038e78 vaddr=50000000 size=00010h ( 16) load
I (183) boot: Loaded app from partition at offset 0x10000
I (183) boot: Disabling RNG early entropy source...
I (198) cpu_start: Pro cpu up.
I (198) cpu_start: Starting app cpu, entry point is 0x40080fc4
0x40080fc4: call_start_cpu1 at /home/denis/espressif/esp-idf/components/esp_system/port/cpu_start.c:156
I (0) cpu_start: App cpu up.
I (212) cpu_start: Pro cpu start user code
I (212) cpu_start: cpu freq: 160000000
I (212) cpu_start: Application information:
I (217) cpu_start: Project name: hello-world
I (222) cpu_start: App version: 1
I (227) cpu_start: Compile time: Aug 24 2021 23:51:46
I (233) cpu_start: ELF file SHA256: e60ccc33c95bd333...
I (239) cpu_start: ESP-IDF: v4.4-dev-2740-gf65c8249af
I (245) heap_init: Initializing. RAM available for dynamic allocation:
I (253) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (259) heap_init: At 3FFB2C48 len 0002D3B8 (180 KiB): DRAM
I (265) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (271) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (278) heap_init: At 4008AE88 len 00015178 (84 KiB): IRAM
I (285) spi_flash: detected chip: generic
I (288) spi_flash: flash io: dio
W (292) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.
I (307) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
Hello world!
This is esp32 chip with 2 CPU core(s), WiFi/BT/BLE, silicon revision 1, 2MB external flash
Minimum free heap size: 294448 bytes
Restarting in 10 seconds...
Restarting in 9 seconds...
Restarting in 8 seconds...
Restarting in 7 seconds...
Restarting in 6 seconds...
Restarting in 5 seconds...
Restarting in 4 seconds...
Restarting in 3 seconds...
Restarting in 2 seconds...
Restarting in 1 seconds...
Restarting in 0 seconds...
Restarting now.
ets Jun 8 2016 00:22:57
Т.е., программа «Здравствуй Мир!» считывает параметры MCU, печатает их и начинает обратный отсчёт с периодом в одну секунду. Когда доходит до нуля, перезагружает процессор.
У утилиты idf.py есть ещё несколько полезных параметров. Вы их можете посмотреть, запустив
idf.py --help
Можете на них взглянуть, хотя, скорее всего, Вы уже установили программу
Скрытый текст
~/Programs/esp32/hello_world $ idf.py --help
Usage: idf.py [OPTIONS] COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]...
ESP-IDF CLI build management tool. For commands that are not known to idf.py an attempt to execute it as a build system target will be
made.
Options:
--version Show IDF version and exit.
--list-targets Print list of supported targets and exit.
-C, --project-dir PATH Project directory.
-B, --build-dir PATH Build directory.
-w, --cmake-warn-uninitialized / -n, --no-warnings
Enable CMake uninitialized variable warnings for CMake files inside the project directory. (--no-
warnings is now the default, and doesn't need to be specified.) The default value can be set with the
IDF_CMAKE_WARN_UNINITIALIZED environment variable.
-v, --verbose Verbose build output.
--preview Enable IDF features that are still in preview.
--ccache / --no-ccache Use ccache in build. Disabled by default. The default value can be set with the IDF_CCACHE_ENABLE
environment variable.
-G, --generator [Ninja|Unix Makefiles]
CMake generator.
-D, --define-cache-entry TEXT Create a cmake cache entry. This option can be used at most once either globally, or for one subcommand.
-b, --baud INTEGER Baud rate for flashing. The default value can be set with the ESPBAUD environment variable. This option
can be used at most once either globally, or for one subcommand.
-p, --port TEXT Serial port. The default value can be set with the ESPPORT environment variable. This option can be used
at most once either globally, or for one subcommand.
--help Show this message and exit.
Commands:
add-dependency Add dependency to the manifest file. For now we only support adding dependencies on the default service.
all Aliases: build. Build the project.
app Build only the app.
app-flash Flash the app only.
bootloader Build only bootloader.
bootloader-flash Flash bootloader only.
build-system-targets Print list of build system targets.
clean Delete build output files from the build directory.
confserver Run JSON configuration server.
create-component Create a new component.
create-manifest Create manifest for specified component.
create-project Create a new project.
create-remote-component Register a new component on the component service.
delete-version Delete version in dist directory from the component service.
docs Open web browser with documentation for ESP-IDF
efuse_common_table Generate C-source for IDF's eFuse fields.
efuse_custom_table Generate C-source for user's eFuse fields.
encrypted-app-flash Flash the encrypted app only.
encrypted-flash Flash the encrypted project.
erase_flash Erase entire flash chip.
erase_otadata Erase otadata partition.
flash Flash the project.
fullclean Delete the entire build directory contents.
gdb Run the GDB.
gdbgui GDB UI in default browser.
gdbtui GDB TUI mode.
menuconfig Run "menuconfig" project configuration tool.
monitor Display serial output.
openocd Run openocd from current path
pack-component Create component archive.
partition_table Build only partition table.
partition_table-flash Flash partition table only.
post_debug Utility target to read the output of async debug action and stop them.
python-clean Delete generated Python byte code from the IDF directory
read_otadata Read otadata partition.
reconfigure Re-run CMake.
set-target Set the chip target to build.
show_efuse_table Print eFuse table.
size Print basic size information about the app.
size-components Print per-component size information.
size-files Print per-source-file size information.
uf2 Generate the UF2 binary with all the binaries included
uf2-app Generate an UF2 binary for the application only
upload-component Upload component in dist directory to the component service.
upload-component-status Check status of component upload
Windows
Обратите внимание, что %USERPROFILE% (Путь к домашнему каталогу пользователя) не должен содержать пробелов. Иначе, установка инструментария esp-idf просто не запустится. Если путь содержит пробелы, устанавливайте куда-нибудь ещё. Например, на другой диск или в корневой каталог диска C:\
Обычно, git.exe (https://git-scm.com/downloads) устанавливается в каталог %ProgramFiles%/git/bin. python.exe (на момент написания актуальна версия Python3.9 — https://www.python.org/downloads/, Обычно, находится в каталоге %ProgramFiles%/Python39 )
Не стоит устанавливать пакеты ninja и cmake. Пакет установки Windows «вытянет» сам нужные версии и установит их локально.
Необходимо сразу проверить, чтобы git и python были уже прописаны в Path. Можно глобально, можно локально:
![Находим в настройках Windows изменение системных/пользовательских переменных среды Находим в настройках Windows изменение системных/пользовательских переменных среды](https://habrastorage.org/getpro/habr/upload_files/15b/9ba/87a/15b9ba87a98d9e84d924a6017cc5d22f.png)
Также, под 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 мог бы «подхватить» уже настроенный пакет](https://habrastorage.org/getpro/habr/upload_files/19e/414/9db/19e4149dbe800d34fb18b9a5bf6a3480.png)
Для установки под Windows можно использовать export.bat из Командной Строки (cmd.exe)
mkdir %USERPROFILE%\espressif
cd %USERPROFILE%\espressif
git clone https://github.com/espressif/esp-idf --recursive
.\install.bat
Равно, можно использовать установщик для PowerShell:
cd $env:USERPROFILE
mkdir espressif
git clone https://github.com/espressif/esp-idf.git --recursive
cd .\esp-idf\
.\install.ps1
Если получилось, увидим примерно следующее (вывод сокращён):
Скрытый текст
C:\Users\grand\esp32\hello_world>cd %USERPROFILE%\espressif\esp-idf
C:\Users\grand\espressif\esp-idf>install.bat
Installing ESP-IDF tools
Selected targets are: esp32s2, esp32c3, esp32, esp32s3
Installing tools: xtensa-esp32-elf, xtensa-esp32s2-elf, xtensa-esp32s3-elf, riscv32-esp-elf, esp32ulp-elf, esp32s2ulp-elf, cmake, openocd-esp32, ninja, idf-exe, ccache, dfu-util
Skipping xtensa-esp32-elf@esp-2021r1-8.4.0 (already installed)
Skipping xtensa-esp32s2-elf@esp-2021r1-8.4.0 (already installed)
Skipping xtensa-esp32s3-elf@esp-2021r1-8.4.0 (already installed)
Skipping riscv32-esp-elf@esp-2021r1-8.4.0 (already installed)
Skipping esp32ulp-elf@2.28.51-esp-20191205 (already installed)
Skipping esp32s2ulp-elf@2.28.51-esp-20191205 (already installed)
Skipping cmake@3.20.3 (already installed)
Skipping openocd-esp32@v0.10.0-esp32-20210721 (already installed)
Skipping ninja@1.10.2 (already installed)
Skipping idf-exe@1.0.1 (already installed)
Skipping ccache@4.3 (already installed)
Skipping dfu-util@0.9 (already installed)
Setting up Python environment
Python 3.9.6
pip 21.2.4 from C:\Users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages\pip (python 3.9)
Installing Python packages from C:\Users\grand\espressif\esp-idf\requirements.txt
Looking in indexes: https://pypi.org/simple, https://dl.espressif.com/pypi
Processing c:\users\grand\espressif\esp-idf\tools\kconfig_new\esp-windows-curses
DEPRECATION: A future pip version will change local packages to be built in-place without first copying to a temporary directory. We recommend you use --use-feature=in-tree-build to test your packages with this new behavior before it becomes the default.
pip 21.3 will remove support for this functionality. You can find discussion regarding this at https://github.com/pypa/pip/issues/7555.
Requirement already satisfied: setuptools>=21 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 4)) (57.4.0)
Requirement already satisfied: click>=7.0 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 8)) (8.0.1)
Requirement already satisfied: pyserial>=3.3 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 9)) (3.5)
Requirement already satisfied: future>=0.15.2 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 10)) (0.18.2)
Requirement already satisfied: cryptography>=2.1.4 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 11)) (3.4.7)
Requirement already satisfied: pyparsing<2.4.0,>=2.0.3 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 12)) (2.3.1)
Requirement already satisfied: pyelftools>=0.22 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 13)) (0.27)
Requirement already satisfied: gdbgui==0.13.2.0 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (0.13.2.0)
Requirement already satisfied: pygdbmi<=0.9.0.2 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 18)) (0.9.0.2)
Requirement already satisfied: python-socketio<5 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 21)) (4.6.1)
Requirement already satisfied: kconfiglib==13.7.1 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 23)) (13.7.1)
Requirement already satisfied: reedsolo<=1.5.4,>=1.5.3 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 26)) (1.5.4)
Requirement already satisfied: bitstring>=3.1.6 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 27)) (3.1.9)
Requirement already satisfied: ecdsa>=0.16.0 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 28)) (0.17.0)
Requirement already satisfied: construct==2.10.54 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from -r C:\Users\grand\espressif\esp-idf\requirements.txt (line 32)) (2.10.54)
Requirement already satisfied: Flask-SocketIO<3.0,>=2.9 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from gdbgui==0.13.2.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (2.9.6)
Requirement already satisfied: gevent<2.0,>=1.2.2 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from gdbgui==0.13.2.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (1.5.0)
Requirement already satisfied: Flask-Compress<2.0,>=1.4.0 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from gdbgui==0.13.2.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (1.10.1)
Requirement already satisfied: Pygments<3.0,>=2.2.0 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from gdbgui==0.13.2.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (2.10.0)
Requirement already satisfied: Flask<1.0,>=0.12.2 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from gdbgui==0.13.2.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (0.12.5)
Requirement already satisfied: colorama in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from click>=7.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 8)) (0.4.4)
Requirement already satisfied: cffi>=1.12 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from cryptography>=2.1.4->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 11)) (1.14.6)
Requirement already satisfied: six>=1.9.0 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from python-socketio<5->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 21)) (1.16.0)
Requirement already satisfied: python-engineio<4,>=3.13.0 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from python-socketio<5->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 21)) (3.14.2)
Requirement already satisfied: windows-curses in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from esp-windows-curses==0.1->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 38)) (2.2.0)
Requirement already satisfied: pycparser in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from cffi>=1.12->cryptography>=2.1.4->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 11)) (2.20)
Requirement already satisfied: itsdangerous>=0.21 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from Flask<1.0,>=0.12.2->gdbgui==0.13.2.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (2.0.1)
Requirement already satisfied: Werkzeug<1.0,>=0.7 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from Flask<1.0,>=0.12.2->gdbgui==0.13.2.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (0.16.1)
Requirement already satisfied: Jinja2>=2.4 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from Flask<1.0,>=0.12.2->gdbgui==0.13.2.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (3.0.1)
Requirement already satisfied: brotli in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from Flask-Compress<2.0,>=1.4.0->gdbgui==0.13.2.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (1.0.9)
Requirement already satisfied: greenlet>=0.4.14 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from gevent<2.0,>=1.2.2->gdbgui==0.13.2.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (1.1.1)
Requirement already satisfied: MarkupSafe>=2.0 in c:\users\grand.espressif\python_env\idf4.4_py3.9_env\lib\site-packages (from Jinja2>=2.4->Flask<1.0,>=0.12.2->gdbgui==0.13.2.0->-r C:\Users\grand\espressif\esp-idf\requirements.txt (line 15)) (2.0.1)
Building wheels for collected packages: esp-windows-curses
Building wheel for esp-windows-curses (setup.py) ... done
Created wheel for esp-windows-curses: filename=esp_windows_curses-0.1-py3-none-any.whl size=1170 sha256=bdbf62d5861e86804fd97c0398bc76ab1a95cffea827b1215a340c406b564246
Stored in directory: c:\users\grand\appdata\local\pip\cache\wheels\c0\a0\63\a4fd89175a7346f567d984c78f1f3749b6e026098b0098ef22
Successfully built esp-windows-curses
Installing collected packages: esp-windows-curses
Attempting uninstall: esp-windows-curses
Found existing installation: esp-windows-curses 0.1
Uninstalling esp-windows-curses-0.1:
Successfully uninstalled esp-windows-curses-0.1
Successfully installed esp-windows-curses-0.1
All done! You can now run:
export.bat
Теперь, нужно запустить export.bat:
Скрытый текст
C:\Users\grand\espressif\esp-idf>export.bat Setting IDF_PATH: C:\Users\grand\espressif\esp-idf
Adding ESP-IDF tools to PATH... No directories added to PATH:
C:\Users\grand.espressif\tools\xtensa-esp32-elf\esp-2021r1-8.4.0\xtensa-esp32-elf\bin;C:\Users\grand.espressif\tools\xtensa-esp32s2-elf\esp-2021r1-8.4.0\xtensa-esp32s2-elf\bin;C:\Users\grand.espressif\tools\xtensa-esp32s3-elf\esp-2021r1-8.4.0\xtensa-esp32s3-elf\bin;C:\Users\grand.espressif\tools\riscv32-esp-elf\esp-2021r1-8.4.0\riscv32-esp-elf\bin;C:\Users\grand.espressif\tools\esp32ulp-elf\2.28.51-esp-20191205\esp32ulp-elf-binutils\bin;C:\Users\grand.espressif\tools\esp32s2ulp-elf\2.28.51-esp-20191205\esp32s2ulp-elf-binutils\bin;C:\Users\grand.espressif\tools\cmake\3.20.3\bin;C:\Users\grand.espressif\tools\openocd-esp32\v0.10.0-esp32-20210721\openocd-esp32\bin;C:\Users\grand.espressif\tools\idf-exe\1.0.1;C:\Users\grand.espressif\tools\ccache\4.3\ccache-4.3-windows-64;C:\Users\grand.espressif\tools\dfu-util\0.9\dfu-util-0.9-win64;C:\Users\grand.espressif\python_env\idf4.4_py3.9_env\Scripts;C:\Users\grand\espressif\esp-idf\tools;C:\ActiveTcl\bin;C:\Program Files (x86)\Common Files\Intel\Shared Libraries\redist\intel64\compiler;C:\Program Files\Python39\Scripts;C:\Program Files\Python39;C:\Program Files\Common Files\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Program Files (x86)\Calibre2;C:\Program Files\PuTTY;C:\Program Files\MiKTeX\miktex\bin\x64;C:\Program Files\nodejs;C:\ProgramData\chocolatey\bin;C:\Program Files\Polyspace\R2021a\runtime\win64;C:\Program Files\Polyspace\R2021a\bin;C:\Program Files\Polyspace\R2021a\polyspace\bin;C:\Program Files\Microchip\xc8\v2.31\bin;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn;C:\Program Files (x86)\Microsoft SQL Server\120\Tools\Binn;C:\Program Files\Microsoft SQL Server\120\Tools\Binn;C:\Program Files\Microsoft SQL Server\120\DTS\Binn;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit;C:\Utils;C:\Program Files\dotnet;C:\Program Files\Python39;C:\Program Files\Notepad++;C:\Program Files\Git\cmd;C:\Users\grand\AppData\Local\Microsoft\WindowsApps;C:\Program Files\Python39;C:\Program Files\Git\bin;;C:\Users\grand\AppData\Local\Programs\Microsoft VS Code\bin
Checking if Python packages are up to date... Python requirements from C:\Users\grand\espressif\esp-idf\requirements.txt are satisfied.
Done! You can now compile ESP-IDF projects. Go to the project directory and run:
idf.py build
Или, если Вы используете PowerShell:
$env:USERPROFILE\espressif\esp-idf\install.ps1
По умолчанию toolchain установится в %USERPROFILE%\.espressif ($env:USERPROFILE\.espressif)
Не пропускаем предупреждение об обновлении Python Virtual Environment. Обновляем:
$env:USERPROFILE\.espressif\python_env\idf4.4_py3.9_env\Scripts\python.exe -m pip install --upgrade pip
Осталось сделать ярлыки для запуска среды консольной разработки. Открываем в проводнике. Правой кнопкой в проводникеSystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe (расположение по умолчанию).
Правой кнопкой мыши вызываем «Создать ярлык». В свойствах ярлыка добавляем: "%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe" -noexit -ExecutionPolicy Bypass -File %USERPROFILE%\espressif\esp-idf\export.ps1. При желании можно поставить какую-нибудь красивую иконку.
Неплохо указать рабочий каталог. Например, "%USERPOFILE%\esp32"
Или тоже самое можно сделать для cmd.exe — правой кнопкой мыши на экране, «Создать ярлык», указать команду: %comspec% /k "%IDF_PATH%\export.bat". И, опять-таки, не забудьте установить путь к рабочему каталогу (Например, %USERPROFILE%\esp32) и можете поменять иконку.
Итак, после запуска консоли, мы получили приглашение к сборке проекта: idf.py build. т.е., если мы находимся в каталоге проекта, то можно его собрать и прошить Можно скопировать из примеров проект «hello world», скажем в каталог %USERPROFILE%\esp32\hello_world:
cd %USERPROFILE%
mkdir esp32
mkdir hello_world
copy %USERPROFILE%\espressif\esp-idf\examples\get-started\hello_world %USERPROFILE%\esp32
cd .\esp32\hello_world
idf.py build
idf.py flash
idf.py monitor
Команда idf.py build строит проект, idf.py flash — прошивает устройство (плата уже должна быть подключена к компьютеру), idf.py — запускает монитор сообщений платы.
Если всё прошло успешно, увидим что-то вроде:
Скрытый текст
rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:6388
load:0x40078000,len:14252
load:0x40080400,len:3820
0x40080400: _init at ??:?
entry 0x40080698
I (27) boot: ESP-IDF v4.4-dev-2594-ga20df743f1 2nd stage bootloader
I (27) boot: compile time 23:44:15
I (27) boot: chip revision: 1
I (31) boot_comm: chip revision: 1, min. bootloader chip revision: 0
I (39) boot.esp32: SPI Speed : 40MHz
I (43) boot.esp32: SPI Mode : DIO
I (48) boot.esp32: SPI Flash Size : 2MB
I (52) boot: Enabling RNG early entropy source...
I (58) boot: Partition Table:
I (61) boot: ## Label Usage Type ST Offset Length
I (69) boot: 0 nvs WiFi data 01 02 00009000 00006000
I (76) boot: 1 phy_init RF data 01 01 0000f000 00001000
I (83) boot: 2 factory factory app 00 00 00010000 00100000
I (91) boot: End of partition table
I (95) boot_comm: chip revision: 1, min. application chip revision: 0
I (102) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=073dch ( 29660) map
I (122) esp_image: segment 1: paddr=00017404 vaddr=3ffb0000 size=0236ch ( 9068) load
I (125) esp_image: segment 2: paddr=00019778 vaddr=40080000 size=068a0h ( 26784) load
I (139) esp_image: segment 3: paddr=00020020 vaddr=400d0020 size=14808h ( 83976) map
I (169) esp_image: segment 4: paddr=00034830 vaddr=400868a0 size=044e0h ( 17632) load
I (177) esp_image: segment 5: paddr=00038d18 vaddr=50000000 size=00010h ( 16) load
I (183) boot: Loaded app from partition at offset 0x10000
I (183) boot: Disabling RNG early entropy source...
I (198) cpu_start: Pro cpu up.
I (198) cpu_start: Starting app cpu, entry point is 0x40080fb4
0x40080fb4: call_start_cpu1 at C:/Users/grand/espressif/esp-idf/components/esp_system/port/cpu_start.c:156
I (185) cpu_start: App cpu up.
I (213) cpu_start: Pro cpu start user code
I (213) cpu_start: cpu freq: 160000000
I (213) cpu_start: Application information:
I (217) cpu_start: Project name: hello-world
I (222) cpu_start: App version: 1
I (227) cpu_start: Compile time: Aug 24 2021 23:44:00
I (233) cpu_start: ELF file SHA256: 64100d65401fe87b...
I (239) cpu_start: ESP-IDF: v4.4-dev-2594-ga20df743f1
I (246) heap_init: Initializing. RAM available for dynamic allocation:
I (253) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (259) heap_init: At 3FFB2C48 len 0002D3B8 (180 KiB): DRAM
I (265) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (271) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (278) heap_init: At 4008AD80 len 00015280 (84 KiB): IRAM
I (285) spi_flash: detected chip: generic
I (289) spi_flash: flash io: dio
W (293) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.
I (307) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
Hello world!
This is esp32 chip with 2 CPU core(s), WiFi/BT/BLE, silicon revision 1, 2MB external flash
Minimum free heap size: 294448 bytes
Restarting in 10 seconds...
C:\Users\grand\esp32\hello_world>
Т.е. выводится информация о процессоре, дальше запускается обратный отсчёт от 10 до 0 и процессор перезапускается.
Сам код программы Вы можете посмотреть в %USERPROFILE%\esp32\hello_world\main\hello_world_main.c
Система мониторинга Esp32 настолько мощная, что в использовании отладчика, как правило нет необходимости. Впрочем, что выгодно отличает Esp32 от собратьев STM32 или ATmega, это дешевизна отладчика. Бюджетная плата FT2232HL обойдётся в районе одной тысячи рублей.
В принципе, если не претендовать на полнофункциональную Интегрированную Среду Разработки, фреймворк готов к работе. Редактировать исходный код примера ~/espressif/esp-idf/examples/get-started/hello_world/main/hello_world_main.c можно хоть при помощи того же notepad++.
В этом нет необходимости. esp-idf прекрасно «сотрудничает» с Visual Studio Code и Eclipse.
Часть II. Установка Visual Studio Code
Если Вы не установили VSCode глобально при помощи какого-нибудь пакетного менеджера, стоит скачать дистрибутив c https://code.visualstudio.com/download.
Под Windows, качаем User/System Installer. Я предпочитаю User Installer, чтобы VSCode установилась в %USERPROFILE%. Увы, здесь трюк с «подхватыванием» переменных окружения из Командной Строки не пройдёт. Поэтому, надо, чтобы были установлены переменные окружения IDF_PATH=%USERPROFILE%\espressif\esp-idf и IDF_PYTHON_ENV_PATH=%USERPROFILE%\.espressif\python_env\idf4.4_py3.9_env
Эту переменную можно скопировать при помощи Ctrl+M, вызвав set в командной строке, после запуска скрипта %USERPROFILE%\espressif\esp-idf\export.bat
Будьте внимательны: обратные слэши в пути!
Для Linux скачиваем, например .tar.gz архив. Или устанавливаем из стандартного пакетного менеджера. Сейчас трудно найти сборку Linux, в которой не было бы в стандартной поставке Visual Studio Code.
Если скачан .tar.gz архив под Linux можем распаковать полученный архив code-stable-x64-xxxxxxxxx-.tar.gz архив куда-нибудь вроде каталога ~/IDE
mkdir ~/IDE
cd ~/IDE
cp ~/Загрузки/code-stable-x64-xxxxx.tar.gz ~/IDE/
tar -zxvf code-stable-x64.tar.gz
В случае локальной установки, нужно сделать «мягкую» ссылку на ~/IDE/VSCode-linux-x64/bin/code в ~/.local/bin. Причём, ссылка должна быть именно «мягкой», иначе, code при вызове из командной строки будет искать сопутствующие библиотеки в каталоге вызова ~/.local/bin. Теперь, code можно вызвать из терминала из любого каталога.
ln -sf ~/IDE/VSCode-linux-x64/bin/code ~/.local/bin/
Если у вас установлена среда рабочего стола GNOME desktop и вы установились в локальный каталог пользователя, неплохо создать *.desktop файл в каталоге ~/.local/share/applications/vscode.desktop (видит только пользователь) или /usr/share/applications/vscode.desktop. Не забудьте заменить ${HOME} на путь к домашнему каталогу. destop переменных окружения не понимает! Если установка была сделана из пакетного менеджера программ, этого делать не нужно.
[Desktop Entry]
Type=Application
Exec="${HOME}/IDE/VSCode-linux-x64/bin/code" %F
Name=VSCode
GenericName=The Microsoft IDE for C/C++, Javascript, Python e.t.c. development.
Icon=${HOME}/IDE/VSCode-linux-x64/resources/app/resources/linux/code.png
StartupWMClass=code
Terminal=false
Categories=Development;IDE;C/C++;Python;Java;Java Script;Node;NodeJS
MimeType=text/x-c++src;text/x-c++hdr;text/x-xsrc;application/x-designer;
Итак, если всё сделано правильно, то можно из любого каталога из терминала, где был запущен idfexp, запустить code. Важно, что code запускается из терминала, где экспортированы переменные окружения esp-idf.
. ~/espressif/esp-idf/export.sh
code
или если настроен алиас:
idfexp && code
Далее, установка и настройка VSCode под Linux и Windows не будут отличаться.
Если в среде Linux или Windows настроен русский язык, VSCode запросит установку русскоязычного пакета. Можно установить. Ищем в списке расширений esp-idf и устанавливаем его.
![Установка плагина Espressif IDF Установка плагина Espressif IDF](https://habrastorage.org/getpro/habr/upload_files/160/937/179/1609371798386873272abc83ba24ad1f.png)
Далее, нажимаем F1 и ищем команду «>ESP-IDF Настроить расширения ESP-IDF». Если всё было сделано правильно, увидим меню, которое будет предлагать «штатные» пути для установки (плагин будет устанавливать снова окружение eps-idf и инструментарий) и предложит использовать текущую установку esp-idf.
![Выбираем «USE EXISTING SETUP» Выбираем «USE EXISTING SETUP»](https://habrastorage.org/getpro/habr/upload_files/e39/1cd/1d5/e391cd1d5bb92e2fa0ca7362c28f6897.png)
Если всё прошло удачно, увидим сообщение, что окружение Espressif IDF настроено:
![Расширение Espressif IDF настроено Расширение Espressif IDF настроено](https://habrastorage.org/getpro/habr/upload_files/ab3/565/2ef/ab35652ef77515aabe59b7418de114af.png)
Можем создавать новый проект. Это можно сделать через меню команд «F1»/«Ctrl+Shift+P»/«>ESP-IDF: Новый проект» или использовать «Ctrl+E N». Все команды плагина esp-idf начинаются на «Ctrl+E» (См. https://github.com/espressif/vscode-esp-idf-extension#Available-commands — список команд)
![Создание нового проекта Создание нового проекта](https://habrastorage.org/getpro/habr/upload_files/9fb/7a8/acf/9fb7a8acfca100c54775316e14531e93.png)
Будьте внимательны, если Вы укажете неправильный путь к каталогу, проектов, приложение просто выдаст сообщение об ошибке, вместо того, чтобы попытаться создать такой каталог.
Осталось выбрать исходный шаблон. Сойдёт и простейший «template-app». Это уже знакомый нам «Hello World», считывающий параметры чипа, выводящий на экран некоторые из них и запускающий обратный отсчёт на десять секунд с последующей перезагрузкой Esp32.
![Выбираем шаблон проекта Выбираем шаблон проекта](https://habrastorage.org/getpro/habr/upload_files/e15/1c8/50b/e151c850bd57d748e7d21362150d85ea.png)
Осталось нажать «Ctrl+E D» (собрать проект, прошить плату и запустить монитор). Видим знакомый журнал работы программы «Hello World!» с обратным отсчётом.
![Монитор работы Esp32 Монитор работы Esp32](https://habrastorage.org/getpro/habr/upload_files/627/be3/ea4/627be3ea4d16012161bd516452090e76.png)
Выход из монитора, опять таки по сочетанию клавиш «Ctrl+]»
Можно, также создавать проекты, используя в качестве шаблонов, примеры, находящиеся в каталоге ~/espressif/esp-idf/examples. Для этого надо вызвать F1, и найти команду «>ESP-IDF: Показать примеры проектов». Правда, к сожалению, тут доступны далеко не все примеры.
![Создание проекта из примера Создание проекта из примера](https://habrastorage.org/getpro/habr/upload_files/3b2/fe5/f1d/3b2fe5f1df8dc20b0c5cb3ca43d721cf.png)
Всё. Visual Studio Code — рабочая полноценная IDE для разработки Esp32 приложений. Вы можете использовать, к примеру, F2 для рефакторинга, F12 для перехода к исходному коду включаемых файлов, функций и т.д.
Eclipse
Установка Eclipse под Windows и Linux, вообще, не отличается. Качаем с https://www.eclipse.org/downloads/ установщик Eclipse. Под Windows и Linux должен быть установлен JDK: https://www.oracle.com/ru/java/technologies/javase-jdk16-downloads.html
Запускаем установщик и, если видим в правом верхнем углу восклицательный знак, обновляем установщик.
«Выбираем Eclipse IDE for C/C++ Developers». После установки открываем «Help/Market Place» и ищем «esp-idf». Устанавливаем. После перезагрузки Eclipse вызываем «Help/Download and configure ESP-IDF». Указываем, что используем существующий пакет esp-idf:
![Указать путь к esp-idf Указать путь к esp-idf](https://habrastorage.org/getpro/habr/upload_files/973/ab8/5d8/973ab85d8b43b5a054ef6a5acb663ade.png)
Единственная проблема в том, что Eclipse иногда почему-то не подхватывает пути к git или python. Но их несложно прописать вручную:
![Указать пути к необходимым файлам (обычно приходится делать это вручную) Указать пути к необходимым файлам (обычно приходится делать это вручную)](https://habrastorage.org/getpro/habr/upload_files/f05/c88/757/f05c8875773ff244f88d8eed9e24f02e.png)
Если текущая среда разработки была интегрирована успешно, можем перейти к «File/New Project/Espressif IDF Project» (ещё можно создавать встраиваемые компоненты IDF)
Если после перехода к экрану нового проекта нажать «Next>» и выбрать «Create a project from using one of the templates», можно создать проект из одного из примеров, находящихся в esp-idf/expamles.
Чтобы собрать проект, необходимо в ESP-IDF тулбаре установить нужную архитектуру процессора (обычно, это esp32, а не esp32s2) и нажатием на шестерёнку настроек в выпадающем списке «on» указать порт прошивки.
![Выбираем процессор Выбираем процессор](https://habrastorage.org/getpro/habr/upload_files/f7f/4ff/895/f7f4ff895307a11e1fadecc510981235.png)
Указываем порт прошивки нажатием на шестерёнку около выбранного процессора. Теперь, можно нажать «Run». Если всё прошло удачно, видим процесс прошивки. ESP-IDF Terminal запускается нажатием на иконку монитора на ESP-тулбаре
![Включение Espressif IDF монитора Включение Espressif IDF монитора](https://habrastorage.org/getpro/habr/upload_files/dd3/611/be0/dd3611be07aef502e8defe2e93554ad5.png)
Нажатие «Ctrl+]» здесь не работает. Чтобы прекратить мониторинг приложения, нужно просто закрыть монитор.
![Мониторинг приложения Espressif на Eclipse Мониторинг приложения Espressif на Eclipse](https://habrastorage.org/getpro/habr/upload_files/1ab/11f/284/1ab11f28470d7a1e19b21e464dc8e161.png)
Выводы
Espressif IDF — полноценный фреймворк разработки, подключаемый к IDE Visual Studio Code и Eclipse. И, увы, если бы не очень подробная документация и некоторое количество багов, возникающих с выпуском каждой новой версии, она бы вполне могла и должна была претендовать на звание «профессиональной».