#author("2026-01-14T15:43:19+09:00","","") #author("2026-01-14T23:31:16+09:00","","") #notemd # esptool with ESP32 ## ESP32の一般的なメモリ配置 ### パーテーションファイル (4MBタイプ) |Name|Type|SubType|Offset|Size|byte|Flags| |---|:---:|:---:|---:|---:|---:|:---:| |nvs |data|nvs | 0x9000| 0x5000|20K|-| |otadata |data|ota | 0xe000| 0x2000|8K|-| |app0 |app |ota_0 | 0x10000|0x140000|1.28M|-| |app1 |app |ota_1 |0x150000|0x140000|1.28M|-| |spiffs |data|spiffs |0x290000|0x160000|1.408M|-| |coredump|data|coredump|0x3F0000| 0x10000|64K|-| ### PlatformIO で書き込んでいるもの |書込アドレス|パーテーション|ファイル|内容| |---|---|---|---| |0x00001000| |bootloader.bin|ブートロード用| |0x00008000| |partitions.bin|パーテーション用| |0x0000e000|otadata|boot_app0.bin | | |0x00010000|app0 |firmware.bin |アプリケーション用(ファームウェア)| **nvs(Non-volatile storage)** 不揮発性ストレージで、電源を切っても保存される領域。nvs_get_blob()関数などにより、名前をつけた値を保存することができる。このサイズは変更しないほうがよい。Wi-Fiのアクセスポイントを保存するときとかに利用。 **otadata** OTA(Over The Air)はWi-Fi経由でプログラムを更新する仕組みで、そのためのプログラムが入っている領域。OTAを利用しない場合でも、この領域は必要で、固定サイズになる。 **app0** 実際のプログラムが入っている領域。プログラムの領域が足りなくなった場合には、他の領域を減らして、ここの領域を増やすことができる。 **app1** OTAを利用する場合には、app0とapp1の交互にプログラムを書き込んでいき、書き込みに失敗した場合でも、書き換え前のプログラムが残っている状態にするためのもの。 そのためapp0とapp1の大きさは同じにする必要があります。ただしOTAを利用しない場合には0で構わない。 **spiffs(Serial Peripheral Interface Flash File System)** SPIバス経由で接続されている内部フラッシュを利用したファイルシステム。 spiffsの利点として、一度転送すれば上書きされることがないので、プログラムの転送サイズが減る。OTAなどを利用した場合、プログラム内部にデータを内蔵しておくとapp0とapp1で同じデータが存在するので、spiffsにデータを置くことで容量を有効に使うことができる。 欠点として、初期状態で転送ツールがセットアップされないので、使うまでがちょっと面倒。サイズが小さい場合にはプログラムの中に内蔵したほうがシンプル。 *ファームのアップデート時は、firmware.bin(app0)以外のデータに変更点はないので、firmware.bin(app0)のみ書き込めば良い。* ## esptool のコマンド |コマンド|解説| |---|---| |load_ram|イメージをRAMにダウンロードして実行する| |dump_mem|任意のメモリをディスクにダンプします| |read_mem|任意のメモリ位置を読み取る| |write_mem|任意のメモリ位置へ書き込み| |write_flash|バイナリBLOBをフラッシュに書き込む| |run|フラッシュでアプリケーションコードを実行する| |image_info|アプリケーションイメージからヘッダーをダンプする| |make_image|バイナリファイルからアプリケーションイメージを作成する| |elf2image|ELFファイルからアプリケーションイメージを作成する| |read_mac|OTP ROMからMACアドレスを読み取る| |chip_id|OTP ROMからチップIDを読み取る| |flash_id|SPIフラッシュの製造元とデバイスIDを読み取る| |read_flash_status|SPIフラッシュステータスレジスタの読み取り| |write_flash_status|SPIフラッシュステータスレジスタの書き込み| |read_flash|SPIフラッシュコンテンツの読み取り| ||verify_flash|フラッシュに対してバイナリBLOBを検証する| |erase_flash|SPIフラッシュでチップ消去を実行する| |erase_region|フラッシュの領域を消去する| |version|esptoolバージョンを印刷する| ## esptool のオプション(共通) ### --chip 書き込むChip Typeを指定 > --chip esp32c6 ### --port 書き込むCOMポート番号を指定 > --port /dev/ttyACM0 ### -–baud 書き込む通信スピードを指定 > --baud 512000 > --baud 921600 > --baud 1500000 ### -–before default_reset 書き込む前にリセット ### –-after hard_reset 書き込み後リセット ## esptool のオプション(書込時) ### write_flash フラッシュへの書込指示 ### –-flash_mode ### –-flash_mode (idf.py用) Flashのモードの指示 (default dio) > --flash_mode qio > --flash_mode qout > --flash_mode dio > --flash_mode dout ### -–flash_freq 40m ### -–flash_freq 40m (idf.py用) Flashのクロックの周波数を設定 (default 40MHz)。 > --flash_freq 40m > --flash_freq 80m ### --flash_size detect ### --flash_size detect (idf.py用) フラッシュのサイズを指定。通常は、–flash_size detect > --flash_size detect パラメーターは、keep, detect, 256KB, 512KB, 1MB, 2MB, 4MB, 2MB-c1, 4MB-c1, 8MB, 16MBが使用可。 ### adress file 書き込むアドレスとバイナリファイルを指定 ### オプション例 esptool.py --chip esp32c6 --port COM5 --baud 512000 --before default_reset --after hard_reset write_flash --flash_mode dio --flash_freq 40m --flash_size detect 0xe000 "boot_app0.bin" 0x1000 "bootloader.bin" 0x00010000 "firmware.bin" 0x00008000 "partitions.bin" 0x00290000 "spiffs.bin" ## esptool のオプション(読込時) ### read_flash フラッシュからの読取り指示 ### オプション例 esptool.py read_flash 0x00000 0x400000 image4M.bin 開始アドレス0x00000から4M(0x400000)を読み出して、image4M.binに保存 ## spiffsデータの書込 ### spiffsデータのイメージファイルの作成 PlatformIOのプロジェクトのフォルダに data フォルダを作成し、そのフォルダ内に、spiffsにアップロードしたいファイルを保存。 その保存したファイルをPlatromIOのメニュー「Build Filesystem Image」で、イメージファイル(バイナリ)を作成。 上述したプロジェクトのバイナリファイルファイルと同じフォルダに、「spiffs.bin」が出力される。 ### esptool.exeで書き込む 作成したバイナリデータ(spiffs.bin)は、他のバイナリデータと同じように、esptool を使用して書き込みが可。アドレスは、パーテーションファイルで指定したアドレスを設定。 ### PlatformIOでアップロードする PlatformIOでのアップロードは、バイナリデータを作成する必要はなく、メニュー「Upload Filesystem Image」から実行。 ログで、書込先のアドレスや書込サイズを確認することができる。 ## elfファイルをbinファイルに変換 esptoolを使用して、elfファイルをbinファイルに変換することが可能。 ### esptool --chip ESP32 elf2image ”ファイル名” > esptool.py --chip ESP32 elf2image bootloader_dio_40m.elf