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

в 9:04, , рубрики: esp32, esp8266, IoT, Интернет вещей, микроконтроллеры, начинающим, новинки, программирование микроконтроллеров, Разработка для интернета вещей, метки:

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

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

Но как разработчик и 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.

Что думаете?

Автор: vshymanskyy

Источник

Поделиться новостью

* - обязательные к заполнению поля