ESP-IDFを使ってみる

ESP32-C2(ESP8684)開発ボード

2022年1月時点では、Espressif Systemsからの公式アナウンスは何もありませんが、 ESP8684、ESP8685として開発されているコアが有ります。
ESP8685はESP32-C3のバリエーションで、ESP32-C3コアからExrternal SPI Flashとの接続専用GPIO(GPIO11-17)が削除されているコアで、
そのままESP8685の名前で2022年3月に、既に製品版の出荷が始まっています。

esp-idfのgithubには「esp8684: rename target to esp32c2」のコメントが沢山有り、
ESP8684---->ESP32-C2として発表される模様です。

こちら
に少しだけESP32-C2に関する情報が有ります。

ESP32-C2 is a lower-end chip compared to ESP32-C3, with less RAM and peripherals.
Support for this chip is being added to ESP-IDF at the moment.
I can't say yet whether ESP32-C2 will be marketed and sold only as part of ESP8684 package or separately as well.


ESP32-C2は、ESP32-C3と比較してローエンドのチップであり、RAMと周辺機器が少なくなっています。
現在、このチップのサポートがESP-IDFに追加されています。
ESP32-C2がESP8684パッケージの一部としてのみ販売され、個別に販売されるかどうかはまだわかりません。

こ ちらにESP8684-DevKitM-1の資料が公開されています。
8684の名前がそのまま使われています。
こ ちらにESP8684シリーズのDataSheetが公開されています。
これを見る限り、ESP32-C3とは以下が異なります。
ESP32-C2は、ESP32-C3の低周波数版、低機能版の位置づけです。
ROM+SRAMの総量はどちらも同じですが、割り当てが変更されています。
Advanced Peripheral Interfacesから、I2S、Remote control(赤外線)、TWAI(CAN)が無くなっています。
また、ESP32-C3ではGPIO18、GPIO19をUSB Serial/JTAG Controller Consoleとして使えますが、
ESP32-C2ではこの機能は有りません。

ESP32-C3 ESP32-C2
CPU 32-bit RISC-V single-core processor, up to 160MHz 32-bit RISC-V single-core processor, up to 120MHz
Memory 384 KB ROM
400 KB SRAM
576 KB ROM
272 KB SRAM
Wi-Fi 802.11 b/g/n
802.11 b/g/n
Bluetooth Bluetooth 5.0/Bluetooth Mesh
Bluetooth 5.0
Advanced Peripheral Interfaces • 22 or 16 × programmable GPIOs
• 2 × 12-bit SAR ADCs, up to 6 channels
• 1 × temperature sensor
• 3 × SPI
• 2 × UART
• 1 × I2C
• 1 × I2S
• Remote control peripheral, with 2 transmit channels and 2 receive channels
• LED PWM controller, up to 6 channels
• General DMA controller, with 3 transmit channels and 3 receive channels
• 1 × TWAI controller (compatible with ISO 11898-1)
• 1 × USB Serial/JTAG Controller Console
• 14 × programmable GPIOs
• 1 × 12-bit SAR ADCs, up to 5 channels
• 1 × temperature sensor
• 3 × SPI
• 2 × UART
• 1 × I2C


• LED PWM controller, up to 6 channels
• General DMA controller, with 1 transmit channels and 1 receive channels





2022年4月29日に、Espressif Systemsからの公式アナウンスがようやく 公開されました。
公式アナウンスによると、SoCの名前がESP32-C2、Variant がESP8684と、なんだか面倒なことになっています。
こ ちらにESP32の一覧が有ります。
2022年5月時点でESP8684-MINI-1として、既に製品版の出荷が始まっています。
ESP32-C2と呼ぶか、ESP8684と呼ぶか、混乱しそうです。
Espressif Systemsの公式ページの Products>SoCsにESP32-C2が追加されています。
このSoCが潤沢に市場に出回れば、ESP8266/8285はおそらく完全に姿を消すでしょう。



2022年の11月にようやく開発ボードを入手しました。
ESPC2-12モジュールが使われています。
CH340C + AMS1117 と言う、ESP32開発ボードではオーソドックスな構成です。
GPIOはGPIO00からGPIO07と、GPIO09、GPIO10、GPIO18の11本を使うことができます。
やたらにGNDが多いです。


なぜかこのモジュールからはGPIO08が出ていません。
GPIO08はBoot Strapの一部ですが、内部でPullUpされているようです。



GPIO09でBootModeを手動で切り替えることができます。


パッと見たところ、パックマンマーキングのDOITブランドに見えますが、よくよく見るとDOITINGブランドです。
調べてみると、どちらも深圳四博智联科技有限公司(Shenzhen Sibo Zhilian Technology Co., Ltd)でした。
右側はDOITブランドのESP12Eです。



通常、ESP32開発ボードのクリスタルは40MHzの物が使われますが、このモジュールには26MHzの物が使われていま す。
ロギング機能を使うと、表示される文字が文字化けします。
menuconfigの以下のメニューで、クリスタルの周波数を26MHzに変更する必要が有ります。


こちらのコー ドで、ESP32C3とパフォーマンスを比べてみました。
動作周波数の違いが結果に表れています。

Dhrystone(MIPS) Whetstones(MIPS)
ESP32C3@160 167 8.3
ESP32C2@120 142 8.3

esp-idfには多数のサンプルコードが付属しています。
これを見る限り、ESP32-C2だけで利用できる機能はBLE HCIだけです。
$ grep -rn  "Supported Targets" * | grep ESP32-C2 | grep -v "ESP32 "
bluetooth/nimble/ble_phy/phy_prph/README.md:1:| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-S3 |
bluetooth/nimble/ble_phy/phy_cent/README.md:1:| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-S3 |
bluetooth/nimble/hci/README.md:1:| Supported Targets | ESP32-C2 |
bluetooth/bluedroid/ble_50/peroidic_adv/README.md:1:| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-H2 | ESP32-S3 |
bluetooth/bluedroid/ble_50/ble50_security_server/README.md:1:| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-H2 | ESP32-S3 |
bluetooth/bluedroid/ble_50/peroidic_sync/README.md:1:| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-H2 | ESP32-S3 |
bluetooth/bluedroid/ble_50/multi-adv/README.md:1:| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-S3 |
bluetooth/bluedroid/ble_50/ble50_security_client/README.md:1:| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-H2 | ESP32-S3 |
peripherals/temp_sensor/README.md:1:| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-S2 | ESP32-S3 |
peripherals/spi_slave_hd/segment_mode/seg_slave/README.md:1:| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-S2 | ESP32-S3 |

このサンプルを実行してみましたが、どのようなことが出来るのかよく分かりません。
サンプルのREADMEを読むと、GPIO8/9 を UART1 の TxD/RxDとして使用できる様ですが、
ESP8684のデータシートを見ても、BLE HCIがどのような機能なのか記載が有りません。
READMEには

これは、HCI インターフェイスとして UART を使用する BLE コントローラーです。
menuconfig で UART 番号と UART ボーレートの設定を行うことができます。
ピン 8、9 は UART1 の TxD、RxD PIN として使用されます。

と記載されていますが、menuconfigのどの項目なのかも良く分かりません。
これが実行時のログです。
I (371) cpu_start: Starting scheduler.
I (399) phy_init: phy_version 200,3610ac5,Jul  1 2022,15:24:10
set uart pin tx:8, rx:9.
set rts:-1, cts:-1.
set baud_rate:115200.
I (429) uart: ALREADY NULL
W (429) uart: ESP_INTR_FLAG_IRAM flag is set while CONFIG_UART_ISR_IN_IRAM is not enabled, flag updated
I (439) uart: queue free spaces: 20
controller lib commit: [ba6efa0]
controller rom commit: [3314f9d]
I (449) system_api: Base MAC address is not set
I (459) system_api: read default base MAC address from EFUSE

ESP32-C2 は ESP32-C3 のローコスト版の位置付けですが、まだ出始めなので、現時点では、ESP32-C3開発ボードの方が少し安いです。
2022年11月時点の価格:
ESP32-C3開発ボード $1.83 + 送料
ESP32-C2開発ボード $2.41 + 送料

ESP32-C2 は ESP32-C3 と違って、 USB Serial/JTAG Controller Console の機能が有りません。
USB経由で書き込む時は、必ずUSB-TTL変換チップが必要になります。
一方、ESP32-C2 には必ず FLASH が内蔵されていますが、ESP32-C3 には FLASHが内蔵されていないモデルが有ります。
最終的にどちらが安くなるか、現時点では分かりません。



ESP32-C2はesp-idf v5.0からのサポートですが、v5.0にはROM Libraryに関するバグが有り、正しくビルドできないことが有ります。
また、v5.0では i2c が正しく動きません。
ESP32-C2に関しては、v5.1で色々直っていますので、実質v5.1からのサポートと考えた方がいいです。
ESP-IDFのVer4.xとVer5.xでは、色々大きな変更が有り、中には互換性のない変更も有ります。
こ ちらに移行ガイドが公開されています。



ESP32-C2では、なぜかCONFIG_NEWLIB_NANO_FORMAT が有効になっています。


ここが有効になっているとint64_tが正しく表示できません。
int64_t time = esp_timer_get_time();
ESP_LOGI(TAG, "time=%lld us", time);

このコードを実行すると以下の様に表示されます。
I (386) MAIN: time=ld us

CONFIG_NEWLIB_NANO_FORMATを無効にすることで、int64_tも正しく表示されます。
CONFIG_NEWLIB_NANO_FORMATが有効な場合、ROMにあるprintf/scanfが使われ、アプリケーションのバイナリ サーズが少しだけ小さくなります。
ESP32-C2はRAMのサイズが小さいので、ここが有効になっていますが、ROMにあるprintf/scanfは、64ビット整数フォー マットなどをサポートしていない
「nanoバージョン」と呼ばれるバージョンです。
CONFIG_NEWLIB_NANO_FORMATを無効にすることで「normalバージョン」のprintf/scanfが使われますが、 アプリケーションのバイナリサーズが少しだけ大きくなります。
I (386) MAIN: time=396471 us

続く....