ESP32 (ESP-WROOM-32) 事始め

# Overview

ワンコイン WiFi Arduinoとして ESP8266 は大変有名ですが、この後継として、 WiFi だけでなく、Bluetooth も 加わり、 Dual Core になって、かつ、GPIOなどのperipheralも充実した後継の [ESP-WROOM-32](http://akizukidenshi.com/catalog/g/gM-11647/) でましたよね。

(ESP8266での参考: [GWだし、ESP8266関係の記事をまとめながら、IoT framework作ってみる](http://qiita.com/hidenorly/items/0eadcf6cc8ba04c0145d))

ただ、ピンのピッチが通常の2.54mmから、ハーフピッチの1.27mmということや、長い休みもなかったので、放置していましたが、 [ESP32-DevKitC ESP-WROOM-32開発ボード](http://akizukidenshi.com/catalog/g/gM-11819/) も購入し、GWなので、遊んでみることにします。

このDevKitは、LDO や USB-UART bridge も基板上に乗っているので、単にmicro USBとPCを接続するだけで、開発を始められるという便利なものです。そして、十分に小さいので、サイズを追い求める以外はこれで十分かもしれません。最初からピンヘッダーも出ていますのでブレッドボードに挿して色々と試してみるのにも適しています。

# おさらい

## W-ROOM-32 や ESP32-DevKitC の pin配列

以下からわかるように、ESP32-DevKitCは基本的にW-ROOM-32のpinを全てpin headerに出してくれているようです。

* ESP-WROOM-32 : http://akizukidenshi.com/download/ds/espressifsystems/esp_wroom_32_datasheet_en.pdf
* ESP32-DevKitの回路図 : http://akizukidenshi.com/download/ds/espressifsystems/ESP32-Core-Board-V2_sch.pdf

| W-ROOM-32 pin | W-ROOM-32 Desc | ESP32-DevKitC pin | ESP32-DevKitC | Mux |
| :---- | :---- | :---- | :---- | :---- |
| 1 | GND | J3:7 & J3:1 | GND | |
| 2 | 3V3 | J2:1 | VDD33 | 2.2-3.6V / Average 80mA |
| 3 | EN | J2:2 | EN | Active High |
| 4 | SENSOR_VP | J2:3 | SENSOR_VP | GPI36, ADC_H, ADC1_CH0, RTC_GPIO0 |
| 5 | SENSOR_VN | J2:4 | SENSOR_VN | GPI39, ADC_H, ADC1_CH3, RTC_GPIO3 |
| 6 | IO34 | J2:5 | IO34 | GPI34, ADC1_CH6, RTC_GPIO4 |
| 7 | IO35 | J2:6 | IO35 | GPI35, ADC1_CH7, RTC_GPIO5 |
| 8 | IO32 | J2:7 | IO32 | GPIO32, XTAL_32K_P, ADC1_CH4, TOUCH9, RTC_GPIO9 |
| 9 | IO33 | J2:8 | IO33 | GPIO33, XTAL_32K_N, ADC1_CH5, TOUCH8, RTC_GPIO8 |
| 10 | IO25 | J2:9 | IO25 | GPIO25, DAC_1, ADC2_CH8, RTC_GPIO6, EMAC_RXD0 |
| 11 | IO26 | J2:10 | IO26 | GPIO26, DAC_2, ADC2_CH9, RTC_GPIO17, EMAC_RXD1 |
| 12 | IO27 | J2:11 | IO27 | GPIO27, ADC2_CH7, TOUCH7, RTC_GPIO17, EMAC_RX_DV |
| 13 | IO14 | J2:12 | IO14 | GPIO14, ADC2_CH6, TOUCH6, RTC_GPIO16, MTMS, HSPICLK, HS2_CLK, SD_CLK, EMAC_TXD2 |
| 14 | IO12 | J2:13 | IO12 | GPIO12, ADC2_CH5, TOUCH5, RTC_GPIO15, MTDI, HSPIQ, HS2_DATA2, SD_DATA2, EMAC_TXD3 |
| 15 | GND | J2:14 | GND | |
| 16 | IO13 | J2:15 | IO13 | GPIO13, ADC2_CH4, TOUCH4, RTC_GPIO14, MTCK, HSPID, HS2_DATA3, SD_DATA3, EMAC_RX_ER |
| 17 | SD2 | J2:16 | SD2 | GPIO9, SD_DATA2, SPIHD, HS1_DATA2, U1RXD |
| 18 | SD3 | J2:17 | SD3 | GPIO10, SD_DATA3, SPIWP, HS1_DATA3, U1TXD |
| 19 | CMD | J2:18 | CMD | GPIO11, SD_CMD, SPICS0, HS1_CMD, U1RTS |
| 20 | CLK | | | GPIO6, SD_CLK, SPICLK, HS1_CLK, U1CTS |
| 21 | SD0 | J3:18 | SD0 | GPIO7, SD_DATA0, SPIQ, HS1_DATA0, U2RTS |
| 22 | SD1 | J3:17 | SD1 | GPIO8, SD_DATA1, SPID, HS1_DATA1, U2CTS |
| 23 | IO15 | J3:16 | IO15 | GPIO15, ADC2_CH3, TOUCH3, MTDO, HSPICS0, RTC_GPIO13, HS2_CMD, SD_CMD, EMAC_RXD3 |
| 24 | IO2 | J3:15 | IO2 | GPIO2, ADC2_CH2, TOUCH2, RTC_GPIO12, HSPIHD, HS2_DATA1, SD_DATA0 |
| 25 | IO0 | J3:14 | IO0 | GPIO0, ADC2_CH1, TOUCH1, RTC_GPIO11, CLK_OUT1, EMAC_TX_CLK | 
| 26 | IO4 | J3:13 | IO4 | GPIO4, ADC2_CH0, TOUCH0, RTC_GPIO10, HSPIHD, HS2_DATA1, SD_DATA1, EMAC_TX_ER | 
| 27 | IO16 | J3:12 | IO16 | GPIO16, HS1_DATA4, U2RXD, EMAC_CLK_OUT |
| 28 | IO17 | J3:11 | IO17 | GPIO17, HS1_DATA5, U2TXD, EMAC_CLK_OUT_180 |
| 29 | IO5 | J3:10 | IO5 | GPIO5, VSPICS0, HS1_DATA6, EMAC_RX_CLK |
| 30 | IO18 | J3:9 | IO18 | GPIO18, VSPICLK, HS1_DATA7 |
| 31 | IO19 | J3:8 | IO19 | GPIO19, VSPIQ, U0CTS, EMAC_TXD0 |
| 32 | NC |  |  | |
| 33 | IO21 | J3:6 | IO21 | GPIO21, VSPIHD, EMAC_TX_EN |
| 34 | RXD0 | J3:5 | RXD0 | GPIO3, U0RXD, CLK_OUT2 |
| 35 | TXD0 | J3:4 | TXD0 | GPIO1, U0TXD, CLK_OUT3, EMAC_RXD2 |
| 36 | IO22 | J3:3 | IO22 | GPIO22, VSPIWP, U0RTS, EMAC_TXD1 |
| 37 | IO23 | J3:2 | IO23 | GPIO23, VSPID, HS1_STROBE |
| 38 | GND | J3:7 & J3:1 | GND | |
|  |  | J2:19 | EXT_5V | |

## Peripherals

http://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf

| Interface | Channels | Description |
| :--- | :--- | :--- |
| ADC | 16 ports | 2ch 12bit SAR ADCs (6+10) |
| Ultra Low Noise Analog | 2ch | 60dB gain by using larger capacitors |
| DAC | 2ch | 8bit |
| Touch | 10ch | Capacitive touch sensor |
| SD/SDIO/MMC Host Controller | 1ch | SD memory card v3.01. 4bit |
| SDIO Slave | 1ch | SDIO2.0 slave |
| Motor PWM | 3ch of 16bit timers generated PWM wave form |
| LED PWM | 16ch | 80MHz/16bits |
| UART | 3ch | 2ch UART (U0/U1/U2) |
| I2C | 2ch | master/slave |
| I2S/LCD | 1ch | Stereo I/O , Parallell LCD data output |
| Ir | 8ch | 8ch IR transmitter transmitter / receiver |
| Parallel QSPI | 3ch | Standard SPI, Dual SPI, Quad SPI |
| General Purpose SPI | 1ch | 64byte FIFO and DMA. |
| EMAC | 1ch | Ethernet MAC with MII/RMII interface |
| JATG | 1ch | Muxed with IO12-15 |


# Backup original ROM

まずは、出荷時に焼かれているfirmwareをbackupしておきましょう。

## esptool.py

今はesprissifにメンテされているesptoolで行いましょう。

```
$ git clone https://github.com/espressif/esptool.git
$ cd esptool
```

DevKitは32MBitsなので、4MBなので、

```
$ ./esptool.py --chip esp32 --port /dev/tty.SLAB_USBtoUART  --baud 921600 read_flash 0x0000 4194304 ../esp32.bin
```

M5StickCの場合は以下のようにbaudrateを落としてみてください。
```
$ python3 ./esptool.py --chip esp32 --port /dev/tty.usbserial-xxx --baud 115200 read_flash 0x0000 4194304 ../esp32-m5stickc.bin
```

で、とりあえず、全バックアップ。

|start addr | descritption |
|:---|:---|
| 0x1000 | bootloader.bin |
| 0x8000 | partitions_singleapp.bin |
| 0x10000 | your app |

# 開発環境のsetup

ESP8266 では、 Arduinoとして使う方が多いですが、せっかくesprissifが、FreeRTOSベースの
IoT Development Framework を公開してくれているので、今回はそれを使ってみましょう。

参考:
* http://www.espressif.com/sites/default/files/documentation/esp-idf_getting_started_guide_en.pdf
* http://esp-idf.readthedocs.io/en/latest/get-started/macos-setup-scratch.html

## CP210x driver install (optional)

ESP32-DevKitにはCP210xが搭載されていますので、USB UARTのドライバーの準備が必要です。
(よく使われているので既に環境構築済みの方はskip可能)

* http://jp.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers
などをご参考

## Required Package の install (optional)

(よく使われているので既に環境構築済みの方はskip可能)

```
$ brew install flex bison gperf
$ brew install gnu-sed gawk binutils gperftools gettext wget help2man libtool autoconf automake
```

```brew update```して、```$ Error: /usr/local must be writable!```　が出る場合は、

```
$ sudo chgrp -R admin /usr/local
$ sudo chmod -R g+w /usr/local
$ brew update
$ brew upgrade
```

などで対策を。

## install toolchain

ESP32 IDFには必須。
versionはとりあえず以下をinstallしてみて、version incompatibleと出た場合は、expectと出ているversionを入れてください。

```
$ wget https://dl.espressif.com/dl/xtensa-esp32-elf-osx-1.22.0-61-gab8375a-5.2.0.tar.gz
$ tar zxvf xtensa-esp32-elf-osx-1.22.0-61-gab8375a-5.2.0.tar.gz -C ~/bin
$ vi ~/.bash_profile
```

```~/.bash_profile
export PATH=~/bin/xtensa-esp32-elf/bin:$PATH
```

```
$ source ~/.bash_profile
$ xtensa-esp32-elf-gcc --version
xtensa-esp32-elf-gcc (crosstool-NG crosstool-ng-1.22.0-61-gab8375a) 5.2.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

pdfに入っているversionは古いので、新しいこの5.2.0が、4/30/2017時点では必要でした。

## Download ESP-IDF

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

```~/.bash_profile
export IDF_PATH=~/work/esp-idf
```

```
$ source ~/.bash_profile
```

### example を buildする

```
$ cp -r ~/work/esp-idf/examples/get-started/hello_world ~/work
$ cd ~/work/hello_world
$ make menuconfig
```

Default serial port を ```/dev/cu.SLAB_USBtoUART``` に設定 (ESP32-DevKitCのようにCP2102場合)

```
$ make all
$ make flash
```

で焼けるみたいです。

```
make flash
Flashing binaries to serial port /dev/cu.SLAB_USBtoUART (app at offset 0x10000)...
esptool.py v2.0-beta3
Connecting........_
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Flash params set to 0x0220
Compressed 15824 bytes to 9223...
Wrote 15824 bytes (9223 compressed) at 0x00001000 in 0.8 seconds (effective 155.0 kbit/s)...
Hash of data verified.
Compressed 363152 bytes to 171924...
..snip..
Wrote 3072 bytes (82 compressed) at 0x00008000 in 0.0 seconds (effective 2140.0 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting...
```

こんな風に。

## 実行

```
$ screen /dev/tty.SLAB_USBtoUART 115200
```

で、terminalを開いて

```
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_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:DIO, clock div:2
load:0x3fff0008,len:8
load:0x3fff0010,len:4404
load:0x40078000,len:11092
load:0x40080000,len:252
entry 0x40080034
I (45) boot: ESP-IDF v2.0-rc1-725-g07b61d5 2nd stage bootloader
I (45) boot: compile time 22:01:22
I (46) boot: Enabling RNG early entropy source...
I (64) boot: SPI Speed      : 40MHz
I (77) boot: SPI Mode       : DIO
I (89) boot: SPI Flash Size : 4MB
I (101) boot: Partition Table:
I (113) boot: ## Label            Usage          Type ST Offset   Length
I (135) boot:  0 nvs              WiFi data        01 02 00009000 00006000
I (159) boot:  1 phy_init         RF data          01 01 0000f000 00001000
I (182) boot:  2 factory          factory app      00 00 00010000 00100000
I (205) boot: End of partition table
I (218) boot: Disabling RNG early entropy source...
I (235) boot: Loading app partition at offset 00010000
I (761) boot: segment 0: paddr=0x00010018 vaddr=0x00000000 size=0x0ffe8 ( 65512) 
I (762) boot: segment 1: paddr=0x00020008 vaddr=0x3f400010 size=0x0660c ( 26124) map
I (778) boot: segment 2: paddr=0x0002661c vaddr=0x3ffb0000 size=0x02ae4 ( 10980) load
I (808) boot: segment 3: paddr=0x00029108 vaddr=0x40080000 size=0x00400 (  1024) load
I (831) boot: segment 4: paddr=0x00029510 vaddr=0x40080400 size=0x12a7c ( 76412) load
I (893) boot: segment 5: paddr=0x0003bf94 vaddr=0x400c0000 size=0x00000 (     0) load
I (894) boot: segment 6: paddr=0x0003bf9c vaddr=0x00000000 size=0x0406c ( 16492) 
I (914) boot: segment 7: paddr=0x00040010 vaddr=0x400d0018 size=0x28a68 (166504) map
I (940) cpu_start: Pro cpu up.
I (951) cpu_start: Starting app cpu, entry point is 0x40080d30
I (0) cpu_start: App cpu up.
I (984) heap_alloc_caps: Initializing. RAM available for dynamic allocation:
I (1006) heap_alloc_caps: At 3FFAE2A0 len 00001D60 (7 KiB): DRAM
I (1027) heap_alloc_caps: At 3FFB60A8 len 00029F58 (167 KiB): DRAM
I (1048) heap_alloc_caps: At 3FFE0440 len 00003BC0 (14 KiB): D/IRAM
I (1069) heap_alloc_caps: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (1091) heap_alloc_caps: At 40092E7C len 0000D184 (52 KiB): IRAM
I (1112) cpu_start: Pro cpu start user code
I (1169) cpu_start: Starting scheduler on PRO CPU.
Hello world!
Restarting in 10 seconds...
I (204) cpu_start: Starting scheduler on APP CPU.
Restarting in 9 seconds...
Restarting in 8 seconds...
Restarting in 7 seconds...
Restarting in 6 seconds...
Restarting in 5 seconds...
Restarting in 4 seconds...
```

みたいになっていれば成功です。

つづく。

# 開発環境構築

http://esp-idf.readthedocs.io/en/latest/get-started/eclipse-setup.html

## Eclipse

Eclipseを使って開発が可能です. しかし全てではなく、 ```make menuconfig``` みたいのは必須です。

* コード開発支援
* build
* flash

## IDF Monitor

```
$ make monitor
```

* 基本的にはserial terminalプログラムです.
    * 関数名の自動表示 (```0x4________``` のようなアドレスを、```addr2line``` を使って、関数名やコードの場所を示しま
    * ```Ctrl+J``` : Exit
    * ```Ctrl+T``` ```Ctrl-H``` : help
    * ```Ctrl+T``` ```Ctrl+F``` : Quick compile & Flash : ```make flash```
    * ```Ctrl+T``` ```Ctrl+A``` : Quick compile & Flash : ```make app-flash```
    * ```Ctrl+T``` ```Ctrl+R``` : Quick Reset

## GDBStub

```
$ make menuconfig
```

At```Component config``` -> ```ESP32-specific``` -> ```Panic handler behaviour```, select ```Invoke GDBStub```

optionが有効な際には、idf_monitor経由で利用できます。






### 参考 : Mac の screen の　終了のさせ方

screen の画面で control + a を押して、次に k を押し、Really kill this window [y/n] と表示されるので、 y

# Appendix

ESP32 hardware

* Datasheet : http://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf
* Pin list : http://www.espressif.com/sites/default/files/documentation/esp32_chip_pin_list_en.pdf
* Pin out : http://www.espressif.com/en/support/download/documents?keys=ESP32+Pinout&field_type_tid%5B%5D=13
* Technical Reference Manual : http://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf
* Hardware Design Guide : http://www.espressif.com/sites/default/files/documentation/esp32_hardware_design_guidelines_en.pdf

* ESP32 / ESP32-DevKit Schematic : http://esp-idf.readthedocs.io/en/latest/hw-reference/modules-and-boards.html#esp32-core-board-v2-esp32-devkitc

* Errata : http://espressif.com/sites/default/files/documentation/eco_and_workarounds_for_bugs_in_esp32_en.pdf

* start guide : http://www.espressif.com/sites/default/files/documentation/esp-idf_getting_started_guide_en.pdf

ESP32 Software

* ESP-IDF Programming Guide : http://esp-idf.readthedocs.io/en/latest/?badge=latest

* http://esp-idf.readthedocs.io/en/latest/
* http://www.espressif.com/sites/default/files/documentation/esp-idf_getting_started_guide_en.pdf