見出し画像

ESP32-S3-WROOM-1-N16R8のブートモードを調べてみた。


ESP32-S3-WROOM-1-N16R8とは

ESP32のブートモードを調べてみた第二弾です。第一弾はこちら。

ESP32-S3-WROOM-1-N16R8は、秋月電子で売られている ESP32-S3 というマイコンです。2024/07/30時点で620円です。ESP32-C3と比べると倍程度の値段です。売りとしては、ESP32-C3と比べると USB-OTGとして機能する点が大きいですよね。BLE以外にもUSBデバイスも作ることができます。

ESP32-C3の上位互換のような仕様になっていますので、ブートモードについて、そこまで調べなくても大体同じでしょと思っていましたが、少しばかり癖があることがわかりました。では、ESP32-C3と同じく、調査していきたいと思います。

参考に DevKitC のページの追加しておきます。

ブートモードについて

テクニカルノート(8.2 Boot Mode Control)によると ESP32-C3同様に3つのモードが存在しているようです。説明は割愛いたします。

  • SPI Boot mode

  • SPI Download boot mode

  • Joint Download boot mode

上の秋月電子の商品ページに、ESP32-S3のデータシートとテクニカルノートのPDFリンクがあるので合わせてご覧いただくとわかりやすいです。

ちなみにデータシートでは、SPI Boot modeとJoint Download boot modeの2つしか掲載されていません。

ESP32-C3同様に、ブートモードの決定は、ENがLOW→HIGHになったタイミングのようです。いわゆる電源投入時ということでしょうか。
UART0 の出力に、ブートモードと思われるメッセージが表示されていますので、それで判定を行いました。

rst:0x1 (POWERON),boot:0x0 (DOWNLOAD(USB/UART0))
略
waiting for download

このブートモードに影響を及ぼす GPIO ですが、テクニカルノートでは、以下の4つでした。なので、実質4bit(0x0~0xf)となります。

  • GPIO0(BOOT) ※上位bit

  • GPIO46

  • GPIO1

  • GPIO2 ※下位bit

ですが、検証をすると、0x2a とよくわからないブートモードが表示されることがありました。
0x2? があってもブートモードの動作には直接関係ないようですが、気になって実験したところ、GPIO3 が HIGH の時 0x20 が加算されるようです。
GPIO3 は、テクニカルノートでは、JTAG のモードに影響を及ぼすみたいですが、今回は GPIO3 は LOW にして検証します。

GPIOとブートモードの関連は以下の通りです。

GPIOとboot mode の関連
boot mode と UART0 のメッセージ

ESP32-S3でも、ドキュメントにないモードが存在しているようです。

  • DOWNLOAD(USB/UART0) (Joint Download Boot mode)

  • SPI_FLASH_BOOT (未定義)

  • SPI_DOWNLOAD_BOOT (SPI Download Boot mode)

  • UART0_BOOT (未定義)

  • SPI_FAST_FLASH_BOOT (SPI Boot mode)

検証に使った回路について

もうすでにDIP化基板を作成してしまったので、それで検証をしました。その回路を掲載しておきます。ESP32-C3を参考に最低限の回路にしています。

検証の回路

検証項目は、ESP32-C3同様に以下3点です。

  • UART0 でのプログラム書き出しができるかどうか

  • USB(内臓USBシリアル) でプログラム書き出しができるかどうか

  • USB(内臓USBシリアル) で JTAG によるデバッグができるかどうか

UART0 で書き込みができるか

UART0で書き込みできるかの検証結果です。

UART0の書き込み結果

だいたいESP32-C3と同じような結果です。Joint Download Boot modeと
UART0_BOOTで成功しました。
0x0~0x3(GPIO46がLOW)、0x7で成功ということですね。

USBで書き込みができるか

USBで書き込みした検証結果です。

USBの書き込み結果

こちらもESP32-C3と同じく、Joint Download Boot modeでは成功しました。C3と異なる点は、SPI Boot mode でも書き込みに成功しています。
0x0~0x3(GPIO46がLOW)、0x8~0xf(GPIO0(BOOT)がLOW)の時、USBで書き込みができるということになります。

USBで JTAGできるか

こちらも検証結果です。

JTAGの結果

JTAGについては仕様がよくわかっていませんが、マイコンが動作することによってリアルタイムにデバッグ可能になることを考えると、DOWNLOADモードでは JTAG が動作しないということかなと思いました。

ここでも、ESP32-C3と同様に、ビルドオプションに
-DARDUINO_USB_CDC_ON_BOOT=1
-DARDUINO_USB_MODE=1
は指定していません。(指定するとJTAGが途中で止まってしまうため)

最初の表で調べた通常起動するブートモードである、SPI_FLASH_BOOT (未定義)、SPI Boot modeでJTAGが成功しました。
0x4と0x8~0xf(GPIO0(BOOT)がLOW)であればJTAGが成功ということですね。

検証結果のまとめ

ではまとめです。

  • UART0での書き込みは、0x0~0x3(GPIO46がLOW)、0x8~0xf(GPIO0(BOOT)がLOW)の時

  • USBでの書き込みは、0x0~0x3(GPIO46がLOW)、0x8~0xf(GPIO0(BOOT)がLOW)の時

  • JTAGでのデバッグは、0x4と0x8~0xf(GPIO0(BOOT)がLOW)の時

ということから、書き込みに関しては、GPIO46をLOW(GNDに接続)しておくのが無難のようです。
ただ、データシート(3.3 Strapping Pins)では、GPIO46は PULL-DOWN接続がデフォルトらしいので、特に意識しなくても問題ないかなと思います。

JTAGを使いたい場合は、GPIO0をLOWにする必要があるので、こちらも EN(RST)とGPIO0(BOOT)をそれぞれGNDに落とすためのスイッチボタンを追加したほうがよさそうです。
JTAGに関係しそうな GPIO3 ですが、デフォルトが floating なので、確実に操作したいなら、GPIO3を GNDに落とすなりしたほうがいいのかもですが、検証した範囲では特にどちらもでいいような気がします。

さらにまとめるなら、GPIO46 をプロジェクトで使用しなければ、GPIO1、GPIO2は自由に使えます。JTAGを意識しなければ、GPIO3も使えそうです。

ブートモードに関しては、EN(RST) と GPIO0(BOOT) のボタンさえあれば特に問題ないと思います。GPIO46はGNDに落とすか、使わないのがよさそうです。

最後に

いかがでしたでしょうか。結果からみると、あまり意味のない検証でした。
ですが、ブートモードについて把握しているとプロジェクト作成に役立つかなとも思います。

最後までお読みいただいてありがとうございます。

この記事が気に入ったらサポートをしてみませんか?