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文字以内なら自由に決めていい名称です。
Typeは app 又は 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)の暗号化キーの保存先です。 |
Offset と Size はまぁそのままです。
0x8FFFまではパーティションテーブルとブートローダが占めてますから必ず最初の開始位置は 0x9000 になります。
Flags は今の所 encrypted のみ指定可能です。
encryptedは暗号化が有効なパーティションに付けます。
大体こんな感じでESP32のフラッシュメモリは管理されてました。
4MBだと少ないかな思ってましたが今の所スカスカです。空き部分は他にも利用できそうです。
最初はWi-FiのSSIDやパスワードなんかをフラッシュメモリ上に格納できないのかなと思って調べ始めたんですが、よくわからなくなってきたので纏めました。
nvs_flashを使えば保存できそうです。なのでnvsパーティションはデフォルトでも24KB(0x6000)確保されてるのでそのまま使えそうですね。
・・・まぁでもデータなんかはmicroSD繋げた方が全然いいんですけどね。
後、OTA(無線アップデート)は是非ともやってみたいので今度挑戦してみます。
コメント
コメントを投稿