ESP32(M5Stack)のファームウェアは、ArduinoやPlatformIOといった開発環境からファームを書き込む事ができます。
量産時に、一々開発環境から書き込むのは効率が悪いですね。開発元のEspressif から、ファームの書込用のツールが提供されています。
そのツール(esptool.py や、esptool.exe)を使用して、ESP32にファームウェアを書き込む事ができます。その使用方法について説明します。
PlatfoemIOでのファームウェアの書込
PlatfoemIOで実際にファームウェアがどのように書き込まれているか、M5Stack-C Plus用のプロジェクトを作成し確認してみました。
パーテーションファイル
パーテーションファイルとして、 default.csvを使用しました。その の中身は、以下となります。メモリサイズは、4Mバイトです。
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x5000,
otadata, data, ota, 0xe000, 0x2000,
app0, app, ota_0, 0x10000, 0x140000,
app1, app, ota_1, 0x150000,0x140000,
spiffs, data, spiffs, 0x290000,0x160000,
coredump, data, coredump,0x3F0000,0x10000,
パーテーションファイルの詳細につきましては、以下の記事を参照ください。
ファームの書込内容の確認
PlatfoemIOのログを確認すると以下の4つのアドレスに対して書込を行っています。
- 0x00001000
- 0x00008000
- 0x0000e000
- 0x00010000
この中で、パーテーションファイル default.csv からアドレスを確認すると、otaadataとapp0に書き込んでいることが判ります。残りの2つは何でしょうか?
- 0x0000e000 otadata
- 0x00010000 app0
プロジェクトのバイナリファイル
今回使用した PlatformIO の **プロジェクト名**\.pio\build\m5stick-c\ 以下に、コンパイルしたオブジェクトファイルなどが保存されています。 その中に、以下の3つのバイナリファイルが作成されています。 (プロジェクトの環境によってフォルダ名が異なる場合がありますので、読み替えてください。)
- bootloader.bin ブートロード用のバイナリ
- partitions.bin パーテーション用のバイナリ
- firmware.bin アプリケーション用のバイナリ(ファームウェア)
です。そのバイナリのサイズと、PlatformIO のログで書き込まれているファイルのサイズから
- 0x00001000 bootloader.bin ブートロード用のバイナリ
- 0x00008000 partitions.bin パーテーション用のバイナリ
- 0x00010000 firmware.bin アプリケーション用のバイナリ(ファームウェア)
であることが判ります。
0x0000e000 に書き込んでいるデータ
残りの、0x0000e000 ですが、色々と確認したところ、ESP32のarduinoライブラリの
arduino-esp32/tools/partitions にある boot_app0.bin を書き込んでいるようです。
実際にインストールされているライブラリに関しては、「ライブラリの場所」の記事を確認ください。

書き込んでいるデータのまとめ
PlatformIOでは、以下の4つのデータを書き込んでいます。
書込アドレス | サイズ | パーテーション | ファイル |
---|---|---|---|
0x00001000 | 17488 bytes | bootloader.bin | |
0x00008000 | 3072 bytes | partitions.bin | |
0x0000e000 | 8192 bytes | otadata | boot_app0.bin |
0x00010000 | 1102656 bytes | app0 | firmware.bin |
※ ファームを書き込んでいるアドレス、データは、arduinoのログでも確認出来ます。
ファームのアップデート時
ファームのアップデート時は、firmware.bin(app0)以外のデータに変更点はないので、firmware.bin(app0)のみ書き込めば良いということになります。
ブランク品への書込
ブランク品や、パーテーションファイル等を変更した場合は、上記の4つのエリアに書き込む必要があります。
esptool.exeについて
開発元のEspressif から提供されてる、ファームの書込用のツール(esptool.exe )の使い方について説明します。
espressif/esptool に、Windows, Linux, MacOS 用の esptool.exe が公開されています。
esptool.exeを使用した書込
ファームの書き込み時、以下のオプションを使用します。
–chip
書き込むChip Typeを指定します。
--chip esp32
–port
書き込むCOMポート番号を指定します。
--port COM5
–baud
書き込む通信スピードを指定します。
--baud 512000
--baud 921600
--baud 1500000
–before default_reset
書き込む前にリセットします。
–after hard_reset
書き込み後リセットします。
write_flash
フラッシュの書込を行う指示です。
–flash_mode
Flashのモードの指示です。PlatformIOでは、指定しない場合は、dio となるようです。
--flash_mode qio
--flash_mode qout
--flash_mode dio
--flash_mode dout
Option | Mode Name | Pins Used | Speed (ESP device) |
---|---|---|---|
qio | Quad I/O | 4 pins used for address & data | Fastest. |
qout | Quad Output | 4 pins used for data. | Approx 15% slower than qio. |
dio | Dual I/O | 2 pins used for address & data | Approx 45% slower than qio. |
dout | Dual Output | 2 pins used for data. | Approx 50% slower than qio. |
–flash_freq 40m
Flashのクロックの周波数を設定します。デフォルト値は、40MHzです。
qio + 80MHz で動作しない個体があるようなので注意してください。
--flash_freq 40m
--flash_freq 80m
–flash_size detect
–flash_size は、フラッシュのサイズを指定します。通常は、–flash_size detectで良いと思います。
パラメーターは、keep, detect, 256KB, 512KB, 1MB, 2MB, 4MB, 2MB-c1, 4MB-c1, 8MB, 16MBが使用出来ます。
--flash_size detect
adress file
書き込む、アドレスとバイナリファイルを指定します。
記述例は、以下を参照ください。
esptool.exe
--chip esp32
--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"
ブートファイル
参考までに、ESP32のArduino用のライブラリの中に、ブートローダーのファイルが提供されています。
以前は、*.binファイルでしたが、最新版では、*.elfファイルで提供されています。
ファイル名 | flash_mode | flash_freq |
---|---|---|
bootloader_dio_40m.elf | dio | 40MHz |
bootloader_dio_80m.elf | dio | 80MHz |
bootloader_dout_40m.elf | dout | 40MHz |
bootloader_dout_80m.elf | dout | 80MHz |
bootloader_qio_40m.elf | qio | 40MHz |
bootloader_qio_80m.elf | qio | 80MHz |
bootloader_qout_40m.elf | qout | 40MHz |
bootloader_qout_80m.elf | qout | 80MHz |
実際に、保存されている場所は以下の場所となります。
PlatformIO
C:\Users\"User Name"\.platformio\packages\framework-arduinoespressif32\tools\sdk\esp32\bin\
Arduino
C:\Users\"User Name"\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.9\tools\sdk\esp32\bin\
elfファイルをbinファイルに変換する
esptool.exeを使用して、elfファイルをbinファイルに変換することが出来ます。
書式は、以下となります。
esptool.exe --chip ESP32 elf2image ”ファイル名”
例:
esptool.exe --chip ESP32 elf2image bootloader_dio_40m.elf
spiffsデータの書込
spiffs(ファイルシステム)を使用している時、このファイルシステムのデータをバイナリデータに変換し、esptool.exe を使用して書き込む事が出来ます。
書き込む手順は、以下となります。
- spiffsデータのイメージファイルの作成
- esptool.exe で書き込む
spiffsデータのイメージファイルの作成
PlatformIOのプロジェクトのフォルダに data フォルダを作成し、そのフォルダ内に、spiffsにアップロードしたいファイルを保存します。
その保存したファイルをPlatromIOのメニュー「Build Filesystem Image」で、イメージファイル(バイナリ)を作成します。
上述したプロジェクトのバイナリファイルファイルと同じフォルダに、「spiffs.bin」が出力されます。

esptool.exeで書き込む
作成したバイナリデータ(spiffs.bin)は、他のバイナリデータと同じように、esptool.exeを使用して書き込む事が出来ます。アドレスは、パーテーションファイルで指定したアドレスを設定します。
PlatformIOでアップロードする
PlatformIOでのアップロードは、バイナリデータを作成する必要はなく、メニュー「Upload Filesystem Image」から行えます。
ログで、書込先のアドレスや書込サイズを確認することができます。

参考URL
以下のURLも参考にしてください。