『昼夜逆転』工作室
[トップページへ戻る]

ESP32-C3をSPI-Bootモードで使用する

タイトル画像
2023年11月
この記事では ESP32-C3-WROOM-02-N4(以降、ESP32-C3)について、 を説明します。これらに関する VS Code + PlatformIO環境での情報がはっきりしなかったので、ここに記録しておきます。
準備編:「ESP32の開発環境をアップデートする

ESP32-C3を SPI Bootモードで起動する

ブートモードの違い

ESP32-C3はブートストラップ(GPIO2,8,9)の設定によって SPI Bootモードまたは Download Bootモードで起動します。 どちらも USB-シリアル変換なしに USB接続でプログラムを書き込むことができます。ただし、その後の挙動が違います。
SPI Bootの場合、直ちにプログラムが開始されます。デバッグモードであれば内蔵デバッガ(JTAG)を使うことができます。 Download Bootの場合、プログラムを開始するには特定の手順で ESP32-C3を再起動する必要があります。 そのため内蔵デバッガを使うこともできません(再起動すると PC-デバッガ間のセッションが切れるので)。
ブートストラップのデフォルト状態は SPI Bootモード向けになっています。設定値や配線の詳細はデータシート ESP32-C3-WROOM-02 Datasheet等を参照してください。

ESP32-C3とUSBを配線する

配線
USB(PC)三端子レギュレータESP32-C3
VBUS(赤)/5V IN
OUT/3.3V 3V3
EN → プルアップ/10kΩ
D-(白) IO18/USB_D-
D+(緑) IO19/USB_D+
IO2 → プルアップ/10kΩ
IO8 → 何も接続しない(またはプルアップ/10kΩ)
IO9 → 何も接続しない(内部でプルアップされている)
IO1 → LED → 470Ω → GND(この配線はLチカのため)
GND(黒) GND GND

【注意】ESP32-C3の電源ピンへ5Vを突っ込まないこと!  ※データシートより USBのD+/D-はESP32-C3へ直結してよさそう。
GPIO8は、リリースモードでビルドして書き込む場合は何も接続しなくてよいです。 内蔵デバッガ(JTAG)を利用する場合はプルアップする必要がありそうです(次章で説明)。
GPIO1の配線は書き込みには関係ありません。Lチカの配線です。抵抗は数百Ωで適当に。
書き込み完了後、GPIO2,8,9,18,19は通常のGPIOとして使用できます。  ※アプリに応じてプルアップ抵抗や配線を外す必要はある。

ESP32-C3をPCに接続する

PCの USBコネクタに接続すると自動的にデバイスドライバがインストールされます。
コントロールパネル(または[Win]+[x]) - デバイスマネージャー - ユニバーサル シリアル バス デバイス を開き、 「USB JTAG/serial debug unit」があることを確認します。
その「USB JTAG/serial debug unit」を右クリック - ドライバーの更新 - ドライバーを自動的に検索 でドライバを更新します。

ESP32-C3へプログラムを書き込む

リリースモードでのビルド、書き込み操作は従来と変わりません。 ここではデバッグモードについて説明します。

Lチカのプロジェクト

ダウンロード esp32c3test.zip(プロジェクト一式)
開発環境: Windows10, VS Code + PlatformIO

デバッグモードでビルドして書き込む

platformio.iniに「debug_tool = esp-builtin」を追加します(15行目)。
main.cの任意の箇所にブレークポイントを張ります(行番号横の丸印)。

コード コード

VS Codeを「実行とデバッグ」画面に切り替え、「デバッグの開始」(三角マーク)を押下します。

コード

デバッグ用のビルドが開始されます(ターミナル画面で確認)。
ビルド完了と同時にデバッグモードが開始され、プログラムが自動的に書き込まれます(デバッグコンソール画面で確認)。

なお、ESP32-C3のブート時に GPIO8が未接続または GND接続だった場合、デバッガが起動しませんでした。

エラー エラー

デバッグする

プログラムは書込み完了と同時に開始されます。ブレークポイントを張っていればそこで一時停止します。
画面上部のデバッグメニューバーからステップ実行などが操作できます。右端の'□'でデバッグ動作を終了します。

コード
※13行目のブレークポイントで一時停止している。

SPI Bootモードで Serial.print()を使うには

内蔵デバッガ(JTAG)だけでなく「printfデバッグ」も使いたいです。 しかし SPI Bootモードのとき、デフォルトのビルドフラグでは Serial.print()の内容がターミナル画面に出力されません。 解決するには platformio.iniに追加の記述が必要です。

platformio.iniの記述

17,18,19行目を追加します。 【参考】 USB Settings for Logging with the ESP32-S3 in PlatformIO

Serialの出力

-DARDUINO_USB_CDC_ON_BOOTは、シリアル通信が UARTと CDCのどちらで実現されるかを設定します。
'0'のとき、Serialクラスの入出力は UARTで実現されます(デフォルト)。
'1'のとき、Serialクラスの入出力は CDCで実現されます。
※UART…Universal Asynchronous Receiver Transmitter; USB CDC…USB Communications Device Class

-DARDUINO_USB_MODEは、USB機能を OTGと CDCのどちらの動作で使用するかを設定します。
'0'のとき、USBを OTGの動作で使用します(デフォルト)。
'1'のとき、USBを CDCの動作で使用します。
※USB OTG…USB On-the-Go

これらの設定により、Serial.print()の内容が出力されるようになります。 デバッグビルドとリリースビルドのどちらでも有効です。

Serialの出力

SPI Bootモードでエラーログを出力するには

Serial.print()同様、log_e()の内容を出力することもできます。

platformio.iniの記述

20行目を追加します。

log_eの出力

-DCORE_DEBUG_LEVELは、出力するエラーレベルを指定します。0~5の値が定義されています(デフォルトは0)。
0:None 1:Error 2:Warn 3:Info 4:Debug 5:Verbose

プログラムの記述

Serial.begin()以降に「Serial.setDebugOutput(true);」を記述します(8行目)。
任意の箇所に log_e()を記述します(21行目)。

ターミナル画面に log_e()の内容が出力されています。

log_eの出力

◆ ◆ ◆

VS Code + PlatformIO環境から SPI-Bootモードで ESP32-C3にプログラムを書き込むことができました。 基板上に SPI-Bootモードの配線をしておけば、ESP32-C3を組み込んだ後からでも USBケーブル1本でプログラムを書き込むことができます。 GPIO2,8,9,18,19を書込み専用に使用しても、他に10個のGPIOが使えます(RXD:GPIO20, TXD:GPIO21を含む)。

応用例
GPIO2,8を I2Cの SDA/SCLに割り当てるのも一つの手だと思います。
写真は GPIO2,8を LCDの SDA/SCLに配線した例です。書き込みと LCD動作が配線の変更なしで実現しています。 LCD側に内蔵された SDA/SCLのプルアップ抵抗(10kΩ)を SPI-Boot設定に利用しています。