ESP32: знакомимся, пишем и запускаем первую прошивку

Всем привет. Несколько дней назад мне достался экземпляр ESP32 Demo Board V2, о чем я сразу радостно заявил у себя на FB. Конечно, ведь получить его сейчас не очень просто: первая партия (штук 600), которая поступила на продажу на Seeed Studio разлетелась за считанные часы!



Но как разработчик и hardware интегратор Open-Source библиотеки для Blynk, я часто получаю ранний доступ к различным девайсам. Blynk позволяет быстро прототипировать и строить iOS/Android Apps для интернета вещей, используя drag'n'drop блоки прямо на телефоне.

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

image


ESP32 обещает снова совершить революцию в мире IoT, как в свое время совершил его младший брат ESP8266 (и я искренне надеюсь, что так и будет). Если Вы раньше ничего не слышали о ESP8266 — читайте, например здесь и здесь (ну и гугл).

Что же собой представляет новый ESP32? Даже с первого взгляда понятно, что это очень мощная платформа. Например, Иван Грохотков (разработчик поддержки Arduino для ESP8266) опубликовал фото игры DOOM на ESP32:



Характеристики ESP32


CPU: Xtensa Dual-Core 32-bit LX6, 160 MHz или 240 MHz (до 600 DMIPS)
Memory: 520 KByte SRAM, 448 KByte ROM
Flash на модуле: 1, 2, 4… 64 Мб
Wireless:
  • Wi-Fi: 802.11b/g/n/e/i, до 150 Mbps c HT40
  • Bluetooth: v4.2 BR/EDR и BLE

Peripheral interfaces:
  • 12-bit SAR ADC до 18 каналов
  • 2 × 8-bit DAC
  • 10 × touch сенсоров
  • Temperature сенсор
  • 4 × SPI
  • 2 × I²S
  • 2 × I²C
  • 3 × UART
  • 1 host (SD/eMMC/SDIO)
  • 1 slave (SDIO/SPI)
  • Ethernet MAC с поддержкой DMA и IEEE 1588
  • CAN 2.0
  • IR (TX/RX)
  • Motor PWM
  • LED PWM до 16 каналов
  • Hall sensor
  • Ultra low power analog pre-amplifier

Security:
  • IEEE 802.11 безопасность WFA, WPA/WPA2 и WAPI
  • Secure boot
  • Flash encryption
  • 1024-bit OTP, включая до 768-bit под задачу
  • Cryptographic движок: AES, SHA-2, RSA, ECC, RNG

На картинке это выглядит так:

image

Более детальная (и практически полная) информация есть на офф. сайте Espressif Systems. ESP32 будет доступен (как минимум) в нескольких видах:

» Модуль ESP-WROOM-32 ($5 ?)

image


Распиновка | Datasheet

» Модуль AI-Thinker ESP3212, похожий на ESP-12F ($6.9). На ESP3212 нет ножек для SD-card, в отличии от WROOM-32.

imageimage

Библиотека Eagle | Библиотека KiCAD

Чип ESP32-D0WDQ6 ($2.8 ?) | Datasheet

image
  • D: Dual-core
  • 0: No internal flash
  • W: Wi-Fi
  • D: Dual-mode Bluetooth
  • Q: Quad Flat No-leads (QFN) package
  • 6: 6 mm × 6 mm package body size

Стоит отметить, что до релиза ESP32, был доступен ESP31B (тестовая версия) в виде модуля Espressif ESP-WROOM-03, и в интернетах его часто путают с ESP32.

Осторожно! Практически все упоминания о ESP32 до 09.2016 на самом деле о ESP31B, что вообще не то же самое.

Настройка среды разработки


На оффсайте сейчас можно найти ссылки на два SDK:

» ESP31_RTOS_SDK — SDK для ESP31B, построена на FreeRTOS.
» Espressif IDF (IoT Development Framework) — Official development framework for ESP32.

Хоть это и не очевидно с описания на сайте, но для релизной версии нам подходит только ESP-IDF. Есть инструкции по установке для linux, windows, macos.

У меня 64-bit Ubuntu Linux. Сначала скачал компилятор:

sudo mkdir /opt/Espressif
sudo chmod a+rw /opt/Espressif
cd /opt/Espressif
wget https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-59.tar.gz
tar -xzf xtensa-esp32-elf-linux64-1.22.0-59.tar.gz

Должна появиться папка xtensa-esp32-elf. Потом скачал esp-idf (в той же папке /opt/Espressif):

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

Должна появиться папка esp-idf.

Пишем Hello World


Espressif подготовил для нас темплейт проект, так что начать очень просто:

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

Можно попробовать запустить чисто темплейт, но мне это показалось неинтересным. Я чуть-чуть дописал main/app_main.c, чтоб помигать светодиодом. Вот что получилось.

main/app_main.c
#include <stdio.h>
#include "rom/gpio.h"
#include "esp_system.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

#define LED_PIN 18

#define LOG(msg, ...) printf("[%u] " msg "\n", system_get_time(), ##__VA_ARGS__)

void pingTask(void *pvParameters)
{
    while (1) {
        GPIO_OUTPUT_SET(LED_PIN, 0);
        LOG("low");
        vTaskDelay(1000 / portTICK_PERIOD_MS);

        GPIO_OUTPUT_SET(LED_PIN, 1);
        LOG("high");
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

void app_main()
{
    xTaskCreatePinnedToCore(&pingTask, "pingTask", 2048, NULL, 5, NULL, 0);
}

Собираем и заливаем на плату


Чтоб собрать проект, сначала надо настроить окружение:

cd ~/myapp
export PATH=/opt/Espressif/xtensa-esp32-elf/bin:$PATH
export IDF_PATH=/opt/Espressif/esp-idf

Теперь подключаем плату, включаем питание, и смотрим на каком порту она появилась (у меня это /dev/ttyUSB3). Запускаем конфигуратор:

make menuconfig

image

Надо зайти в «Serial flasher config» и установить «Default serial port» на порт платы. Можно еще посмотреть другие настройки.
Все, сохраняем и выходим.

Компилируем:

make

Если все хорошо, заливаем на плату:

make flash

Должно отобразиться что-то вроде...
Flashing project app to 0x10000...
esptool.py v2.0-dev
Connecting...
Changing baud rate to 921600
Changed.

********************************
IS HSPI: 0x00000000 <type 'int'>
--------------------------
IS LEGACY: 0x00 <type 'int'>
*********************************
SENDING SPI ATTACH COMMAND
--------------
SEND ESP SPI ATTACH CMD
START DOWNLOADING...
Erasing flash...
Unc size 6656 comp size 3900 comp blocks 4
Took 0.09s to erase flash block
Wrote 3900 bytes at 0x00001000 in 0.2 seconds (194.1 kbit/s)...
Hash of data verified.
Erasing flash...
Unc size 378208 comp size 210815 comp blocks 206
Took 1.99s to erase flash block
Wrote 210815 bytes at 0x00010000 in 4.6 seconds (366.2 kbit/s)...
Hash of data verified.                                                                        
Erasing flash...                                                                              
Unc size 96 comp size 57 comp blocks 1                                                        
Took 0.04s to erase flash block                                                               
Wrote 57 bytes at 0x00004000 in 0.1 seconds (5.0 kbit/s)...                                   
Hash of data verified.                                                                        
                                                                                              
Leaving...

Подключаемся к плате используя Putty (screen, или другой эмулятор терминала). Передергиваем питание, и видим:

Начальная инициализация
ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
ets Jun  8 2016 00:22:57

rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0x00
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:QIO, clock div:2
load:0x3ffc0000,len:0
load:0x3ffc0000,len:2268
load:0x40078000,len:3788
load:0x40098000,len:532
entry 0x4009813c


**************************************
*       hello espressif ESP32!       *
*        2nd boot is running!        *
*            version (V0.1)          *
**************************************
compile time 18:10:20

  SPI Speed      : 40MHz
  SPI Mode       : QIO
  SPI Flash Size : 4MB
Partition Table:
## Label            Usage          Type ST Offset   Length
 0 factory          factory app      00 00 00010000 00100000
 1 rfdata           RF data          01 01 00110000 00040000
 2 wifidata         WiFi data        01 02 00150000 00040000
End of partition table
Loading app partition at offset 00010000
section 0: paddr=0x00000020 vaddr=0x00000000 size=0x0ffe8 ( 65512)
section 1: paddr=0x00010010 vaddr=0x3f400010 size=0x086fc ( 34556) map
section 2: paddr=0x00018714 vaddr=0x3ffba950 size=0x01248 (  4680) load
section 3: paddr=0x00019964 vaddr=0x40080000 size=0x00400 (  1024) load
section 4: paddr=0x00019d6c vaddr=0x40080400 size=0x1326c ( 78444) load
section 5: paddr=0x0002cfe0 vaddr=0x00000000 size=0x03030 ( 12336)
section 6: paddr=0x00030018 vaddr=0x400d0018 size=0x2c540 (181568) map
start: 0x4008078c

Initializing heap allocator:
Region 19: 3FFBBB98 len 00024468 tag 0
Region 25: 3FFE8000 len 00018000 tag 1
Pro cpu up.
Pro cpu start user code
nvs_flash_init
misc_nvs_load g_misc_nvs=0x3ffbbd04
frc2_timer_task_hdl:3ffbc880, prio:22, stack:2048
tcpip_task_hdlxxx : 3ffbe62c, prio:20,stack:2048
phy_version: 80, Aug 26 2016, 13:04:06, 0
pp_task_hdl : 3ffc3360, prio:23, stack:8192

[213450] low
[1212827] high
[2212827] low
[3212828] high
[4212828] low

Если подключить светодиод к IO18, то он тоже мигает. Значит, наш код работает!

Отладка


Еще одна хорошая новость — в ESP32 есть JTAG интерфейс на ножках IO12, IO13, IO14, IO15. Я попробую использовать его для отладки программ. Но об этом уже в следующей статье.

Ну что ж, осталось только дождаться наличия ESP32 в магазинах, стабилизации SDK (надеюсь, оно будет изначально намного стабильнее, чем ESP8266). Функция Bluetooth тоже пока не доступна. В скором времени (по моим данным, очень скоро) должны появиться бета-поддержка Arduino IDE и MicroPython, чуть потом Espruino и что-то похожее на NodeMCU.

Что думаете?
Поделиться публикацией
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама
Комментарии 28
  • +2

    С нетерпением ждем появления на али.
    На гитхабе NodeMCU уже вовсю идет портирование.

    • 0
      NodeMCU это хорошо, но только для начала. Сейчас думаю отказаться от его использования и попробовать писать прошивку самому, так как столкнулся с проблемой удаленного обновления (но это только первая в списке). Дело в том, что у меня за окном в герметичном боксе стоит модуль с датчиками и каждый раз снимать его только для того, чтобы сделать обновление как то глупо, а для NodeMCU простого решения как обновить не то что бы прошивку, а хотя бы файлы, я не нашел.
      • 0

        Если Вы довели устройство до стадии "за окном в герметичном боксе", то зачем Вам менять у него прошивку?

    • 0
      Интересен вопрос цены, особенно с 64мб памяти. И было бы интересно на проекты посмотреть.
      Что с питанием? Меньше, чем у esp8266?
      • 0
        Метеостанции, LED ленты и гаражные двери начнут жить новой жизнью!
        С умными домами — просто боюсь представить, что будет.
        • 0
          Время покажет. Думаю ESP8266 был всего лишь пробник.
        • 0
          Если кто, вдруг, еще не использует блинк для своих проектов, то вот ссылка для ознакомления.
          • +1
            я так понимаю что исходников вот этого:
            https://github.com/espressif/esp32-wifi-lib
            и человеческого даташита, впрочем как и для 8266, не будет и можно и не ждать.
            • +3
              Мы стараемся улучшить ситуацию с документацией. План таков, что вся периферия (кроме радио и бэйсбэнда) будет документирована на уровне регистров. Текущее состояние дел можно посмотреть в ESP32 Technical Reference Manual: https://espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en_0.pdf. Надеюсь, вы согласитесь, что это уже больше чем вся документация на 8266 вместе взятая.

              Многой периферии пока нет в этом документе. Основной затык в том, что найти хороших технических писателей, которые могут переводить с китайского, достаточно сложно. Поэтому работу по редактированию документации после первоначального перевода приходится делать англоговорящим инженерам, у которых и без этого работы хватает. Я, например, сегодня целый день правил главу про UART. Надеюсь, получится понятно :)

              Что касается esp32-wifi-libs: решение опенсорсить все выше нижнего MAC уровня уже принято, и я начал ревьюить и рефакторить код. Скажу честно, работы там много, и идет она небыстро. После того как основная функциональность ESP-IDF будет доделана, я смогу подключить к этому процессу больше людей и дело пойдет быстрее. Пока что результатами в этом направлении похвастаться, увы, не могу.
              • 0
                Это замечательно, но в первую очередь говорит лишь о том насколько всё плохо было с 8266.
                Но всё равно спасибо, прогресс конечно есть.
                А что такого секретного в описаниях регистров радио периферии и уровнях ниже МАС?
                • +2
                  Что касается радио, BB и нижних уровней стека — польза от открытия их не столь очевидна (в отличие от верхних уровней).
                  Верхние уровни должны быть открыты чтобы портировать, скажем, NuttX или другую RTOS. В верхних уровнях больше шансов, что сторонние разработчики найдут и исправят баги. В верхних уровнях больше возможностей для простых оптимизаций поведения и добавления функционала.

                  Нижние уровни сложнее документировать — нужно описать устройство и логику работы довольно сложного бэйзбэнда. В нижних уровнях больше возможностей заставить чип плохо себя вести по отношению к другим участникам эфира — мы не хотим давать FCC новый повод для введения ограничений на перепрограммирование WiFi SoC-ов. Найти и исправить баг в нижних уровнях стека обычно намного сложнее.

                  Принципиальных ограничений на открытие нижних частей стека нет, но пока что от открытия верхней части польза видится больше. Поэтому за верхнюю часть я готов бодаться и тратить на нее ресурсы. Если появится хорошая причина для открытия нижней части или куча способных программистов и технических писателей, окей, поработаем и над ней.
            • +2
              Ура, удалось подключить отладчик, так что буду писать следующую статью!
              • 0
                Кстати, сегодня вышел HCI уровень Bluetooth для ESP32. Есть даже пример!
                Я думаю, сначала напишу о примерах c WiFI и BLE, а уже потом об отладке. Что думаете?
            • 0
              .
              • +1
                Может попросить мастеров анализа кода пропустить всё через их чудесный продукт для анализа?
                • 0
                  Хм, плата с процом от Тенсилики — это что-то новое.
                  • 0
                    Для ESP8266 есть проект esp-open-rtos, будет ли что-то подобное для ESP32?
                    • 0
                      Забавно то, что совсем скоро планируют отправить чип в продакшн, а функций для работы с блутузом до сих пор в SDK нет. И если остальной функционал более-менее покрыт тестировщиками, то с блутузом стоит ожидать таких же косяков как с esp8266? Странные они какие то.
                      • +2
                        Чип уже в несколько недель как в продакшене. Блютус стек прошел compliance test на прошлой неделе. Да, есть определенные проблемы с интеграцией BT стека, и их фиксят, тестируют, и снова фиксят. BT потому и нет в master'е, что QA еще на дал добро.

                        На днях мы наконец доделали автоматическое тестирование merge request-ов на реальном железе, так что надеюсь число регрессий будет меньше чем с 8266.
                        • 0
                          Действительно, с первого сентября уже в продаже.
                          • 0
                            Как дела обстоят с полноценным DevKit под Windows (скачал, поставил, запустил тот же Eclipse и начал писать)?

                            Потому как вот это https://github.com/espressif/esp-idf — только для профи и только для тех кто знает Linux, хоть там и есть упоминание сборки компилятора под Windows, но это конструктор дай бо еще похлеще чем компилятор для ESP8266.

                            Мне даже страшно браться делать Unofficial Development Kit for Espressif ESP32 как я делал его для ESP8266 (http://programs74.ru/udkew.html), потому как со стороны Espressif никакого понимания, того что 90% людей сидят под Windows — нет.
                            Они непонятно на кого ориентируются. Неужели они думают, что люди будут ставить Linux, вводить тонну команд для установки компилятора и sdk + потом сидеть и писать код в vim ради простого помигивания светодиодом? Смешно просто, таких людей единицы. Дак на кого ориентирован ESP32?
                            • +1
                              Есть готовый пакет MSYS с тулчейном и необходимыми тулами, см. https://github.com/espressif/esp-idf/blob/master/docs/windows-setup.rst.
                              Этот пакет можно использовать с Eclipse: https://github.com/espressif/esp-idf/blob/master/docs/eclipse-setup.rst.

                              Сейчас есть проблема с парсингом путей на винде, из-за которой эклипс иногда не может проиндексировать проект: https://github.com/espressif/esp-idf/issues/17. Её фиксят.

                              Кроме того, пока в пакете для винды нет openocd. Он там появится в ближайшее время.

                              Полная интеграция с Eclipse (поставил-запустил) в процессе. Если вы заинтересованы заниматься этой темой, я уверен что мы можем найти варианты сотрудничества :)

                              Edit: должен сказать, что самая большая проблема в создании среды «без консоли» в том, что мы используем Kconfig/menuconfig. Теоретически можно написать плагин для эклипса вместо menuconfig… Либо вывести куда-нибудь ярлык для запуска консоли с menuconfig.
                        • 0

                          Заказал на Али такие, они?

                          • 0
                            На модуле AI-Thinker ESP3212, пины для подключения SD выведены сбоку: IO2, 12,13,14,15.
                            Пошел заказывать на Ali.
                            • 0
                              Еще одна свежая статья (English): http://hackaday.com/2016/09/15/esp32-hands-on-awesome-promise/
                              • 0
                                я заказал — но так и не пришел. продавец какой-то левый оказался. деньги правда вернули. надо в москве поискать — может кто-то привез уже. валяется кубик с 9 APA102 на каждой стороне. сейчас там nRF51 стоит — хотел поменять на ESP32.

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