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」
等を参照してください。
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 |
PCの USBコネクタに接続すると自動的にデバイスドライバがインストールされます。
コントロールパネル(または[Win]+[x]) - デバイスマネージャー - ユニバーサル シリアル バス デバイス を開き、
「USB JTAG/serial debug unit」があることを確認します。
その「USB JTAG/serial debug unit」を右クリック - ドライバーの更新 - ドライバーを自動的に検索 でドライバを更新します。
リリースモードでのビルド、書き込み操作は従来と変わりません。 ここではデバッグモードについて説明します。
platformio.iniに「debug_tool = esp-builtin」を追加します(15行目)。
main.cの任意の箇所にブレークポイントを張ります(行番号横の丸印)。
VS Codeを「実行とデバッグ」画面に切り替え、「デバッグの開始」(三角マーク)を押下します。
デバッグ用のビルドが開始されます(ターミナル画面で確認)。
ビルド完了と同時にデバッグモードが開始され、プログラムが自動的に書き込まれます(デバッグコンソール画面で確認)。
なお、ESP32-C3のブート時に GPIO8が未接続または GND接続だった場合、デバッガが起動しませんでした。
プログラムは書込み完了と同時に開始されます。ブレークポイントを張っていればそこで一時停止します。
画面上部のデバッグメニューバーからステップ実行などが操作できます。右端の'□'でデバッグ動作を終了します。
※13行目のブレークポイントで一時停止している。
内蔵デバッガ(JTAG)だけでなく「printfデバッグ」も使いたいです。 しかし SPI Bootモードのとき、デフォルトのビルドフラグでは Serial.print()の内容がターミナル画面に出力されません。 解決するには platformio.iniに追加の記述が必要です。
17,18,19行目を追加します。
【参考】
USB Settings for Logging with the ESP32-S3 in PlatformIO
-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.print()同様、log_e()の内容を出力することもできます。
20行目を追加します。
-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()の内容が出力されています。
VS Code + PlatformIO環境から SPI-Bootモードで ESP32-C3にプログラムを書き込むことができました。
基板上に SPI-Bootモードの配線をしておけば、ESP32-C3を組み込んだ後からでも USBケーブル1本でプログラムを書き込むことができます。
GPIO2,8,9,18,19を書込み専用に使用しても、他に10個のGPIOが使えます(RXD:GPIO20, TXD:GPIO21を含む)。