ESP32でesptool.pyの使い方

現時点の情報です。最新情報はM5StickC非公式日本語リファレンスを確認してみてください。

概要

Windows環境でESP32のフラッシュツールであるesptool.pyの使い方を調べてみました。

esptool.pyとは?

ESP32の販売元であるEspressifが公開しているツールであり、ESP8266とESP32用のブートローダーと通信するためのPythonプログラムです。

Python 2.7またはPython 3.4以降がインストールされている環境であれば、OSに依存せずに動かすことができます。

$ pip install esptool

Pythonが適切に設定されている場合には上記のコマンドで設定できると思います。Windowsの場合には動作に制限が多いMicrosoft Storeからではなく、直接ダウンロードしたほうがトラブルが少ないと思います。

esptool.pyコマンド一覧

コマンド解説
load_ramイメージをRAMにダウンロードして実行する
dump_mem任意のメモリをディスクにダンプします
read_mem任意のメモリ位置を読み取る
write_mem任意のメモリ位置へ書き込み
write_flashバイナリBLOBをフラッシュに書き込む
runフラッシュでアプリケーションコードを実行する
image_infoアプリケーションイメージからヘッダーをダンプする
make_imageバイナリファイルからアプリケーションイメージを作成する
elf2imageELFファイルからアプリケーションイメージを作成する
read_macOTP ROMからMACアドレスを読み取る
chip_idOTP ROMからチップIDを読み取る
flash_idSPIフラッシュの製造元とデバイスIDを読み取る
read_flash_statusSPIフラッシュステータスレジスタの読み取り
write_flash_statusSPIフラッシュステータスレジスタの書き込み
read_flashSPIフラッシュコンテンツの読み取り
verify_flashフラッシュに対してバイナリBLOBを検証する
erase_flashSPIフラッシュでチップ消去を実行する
erase_regionフラッシュの領域を消去する
versionesptoolバージョンを印刷する

ざっくりと上記のコマンドがあります。

共通オプション

シリアルポート(-p)

シリアルポートを指定するオプションです。Windowsの場合-p COM1やLinuxやMacの場合-p /dev/ttyUSB0で指定します。指定しない場合、若い番号から自動検索して接続します。複数接続している場合には、間違った方に書き込む可能性があるので、なるべく指定しましょう。

転送速度(-b)

デフォルトの転送速度は115200bpsです。M5StickCだと-b 1500000, -b 750000, -b 500000, -b 250000, -b 115200の5種類が利用できます。高速の場合には転送が失敗する場合があるので、失敗したらもう少し遅い速度で試してください。ボードによっては-b 921600や-b 460800-b 230400などが利用できます。

主要コマンド解説

チップの情報取得(flash_id)

C:\Temp>esptool.py flash_id
esptool.py v2.7
Found 2 serial ports
Serial port COM3
Connecting....
Detecting chip type... ESP32
Chip is ESP32-PICO-D4 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: ??:??:??:??:??:??
Uploading stub...
Running stub...
Stub running...
Manufacturer: c8
Device: 4016
Detected flash size: 4MB
Hard resetting via RTS pin...

接続しているチップの情報を出力します。read_macchip_idもほぼ同じ情報を出力しますが、このコマンドが一番情報が多いので、他のコマンドを使う必要はありません。

上記はM5StickCなのでESP32-PICO-D4で、4Mフラッシュが搭載されているのが確認できます。最近160MHzの物があるようですし、M5Stack Grayのように4M以上のフラッシュをついているモデルの容量を確認することができます。

フラッシュの読み出し(read_flash)

C:\Temp>esptool.py --port COM3 -b 1500000 read_flash 0x00000 0x400000 image4M.bin
esptool.py v2.7
Serial port COM3
Connecting....
Detecting chip type... ESP32
Chip is ESP32-PICO-D4 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: ??:??:??:??:??:??
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 1500000
Changed.
4194304 (100 %)
4194304 (100 %)
Read 4194304 bytes at 0x0 in 49.2 seconds (682.5 kbit/s)...
Hard resetting via RTS pin...

上記は開始アドレス0x00000から4M(0x400000)を読み出して、image4M.binに保存した場合のコマンド例です。

手元環境の場合最高速の-b 1500000だとたまにエラーになるので、-b 750000や安全のために-b 115200で動かしてもよいと思います。

ESP32のメモリマップを参考にすると、先頭アドレスは0x1000以降だけ読み込めばいいのですが、読み込むサイズ計算が面倒になるので先頭から4Mみたいな指定をしたほうが安全だと思います。

C:\Temp>esptool.py --port COM3 -b 115200 read_flash 0 4194304 image4M.bin

上記のように16進数ではなく、10進数でも指定可能です。

フラッシュのベリファイチェック(verify_flash)

C:\Temp>esptool.py --port COM3 -b 1500000 verify_flash --diff yes 0x00000 image4M.bin
esptool.py v2.7
Serial port COM3
Connecting......
Detecting chip type... ESP32
Chip is ESP32-PICO-D4 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: ??:??:??:??:??:??
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 1500000
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Verifying 0x400000 (4194304) bytes @ 0x00000000 in flash against image4M.bin...
-- verify OK (digest matched)
Hard resetting via RTS pin...

読み込んだファイルが正しいか、ベリファイチェックします。書き込みの場合には自動的にベリファイチェックしているので、利用することは少ないと思います。

ただ、起動するたびにデータを書き換えているプログラムが存在しており、その場合にはベリファイチェックがNGになり、差分が画面に表示されます。何度か実行して同じような結果になる場合には、念の為差分を保存してからあきらめてください。

フラッシュの書き込み(write_flash)

C:\Temp>esptool.py --port COM3 -b 1500000 write_flash 0x00000 image4M.bin
esptool.py v2.7
Serial port COM3
Connecting....
Detecting chip type... ESP32
Chip is ESP32-PICO-D4 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: ??:??:??:??:??:??
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 1500000
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 4194304 bytes to 149336...
Wrote 4194304 bytes (149336 compressed) at 0x00000000 in 8.7 seconds (effective 3869.2 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...

read_flashで保存したファイルを書き込むときのコマンドです。読み込みは速度が115200のときには6分以上かかりますが、書き込みは1分ぐらいで完了しています。

指定したアドレスから、ファイルサイズ分書き込む操作となります。読み出しで利用したアドレスと同じアドレスでないと、おかしなことになるので注意しましょう。

書き込みでは、自動的にベリファイをしていますので、個別にベリファイを実行する必要はありません。

フラッシュの削除(erase_flash)

C:\Temp>esptool.py --port COM3 -b 1500000 erase_flash
esptool.py v2.7
Serial port COM3
Connecting....
Detecting chip type... ESP32
Chip is ESP32-PICO-D4 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: ??:??:??:??:??:??
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 1500000
Changed.
Erasing flash (this may take a while)...
Chip erase completed successfully in 1.7s
Hard resetting via RTS pin...

フラッシュの中身を消します。利用していない領域も含めて0xFFで上書きをします。NVSが壊れた場合など、動作が不安定な場合には一度クリアしてからプログラムの転送をしなおすとなおる場合もあると思います。

また、利用していないESP32や、人に譲るESP32などはクリアしておかないと、中身のデータや、NVS領域などのWi-Fiアクセスポイント情報などをかんたんに抜き出すことができるので、注意してください。

まとめ

ESP32はかんたんにプログラムの書き込みや、読み込みが可能です。反面フラッシュの中身をUSB接続で抜き出すことが可能ですので、気をつけて扱いましょう。

暗号化することで、抜き出しにくくすることも可能ですが、暗号化はヒューズ操作になるので、3回までしか実施できないのとNVS領域が保護されていないので注意が必要です。

コメント

  1. […] Lang-shipESP32でesptool.pyの使い方https://lang-ship.com/blog/?p=1036現時点の情報です。最新情報はM5StickC非公式日本語リファレンスを確認してみてください。概要Windows環境でESP32のフラッシュツール […]

  2. hsenshu より:

    いつもお世話になっております。困ったときばかりお聞きし、恐縮です。

    さて、現在、ビルド済のバイナリーファイルをまとめ、対話形式で書き込めるプロ
    グラム(単なるBATファイルですが、LinuxやMacOS用のscriptも同じ方法で書けます)
    を作成中です。

    \AppData\Local\arduino\sketches\ には、以下のようなファイルが生成されるので、
    (この場合は KitchenScale.ino.bin) をesptool で0x10000から書き込めば目的を
    達成できると思っていました。

    数種類を書込み順調でほとんどはOkなのですが、稀に動作しない時があります。erase
    後に書き込んでも駄目な時があります。

    Aiduino IDEでの書込みではこの不具合はありません。

    IDEで書き込んでいるファイルとオプションをご存知であれば教えてください。

    Mode LastWriteTime Length Name
    —- ————- —— —-
    d—- 2026/03/08 17:12 core
    d—- 2026/03/08 17:12 libraries
    d—- 2026/03/08 17:09 sketch
    -a— 2026/03/08 17:09 0 .last-used
    -a— 2026/03/08 16:45 0 build_opt.h
    -a— 2026/03/08 17:10 767 build.options.json
    -a— 2026/03/08 17:12 283479 compile_commands.json
    -a— 2026/03/08 17:12 0 file_opts
    -a— 2026/03/08 17:10 348021 includes.cache
    -a— 2026/03/08 17:12 542432 KitchenScale.ino.bin
    -a— 2026/03/08 17:10 24928 KitchenScale.ino.bootloader.bin
    -a— 2026/03/08 17:12 12208468 KitchenScale.ino.elf
    -a— 2026/03/08 17:12 17178732 KitchenScale.ino.map
    -a— 2026/03/08 17:12 8388608 KitchenScale.ino.merged.bin
    -a— 2026/03/08 17:12 3072 KitchenScale.ino.partitions.bin
    -a— 2026/03/08 17:10 598 libraries.cache
    -a— 2026/02/28 19:53 305 partitions.csv
    -a— 2025/08/31 16:01 105948 sdkconfig

  3. hsenshu より:

    同じフォルダーに生成される bootloader.bin とpartitions.bin
    も同時に書き込む必要があるようです。

    何度は上手く動作していたのは、これらが(たまたま)同じ内容だった
    からでした。

    esptool.exe –chip esp32 –port COM9 –baud 1500000 ^
    –before default-reset –after hard-reset write-flash ^
    –flash-mode dio –flash-freq 40m ^
    –flash-size detect ^
    0x1000 bootloader.bin ^
    0x10000 firmware.bin ^
    0x8000 partitions.bin

    • たなかまさゆき より:

      転送は結構面倒でして、IDEの書き込みログを詳細にして、転送で利用しているコマンドを特定して同じものを送る必要があります

      VSCODEの拡張機能の場合にはExport Binariesという機能で、buildフォルダに転送に必要そうなファイルをコピーしてきて、manifest.jsonに転送先アドレスが書いてあります

      転送先はpartition情報によって変わったりするのでちょっと面倒なんですよね
      楽をするためには転送ファイルを1つにまとめる方法があります
      一般的な転送ツールはこの方式が多いです
      Chromeだとブラウザからシリアルが使えるので、ブラウザ経由で転送も可能です

      esptool.py –chip esp32 merge_bin -o merged-flash.bin \
      0x1000 bootloader.bin \
      0x8000 partition-table.bin \
      0xe000 boot_app0.bin \
      0x10000 app.bin

      上記でmerged-flash.binができて

      esptool.py –chip esp32 write_flash 0x0 merged-flash.bin

      で一括転送できるかもしれません

      ただ、上記も結局partitionによってかなり手順がかわります

      そこで

      (1)Flashを初期化
       esptool.py –chip esp32 erase_flash
      (2)Arduino IDEで焼き込み
      (3)Flashを読み出し
       esptool.py –chip esp32 read_flash 0x0 0x400000 full.bin
      (4)ターゲットに全部書く
       esptool.py –chip esp32 write_flash 0x0 full.bin

      上記の場合にはフラッシュのサイズを4Mから変更だけすればpartitionにはあまり左右されません
      欠点として無駄に書き込む容量が増えますので転送時間が増えます
      単発でしか書き込まないのであればそれほど気になる時間ではないかもしれません

  4. hsenshu より:

    たなかさん、詳しい説明に感謝します。

    私の 2026年3月8日 11:11 PMに報告した方法で解決しました。

    MENUを表示し、対話形式で書き込めるようになりました。

    Linuxでも使えるように、同じ仕様の bash用の shell scriptを作成し
    ています。(MacOSにも対応させたのですが、動作は未確認)。

    ビルドに不慣れな方でも、IDEの使用前にビルド済アプリ(M5StickC Plus2用)
    で動作確認できます(WiFi設定が必要なものは、WiFi Managerを採用し、
    スマホやPCから設定可能です)。

    すべてのプログラムのソースも読めるようにしています。

    === BATファイルの一部 ===

    :MENU
    cls
    echo ==========================================
    echo ESP32 ファームウェア書き込み
    echo ==========================================
    echo.
    echo 1. 工場出荷状態に戻す
    echo 2. 多機能時計

    echo 10. LittleFS領域の表示 ★WiFi
    echo 0. 終了
    echo.
    set /p SELECT=番号を入力してください:

    • たなかまさゆき より:

      良かったです
      M5StackのアプリであればM5Burnerに登録することで、ある程度そこから入れてもらうことができます
      ただ細かい設定や、そのアプリにいくまでの導線がないので自作の方が便利なときはあります

      あとはarduino-cliをバッチファイルでダウンロードして、必要なツールを全部ダウンロードして転送させるみたいなこともできるとは思います。ビルド環境全部になるのでちょっと重いですけれどね

  5. hsenshu より:

    たなかさん、こんばんは。

    M5bunnerも便利なのですが、WiFi接続が可能なアプリケーションはほとんど見当た
    りません。

    私の指導しているコースはネットワーク通信機能が必須なので、それを活かした
    教材を用意し、本格的に取り組む前段階での体験用の教材を準備しています。

    現在は、有名どころに加えて、Plus2でWeb Serverを動作させ、Plus2のLCDにQR
    コードを表示し、スマホで読み取れば、Webブラウザが開き、IMUや内部温度セン
    サーから得た値をスマホ(PCを含む)画面にグラフ表示、同時にPLUS2のLCD画像
    もjpegでLIVE表示可能、というアプリも用意しました。

    複数台(8台程度)のPCやスマホを一台のPLUS2に接続して、異常無く動作して
    います。

    • たなかまさゆき より:

      WebServerは確かにサンプル少ないですよね
      Arduinoの標準WebServerはマルチスレッド的な動きではないので、同時接続にちょっと弱いです
      そのため拡張したAsyncWebServerを使うことも多いです

      ただESP-IDFでesp_http_serverという、安定して動くWebServer実装もあります
      これはArduinoでも呼び出して使うことが出来ますし、ラップしたEspHttpServerというライブラリもあります

      Wi-FiだとMQTTも便利なのですがServerを準備するのが大変です
      ラズパイやPCでServerを準備するのか、ESP32で動かすsMQTTBrokerというライブラリもあります
      こちらは同じネットワークにESP32でサーバーが立ち上がるので便利ですが、安定性とかはラズパイの方がいいと思います

      Node-REDとかのServerをラズパイで動かして、そこでMQTTを受け取ってグラフ化とかもおすすめです

  6. hsenshu より:

    こんにちは

    先の例は、AsyncWebServerと Web socketの応用例になっています。

    このアプリケーションが、ビルド済のなので1分未満で動作します。

    これは、esptool だけでなく、WiFi Managerを採用による成果です。

    MQTTも便利そうですが、esp32以外のサーバーを用意する必要があり、
    手軽さに欠けます。