ESP32-S3のボード設定を解析してみた

今回はESP32-S3のボード設定を解析してみました。
なんとなくデフォルトの設定で書き込みをしていましたが、
中身を深く知ることは大切なことです。

開発環境はArduinIDEで試してみます。

## ボード設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/d686433d-7ccd-47ce-9d25-746c50117fc0.png)

### ボード
今回は「ESP32S3 Dev Module」を使用します。

### USB CDC On Boot
ESP32-S3にはUSBポートとUARTポートがあります。
この設定を無効にするとUSBポートは使用できませんが、
有効にするとESP32-S3は起動時にUSB CDCデバイスとして認識され、PCや他のホストデバイスとシリアル通信が可能になります。
プログラムの書き込みも可能となります。
しかしESP32-S3用のUSB CDCドライバをインストールする必要がある場合があります。
詳しい解説は以下のサイトを参照
https://zenn.dev/nananauno/articles/6514c05c61e0d4

### CPU Frequency
CPU（Central Processing Unit）が動作するクロック周波数を指します。
数値が高いほど処理速度は向上しますが、その分消費電力や温度も高くなります。

### Core Debug Level
ESP-IDF（Espressif IoT Development Framework）が提供するデバッグ機能の一部です。
デバッグ情報には、ログメッセージ、エラーメッセージ、警告メッセージ、情報メッセージなどが含まれます。
None: デバッグ情報を出力しません。
Error: 重大なエラーメッセージのみを出力します。
Warning: エラーメッセージと警告メッセージを出力します。
Info: エラーメッセージ、警告メッセージ、および情報メッセージを出力します。
Debug: エラーメッセージ、警告メッセージ、情報メッセージ、およびデバッグメッセージを出力します。
Verbose: すべてのデバッグ情報を出力します。
【使用例】
開発初期段階:
DebugやVerboseレベルを設定して、詳細なデバッグ情報を収集し、問題の特定やトラブルシューティングを行います。

開発後期段階:
InfoやWarningレベルを設定して、重要な情報のみを出力し、パフォーマンスを最適化します。

リリース版:
Errorレベルを設定して、重大なエラーのみを出力し、リソースの使用を最小限に抑えます。
### USB DFU On Boot
USB DFU（Device Firmware Upgrade）は、
ESP32-S3が起動した直後からUSB経由でファームウェア更新の可否設定になります。
（通常のシリアル書き込み（UART）を使わず、直接USB経由で書き込みが可能）

### Erase All Flash Before Sketch Upload
スケッチ（ファームウェア）をアップロードする前に、フラッシュメモリ全体を消去するオプションです。
ファイルシステムや設定データが破損している場合や、新しいスケッチと互換性のないデータが残っている場合に有効です。

### Events Run On
ESP32-S3のイベント処理をどのCPUコアで実行するかを設定するオプションです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/0e331aab-7408-4fa5-a3ed-9be58436db36.png)


### Flash Mode
QIO 80MHz
 4本のデータライン（MOSI, MISO, WP, HOLD）を使用して80MHz通信。
 互換性が広く対応している
QIO 120MHz
 4本のデータライン（MOSI, MISO, WP, HOLD）を使用して120MHz通信。
 120MHz用のSPIフラッシュが必要

DIO 80MHz
 2本のデータライン（MOSI, MISO）を使用。一番低速。あまり推奨しない。

OPI 80MHz
 8本のデータライン（オクタル接続） を使用してデータ転送を行う方式。
 対応フラッシュが必要。
 AI、画像処理など高速処理に向いている

### Flash Size
 Flash Size（フラッシュサイズ）は、外部SPIフラッシュメモリの容量を指します。 

### JTAG Adapter
 JTAGを使用してデバッグを行うときの設定です。
  1️⃣ Integrated USB JTAG（内蔵USB JTAG）
📌 特徴
ESP32-S3には、USB経由でJTAGデバッグができる機能が内蔵されています。
これにより、追加のJTAGアダプターを必要とせず、USBケーブル1本でJTAGデバッグが可能になります。

✅ メリット
追加のJTAGアダプターが不要（ESP32-S3内蔵）
USBケーブル1本でデバッグできる
FTDIアダプターのような外部ハードウェアなしでJTAG機能を利用可能
OpenOCDを使用して簡単にGDBデバッグができる
配線が不要で、設定も比較的簡単
安価（ハードウェアを追加購入する必要がない）

❌ デメリット
データ転送速度が遅め（外部JTAGより低速）
一部の高度なデバッグ機能が制限される
電源供給の安定性に影響を受けやすい
一部の環境ではUSBドライバの設定が必要

🔧 こんな時に使う
✅ 手軽にデバッグしたい
✅ 追加のJTAGアダプターを買いたくない
✅ ESP32-S3専用のデバッグを行う
✅ 基本的なデバッグ作業のみ（ステップ実行、ブレークポイント設定など）


 2️⃣ FTDI Adapter（FT2232HLなどの外部JTAGアダプター）
📌 特徴
FTDI（FT2232HLやFT232Hなど）を使用したJTAGアダプターは、
ESP32-S3のGPIOピンに直接JTAG信号を接続してデバッグを行う方法です。
FTDIベースのJTAGアダプターは広く使われており、ESP32-S3だけでなく他のマイコンやFPGAにも対応できます。

✅ メリット
安定したデバッグが可能（USB JTAGより信号品質が良い）
ESP32-S3以外のデバイスにも対応可能
転送速度が比較的速い
FT2232HLベースのアダプターは安価で入手しやすい
標準的なJTAGプロトコルに対応し、他のデバッグツールでも使用可能
❌ デメリット
追加のハードウェアが必要（FTDI JTAGアダプター）
ESP32-S3専用ではないので設定が複雑になることがある
配線が必要（JTAGピンとFTDIを接続する）

🔧 こんな時に使う
✅ 安定したデバッグをしたい
✅ ESP32-S3以外のデバイスもデバッグしたい
✅ 高速なデバッグが必要
✅ FTDIアダプターをすでに持っている


3️⃣ ESP USB Bridge（ESP-PROGなど）
📌 特徴
ESP USB Bridge（例：ESP-PROG）は、Espressif社が提供するデバッグツールで、USBをJTAGやUARTに変換するアダプターです。
ESP-PROGは、JTAGデバッグとシリアル通信の両方をサポートしているため、デバッグ用途に適しています。

✅ メリット
安定したJTAGデバッグが可能
UART（シリアル通信）機能も搭載
Espressif純正のため、ESP32-S3との互換性が高い
専用のOpenOCD設定ファイルが用意されており、セットアップが簡単
FTDIよりもESP32-S3に最適化されている
追加のデバッグ機能（リセットボタン、電源供給など）あり
❌ デメリット
専用ハードウェア（ESP-PROG）が必要
ESP32-S3専用のため、他のマイコンやFPGAには使えない
FTDIベースのアダプターより高価な場合がある

🔧 こんな時に使う
✅ ESP32-S3専用に最適化されたJTAGデバッグがしたい
✅ UART（シリアル通信）も同時に使いたい
✅ Espressif純正のデバッグツールを使いたい

### Arduino Runs On
ESP32-S3上でArduinoフレームワークがどのCPUコアで動作するかを指定するオプション
1️⃣ Core 0（PRO CPU）
ArduinoコードがCore 0（PRO CPU）上で実行される
通常、システムタスク（Wi-Fi、Bluetoothなど）がCore 1で動作する
Arduinoタスクのリアルタイム性が向上する可能性がある
一部のライブラリがCore 0での動作を前提としている場合がある
2️⃣ Core 1（APP CPU）【デフォルト】
ArduinoコードがCore 1（APP CPU）上で実行される
Core 0がシステムタスクに専念できるため、安定動作しやすい
デフォルト設定（通常はこちらを使う）
Wi-Fi/Bluetoothと共存しやすい

### USB Firmware MSC On Boot
ESP32-S3のブート時にUSB経由でストレージデバイス（MSC: Mass Storage Class）として動作し、ファームウェアの更新が可能になる機能。
この機能を有効にすると、USBメモリのように認識され、ファームウェア（バイナリファイル）をドラッグ＆ドロップで書き込める

### Partition Scheme
フラッシュメモリの領域をどのように分割するかを決める設定です。
ArduinoIDEでは、初期で作成したパーティションを選択するようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/0bdece96-6c1b-452a-8633-6b71d4bf6cb1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/45eae3e5-c784-413c-bfb9-f950faa1f6d0.png)
ArduinoIDEでは、Customで設定することはできません。

### PSRAM
PSRAMには「OSPI PSRAM」と「OPI PSRAM」の2通りの設定があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/bb8be2a4-e54b-40ca-99b8-414b32621f97.png)
消費電力を気にしないのであれば、高速処理が可能なOPI PSRAMを選択すればいいと思います。

### Upload Mode
ファームウェアの書き込み（アップロード）方法を選択する設定です。
ArduinoIDEでは「UART0/Hardware CDC」と「USB-OTG CDC(TinyUSB」と２通りの設定があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/680a1c69-a6fd-4e23-a390-3e6c93e8cf30.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/827ef70f-769b-4b60-aae7-537dcd8c4eca.png)


### Upload Speed
ファームウェアやスケッチを書き込む際に使用される通信速度（データ転送レート）を示す設定項目です。

### USB Mode
■Hardware CDC and JTAG■
このモードは、ESP32-S3のUSBインターフェースをシリアル通信（CDC）とJTAGデバッグに特化して使用するためのモードです。
【特徴】
CDC（Communication Device Class）
・USB経由でシリアル通信（UARTのような通信）を可能にします。
・開発中のデバッグやログ出力、またはホストデバイス（PCなど）との通信に使用されます。
例えば、printfやSerial.printなどの出力をUSB経由でPCのターミナルソフトに表示できます。

JTAGデバッグ
・USBインターフェースをJTAGデバッグ用として使用します。
　ブレークポイントの設定、ステップ実行、メモリやレジスタの内容確認など、高度なデバッグが可能です。
・開発者がファームウェアの動作を詳細に分析するために使用します。

【使用例】
・ファームウェア開発中のデバッグやログ出力。
・USB経由でのシリアル通信（PCとのデータ送受信）。
・JTAGを使用した高度なデバッグ。

■USB-OTG■
このモードは、ESP32-S3のUSBインターフェースを**USB On-The-Go（OTG）**として使用するためのモードです。USB-OTGを有効にすると、ESP32-S3はUSBホストまたはUSBデバイスとして動作できます。

【特徴】
USBホストモード:
・ESP32-S3がUSBホストとして動作し、他のUSBデバイス（USBメモリ、キーボード、マウスなど）を制御できます。
　例えば、USBメモリからデータを読み取ったり、USBキーボードからの入力を処理したりできます。

USBデバイスモード:
・ESP32-S3がUSBデバイスとして動作し、ホスト（PCなど）と通信できます。
　例えば、ESP32-S3をPCに接続してデータを転送したり、カスタムUSBデバイスとして動作させたりできます。

デュアルロール:
・USB-OTGでは、状況に応じてホストとデバイスの役割を切り替えることができます（HNP: Host Negotiation Protocol）。

【使用例】
・USBメモリやキーボードなどのUSBデバイスをESP32-S3に接続して制御する。
・ESP32-S3をUSBデバイスとして動作させ、PCと通信する。
・2台のUSB-OTG対応デバイスを直接接続してデータを転送する。

### Zigbee Mode