разработка и программирование электронных устройств

Программирование ESP32 на языке C в SDK от Espressif

В прошлой публикации мы рассмотрели различные способы программирования модулей на основе SoC ESP8266. В этой статье речь пойдет о следующей модели SoC для интернета вещей от Espressif, которая помимо интерфейса WiFi содержит также Bluetooth. Но на этом все различия не заканчиваются , вот список основных характеристик серии ESP32 :

  • 32-битный одно/двухъядерный процессор Xtensa LX6
  • 446 кБайт ROM
  • 520 кБайт SRAM
  • 16 кБайт SRAM в модуле часов реального времени
  • Интерфейс QSPI для подключения нескольких микросхем Flash или SRAM памяти
  • Модуль WiFi 802.11 b/g/n
  • Модуль Bluetooth 4.2
  • Периферийные интерфейсы :
    • GPIO
    • RTC
    • ADC
    • DAC
    • Touch Sensor
    • SPI
    • I2S
    • I2C
    • UART
    • SD/eMMC/SDIO Host
    • SDIO/SPI Slave
    • Ethernet MAC
    • CAN 2.0
    • IR
    • Motor PWM
    • LED PWM
    • Hall sensor

Как следует из названия статьи мы не станем рассматривать различные способы программирования модулей ESP32 , а сразу остановимся на программировании с помощью SDK от Espressif.

Инструментарий можно установить под Windows/Linux/MacOS.
Даташит на серию ESP32 находиться по этой ссылке ESP32 Datasheet.

Инструкция по установке необходимого инструментария находиться по ссылке Get started setup toolchain.

Я собираюсь рассмотреть установку инструментария под Ubuntu Linux , поскольку сейчас под рукой у меня есть только ноутбук с этой ОС.
Итак, инструкция от производителя предлагает нам в первую очередь установить инструментарий (Toolchain).

Для этого сначала нужно установить дополнительные пакеты, запустив из командной строки Ubuntu Linux :


sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing

Чтобы не вводить подтверждение для установки каждого пакета можно добавить ключ -y.
Ссылки для загрузки toolchain для 32-битной Linux и 64-битной Linux.

У меня 64-битная версия (как и у большинства пользователей), поэтому дальше рассмотрим работу с этой версией инструментария.

Дальше создаем в своем домашнем каталоге подкаталог /esp и копируем туда только-что скачанный инструментарий :


mkdir -p ~/esp
cd ~/esp
tar -xzf ~/Downloads/xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz

После распаковки инструментария необходимо добавить путь к toolchain в файле .bashrc :


vim ~/.bashrc
export PATH="$HOME/esp/xtensa-esp32-elf/bin:$PATH"

Можете использовать любой-другой текстовый редактор вместо vim.

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

Проверяем содержимое переменной PATH :


printenv PATH

В ней должен содержаться путь к нашему инструментарию.

Теперь рассмотрим аппаратную часть . В наличи у меня оказался модуль ESP32 DEVKITV1, который содержит на плате преобразователь USB-UART.

Скорее всего в вашем модуле окажется аналогичный преобразователь либо же его можно подключить отдельно для прошивки ESP32 через UART.

Для программирования модуля на основе ESP32 мы будем использовать USB порт.

Необходимо подключить нашу плату к USB порту компьютера и добавить пользователя (себя) в группу dialout , чтобы иметь доступ к порту.


sudo usermod -a -G dialout $USER

Настоло время загрузить SDK от Espressif, для этого можно просто клонировать репозиторий с github :


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

Теперь необходимо добавить аналогичным образом (как мы добавляли путь к инструментарию в PATH) путь к SDK в переменную IDF_PATH.


vim ~/.bashrc
export IDF_PATH=~/esp/esp-idf

После этого действия опять необходимо перелогиниться в системе.
И проверить содержимое переменной IDF_PATH .


printenv IDF_PATH

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

Точнее сказать это дополнительные python -пакеты, необходимые для работы с SDK.

Выполняем в терминале команду :


python -m pip install --user -r $IDF_PATH/requirements.txt

Теперь можно попробовать скомпилировать и прошить какой-нибуть пример из SDK , для этого по рекомендации производителя его необходимо скопировать в корневой каталог ~/esp :


cd ~/esp
cp -r $IDF_PATH/examples/get-started/hello_world ./

В SDK от Espressif как для ESP8266, так и для ESP32 используется конфигуратор menuconfig.

Если вы ранее пробовали собирать ядро Linux, то для вас такой способ конфигурации перед сборкой будет привычным. А если и не пробовали, то в любом случае ничего сложного в этом нет.

Выполняем конфигурацию нашего проекта :


cd ~/esp/hello_world
make menuconfig

Запуститься графический режим конфигурации, в котором можно по пунктам настроить все аспекты работы с ESP32.

Настроим возможность прошивки устройства в пункте “Serial flasher config” .


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

Жмем кнопку “Exit” и завершаем конфигурацию. В результате все выбранные нами настройки будут записаны в файл sdkconfig внутри каталога проекта.

Сборку проекта и загрузку прошивки в нашу плату можно выполнить одной командой :


make flash

Для программирования моего модуля ESP32_DEVKITV1 необходимо нажать кнопку “BOOT”. Кроме того пока я не перезагрузил ноутбук добавление меня в группу dialout не давало права доступа к порту /dev/ttyUSB0.

Итак , модуль прошился, теперь можно взглянуть в исходники примера.
Открываем утилиту putty и соединяемся с портом /dev/ttyUSB0 на скорости 115200.
Тестовая программа выведет следующие строки :


Hello world!
This is ESP32 chip with 2 CPU cores, WiFi/BT/BLE, silicon revision 1, 4MB external flash
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

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:0x3fff0018,len:4
load:0x3fff001c,len:6320
ho 0 tail 12 room 4
load:0x40078000,len:11308
load:0x40080400,len:6680
entry 0x40080760
#[0;32mI (31) boot: ESP-IDF v4.0-dev-225-g2f8b6cfc7 2nd stage bootloader#[0m
#[0;32mI (31) boot: compile time 21:03:10#[0m
#[0;32mI (41) boot: Enabling RNG early entropy source...#[0m
#[0;32mI (41) boot: SPI Speed : 40MHz#[0m
#[0;32mI (42) boot: SPI Mode : DIO#[0m
#[0;32mI (45) boot: SPI Flash Size : 4MB#[0m
#[0;32mI (49) boot: Partition Table:#[0m
#[0;32mI (53) boot: ## Label Usage Type ST Offset Length#[0m
#[0;32mI (60) boot: 0 nvs WiFi data 01 02 00009000 00006000#[0m
#[0;32mI (67) boot: 1 phy_init RF data 01 01 0000f000 00001000#[0m
#[0;32mI (75) boot: 2 factory factory app 00 00 00010000 00100000#[0m
#[0;32mI (82) boot: End of partition table#[0m
#[0;32mI (87) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x0769c ( 30364) map#[0m
#[0;32mI (106) esp_image: segment 1: paddr=0x000176c4 vaddr=0x3ffb0000 size=0x01e98 ( 7832) load#[0m
#[0;32mI (110) esp_image: segment 2: paddr=0x00019564 vaddr=0x40080000 size=0x00400 ( 1024) load#[0m
#[0;32mI (114) esp_image: segment 3: paddr=0x0001996c vaddr=0x40080400 size=0x066a4 ( 26276) load#[0m
#[0;32mI (133) esp_image: segment 4: paddr=0x00020018 vaddr=0x400d0018 size=0x125d4 ( 75220) map#[0m
#[0;32mI (160) esp_image: segment 5: paddr=0x000325f4 vaddr=0x40086aa4 size=0x01538 ( 5432) load#[0m
#[0;32mI (167) boot: Loaded app from partition at offset 0x10000#[0m
#[0;32mI (167) boot: Disabling RNG early entropy source...#[0m
#[0;32mI (169) cpu_start: Pro cpu up.#[0m
#[0;32mI (173) cpu_start: Application information:#[0m
#[0;32mI (178) cpu_start: Project name: hello-world#[0m
#[0;32mI (183) cpu_start: App version: 1#[0m
#[0;32mI (187) cpu_start: Compile time: Apr 2 2019 21:03:17#[0m
#[0;32mI (194) cpu_start: ELF file SHA256: a2dc239010782000...#[0m
#[0;32mI (199) cpu_start: ESP-IDF: v4.0-dev-225-g2f8b6cfc7#[0m
#[0;32mI (206) cpu_start: Starting app cpu, entry point is 0x40080e54#[0m
#[0;32mI (197) cpu_start: App cpu up.#[0m
#[0;32mI (216) heap_init: Initializing. RAM available for dynamic allocation:#[0m
#[0;32mI (223) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM#[0m
#[0;32mI (229) heap_init: At 3FFB2EC0 len 0002D140 (180 KiB): DRAM#[0m
#[0;32mI (236) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM#[0m
#[0;32mI (242) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM#[0m
#[0;32mI (248) heap_init: At 40087FDC len 00018024 (96 KiB): IRAM#[0m
#[0;32mI (255) cpu_start: Pro cpu start user code#[0m
#[0;32mI (273) cpu_start: Starting scheduler on PRO CPU.#[0m
#[0;32mI (0) cpu_start: Starting scheduler on APP CPU.#[0m

Теперь можно настроить удобную для вас среду разработки . Это может быть Eclipse , Sublime Text или же стандартный для Linux редактор vim. В любом случае для настройти проекта придется использовать интрефейс make menuconfig, это сознательный выбор производителя – компании Espressif.

Следующим этапом изучения программирования ESP32 может стать изучение множественных примеров и чтение документации API на языке C из Espressif SDK.
Вот несколько прямых ссылок на официальную документацию от Espressif :

  1. ESP32 Technical reference manual
  2. ESP-IDF API Reference
  3. ESP-IDF API Guides
  4. ESP-IDF Read the docs

Viewed 36404 times by 4439 viewers

Leave a Reply

You must be logged in to post a comment.