ESP32の内臓フラッシュメモリを使う:nvs(non-volatile storage)

Arduino/ESP32ESP32,nvs,フラッシュメモリ

ESP32のフラッシュメモリの中で、各種設定値等を保存しておく為の領域がある様で。

どうやらプログラムを書き込んでも上書きしない領域として設定されており、キーバリューストアの様に動作するらしい。

ネットで調べると、この領域へのハッキングやら情報漏洩等について色々騒ぎがあるらしいけれど、個人で使うマイコンには無用の心配って事で、、

あ、壊れたりして捨てる時には注意しなくちゃですけれど。

というわけで、ここへの読み書きについて確認しておこうと思います。

ライブラリのドキュメントでは全体の概要が掴みづらいですので、こういうものは公式のリファレンスが役に立ちます。

Espessif ESP-IDF Programming Guide – Non-volatile storage library

実際Arduino core for the ESP32 はESP-IDFをラップしたものの様ですので、初見はこっちを見た方がいいかもしれません。

さて、nvs領域の概要をざっくりまとめると、

・nvsはキーと値のペアで構成される(KVS)
・nvsに対しては read write erase が行える
・nvsで利用できるデータタイプは int(8~64)、bool、ゼロで終了する文字列、blob
・文字列は4kbまでに制限されている
・blobは508kbまで、もしくは nvsパーティションの97.6% – 4kbまでのどちらか小さい方に制限されている
・キーの最大長は15文字
・キーへの上書きルール:データタイプが異なる上書きはエラー
・キーへの読み取りルール:データタイプが異なる読み取りはエラー
・用途等によって名前空間を分ける事が出来る
・ネームスペースの最大長は15文字
・nvsはプログラム領域等に適用できる暗号化の対象外

その他記録順とか出荷フォーマット方法とか解説がありますが、とりあえず使うにはこの位で良いでしょう。

特にパーティションテーブルの指定もしていない私の場合はデフォルト設定が使われますので、0x5000ほど(20kb)確保されている様です。

KVSとして20kbなら十分過ぎる容量ですね;

APIを直接呼ぶ場合には下の方にリファレンスが付いてました。

Arduino core for the ESP32 でAPIを使う場合には、以下のヘッダファイルを参考に。

そうそう、ESP-IDFのAPIを使う時はこの辺りのディレクトリなので覚えておくといいかもしれません。

すぐ忘れるのでどこかに書いておかねば・・・

tools/sdk tools/sdk っと。

さて、我々マイコン初心者が使うのは、先人が作ってくれた便利なライブラリです。

GitHub – Espressif – arduino-esp32/libraries/Preferences/

この辺りのexamplesを眺めると、あぁ、こうやって使うんだなというのがよくわかります。

インスタンスを作って
Preferences prefs;

ネームスペースを指定して開始
prefs.begin(“hogehoge");

put型名()とかget型名()とかのメソッド使って読み書きするんだなと
prefs.putBytes(“hogehoge", content, sizeof(content)); // これはblobの例

また、Preferencesのヘッダを見るとbeginに渡せる引数が確認できます。
bool begin(const char * name, bool readOnly=false);

ネームスペースのほかにリードオンリーでも指定できるんだなと。

非常にシンプルな造りですので、今回はサンプルとか作りません。

すまんこってす・・・

後でwifiのSSIDとパスワードのペアでも持っておく系のに使ってみます。

もしかしたら後々nvs領域の暗号化が必要になるかもしれないですけれども;