ESP32のフラッシュメモリ

ESP32のフラッシュメモリ

ESP32のフラッシュメモリ

今一よく分かってないのでちょこっと調べた内容のメモ書き。
詳細はここです。

ESP-IDFのフラッシュメモリサイズ設定

まず自分が使ってるのはESP32-DevKitC-32Eの4MB Flashなんですが、ESP-IDFだと「4MBあるのに何故かデフォルトで2MB」になっています。
まだプログラムサイズが200KBとか小さなサイズしか作ってないので全然気にしてませんでしたがココはちゃんと変更した方がよさそうです。
プロジェクトを新規で作成したらmenuconfigで Serial flasher config を見て Flash size を自分の使ってるモジュールに合わせて変更しましょう。

ESP32のフラッシュメモリ構成

ESP32の場合フラッシュメモリをパーティションで構成してます。
このパーティション構成はmenuconfigで変更できます。一番単純なデフォルトの構成は Single factory app, no OTA です。
パーティションテーブルの設定は以下のようになってます。

Name Type SubType Offset Size Flags
nvs data nvs 0x9000 24K
phy_init data phy 0xf000 4K
factory app factory 0x10000 1M

図にすると以下のようにフラッシュ上に配置されます。

パーティションテーブルブートローダは固定です。
ブートローダは設定によってサイズは変更可能になってます。

それ以外のパーティションは提供されているサンプルかcsvファイルを作って設定します。
menuconfigだと Partition Table の設定で変更できます。

ここで指定できるのは以下です。

  • Single factory app, no OTA
    これは上記の通りシンプルな構成です。
  • Single factory app (large), no OTA
    factoryの部分が1MB→1.5MBに変わっただけです。
  • Factory app, two OTA definitions
    無線アップデート用のパーティション(OTA)が追加されます。
  • Custom partition table CSV
    カスタムパーティションをcsvファイルを指定します。

カスタムパーティションを選択すると以下のようにCSV fileのファイル名を入力する欄が出てきます。

プロジェクトルートに partitions.csv を置けばそちらが参照されます。
csvの中身は以下のようになってます。

# Name,   Type, SubType,  Offset,   Size,  Flags
nvs,      data, nvs,      0x9000,  0x4000
otadata,  data, ota,      0xd000,  0x2000
phy_init, data, phy,      0xf000,  0x1000
factory,  app,  factory,  0x10000,  1M
ota_0,    app,  ota_0,    ,         1M
ota_1,    app,  ota_1,    ,         1M
nvs_key,  data, nvs_keys, ,        0x1000

パーティションの中身

パーティションの中身は以下のように設定します。

# Name,   Type, SubType,  Offset,   Size,  Flags
nvs,      data, nvs,      0x9000,  0x4000
phy_init, data, phy,      0xf000,  0x1000
factory,  app,  factory,  0x10000,  1M

この中身は何かという話になります。

Name は 16文字以内なら自由に決めていい名称です。

Typeapp 又は data が指定できます。

SubType は Type によって指定できるものが違います。
■Type = app

SubType 内容
factory プログラム保管場所。
ota_0~ota15 プログラム保管場所、無線アップデートでアップデートされたプログラムの格納場所になります。最低2パーティション必要で片方が実行用、片方がアップデート用になります。
test 工場出荷時のテスト用、通常使わないです。

■Type = data

SubType 内容
nvs Wi-Fi API等で設定をフラッシュに保存するように指定した場合の保存先になります。不揮発性ストレージライブラリ(nvs_flash)の保存先でもあります、nvs_flashはkey/valueデータを保存することができます。
phy PHYはイーサネットの物理層を指します、物理層の初期化用データを保存しておく場所のようです。
ota 現在有効となっているOTAパーティションを保持してます。ブートローダがこちらを参照してota_0~ota15のどのパーティションからプログラムをロードするか決定します。
nvs_keys 不揮発性ストレージライブラリ(nvs_flash)の暗号化キーの保存先です。

OffsetSize はまぁそのままです。
0x8FFFまではパーティションテーブルとブートローダが占めてますから必ず最初の開始位置は 0x9000 になります。

Flags は今の所 encrypted のみ指定可能です。
encryptedは暗号化が有効なパーティションに付けます。


大体こんな感じでESP32のフラッシュメモリは管理されてました。
4MBだと少ないかな思ってましたが今の所スカスカです。空き部分は他にも利用できそうです。

最初はWi-FiのSSIDやパスワードなんかをフラッシュメモリ上に格納できないのかなと思って調べ始めたんですが、よくわからなくなってきたので纏めました。
nvs_flashを使えば保存できそうです。なのでnvsパーティションはデフォルトでも24KB(0x6000)確保されてるのでそのまま使えそうですね。
・・・まぁでもデータなんかはmicroSD繋げた方が全然いいんですけどね。

後、OTA(無線アップデート)は是非ともやってみたいので今度挑戦してみます。

コメント

このブログの人気の投稿

(真)ESP32の開発環境をVSCodeで作る

ESP32にmicroSD接続

ESP32でデバッグ