[Из песочницы] ESP32: знакомимся, пишем и запускаем первую прошивку
Но как разработчик и hardware интегратор Open-Source библиотеки для Blynk, я часто получаю ранний доступ к различным девайсам. Blynk позволяет быстро прототипировать и строить iOS/Android Apps для интернета вещей, используя drag’n'drop блоки прямо на телефоне.
Плата, которая попала мне в руки, выглядит вот так:
ESP32 обещает снова совершить революцию в мире IoT, как в свое время совершил его младший брат ESP8266 (и я искренне надеюсь, что так и будет). Если Вы раньше ничего не слышали о ESP8266 — читайте, например здесь и здесь (ну и гугл).
Что же собой представляет новый ESP32? Даже с первого взгляда понятно, что это очень мощная платформа. Например, Иван Грохотков (разработчик поддержки Arduino для ESP8266) опубликовал фото игры DOOM на ESP32:
#ESP32 launch event: Doom, QR code scanner, LCD+touch dev board, @CEO_Espressif on stage pic.twitter.com/FwCKWi7429
— Ivan Grokhotkov (@i_grr) September 6, 2016
Характеристики 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
На картинке это выглядит так:
Более детальная (и практически полная) информация есть на офф. сайте Espressif Systems. ESP32 будет доступен (как минимум) в нескольких видах:
» Модуль ESP-WROOM-32 ($5?)
Распиновка | Datasheet
» Модуль AI-Thinker ESP3212, похожий на ESP-12F ($6.9). На ESP3212 нет ножек для SD-card, в отличии от WROOM-32.
Библиотека Eagle | Библиотека KiCAD
Чип ESP32-D0WDQ6 ($2.8?) | Datasheet
- 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 ~/Downloads/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
, чтоб помигать светодиодом. Вот что получилось.#include
#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
Надо зайти в «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
--------------------------
IS LEGACY: 0x00
*********************************
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.
Что думаете?