ESP32-WROOM-32 SPIFFS メモリサイズを大きくする方法

ESP32 ( ESP-WROOM-32 )
※Arduino core for the ESP32 stable ver 1.0.2 の場合、SPIFFSのパーティションテーブルファイルの変更が不要になりました。
Arduino IDE のボード設定の Partition Scheme を自分の好みに設定すれば、SPIFFSのメモリサイズを変更できるようになりました。
USB comポートはご自分の環境に合わせて変えてください。

また、Arduino core for the ESP32 が stable 1.0.2 の場合、
SPIFFSアップローダープラグイン ver 1.0
を使って下さい。
ver 0.1 では動作しません

(2019/05/06)

以下の記事は、Arduino core for the ESP32 stable 1.0.0 以前の対処方法です。

 

2018/07から、Arduino core for the ESP32 の Stable版が発表になりました。
ボードマネージャからインストールするようになり、ライブラリ群やパーティションテーブルの default.csvファイルは、ESP8266 と同じく、Arduino15フォルダ内に集約されています。
その場合のWindows 10 の default.csv ファイルパスは

C:\Users\User-Name\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\tools\partitions

となりますのでご注意ください。
(2018/08/07)

 

こんばんは。

今回は、ESP-WROOM-32 ( ESP32 ) の内蔵Flash メモリ内の SPIFFS ( SPI Flash File System ) 領域をサイズアップする方法を紹介したいと思います。
Arduino core for ESP32 で使用する場合の方法です。

これは、以下の記事のコメント投稿欄で、Tomさんが英語で投稿して下さいました。

ESP-WROOM-32 ( ESP32 ) SPIFFS アップローダープラグインの使い方

とぉ~っても有益な情報でした。
ホントにありがとぅございます。
感謝感謝です。
m(_ _)m

最近、Arduino – ESP32 で SPIFFS が使えるようになっても、1.1MB くらいしかアップロードできなく、16×16 pixel の日本語東雲フォントは無理でした。
Arduino – ESP32 のFlashメモリパーティションテーブル ( Partition Table )ファイルを編集してもイマイチ上手くいかなくて、半分諦めていました。

しかし、Tomさんがパーティションテーブルの編集方法を教えて下さったおかげで、なんと SPIFFS領域のサイズアップができたんです!!
よって、東雲フォントのアップロードができました!!

何度も言わせていただきますが、改めて、Tomさん、ありがとうございます!!
m(_ _)m

これは、恐らく今後の Arduino core for ESP32 のアップデートによって、Arduino IDE のツールメニューでパーティションテーブルの変更が簡単にできるようになると思われます。
でも、自分自身でこれを編集すると、Flashメモリの構造が何となく分かってきた気がして、とても勉強になりました。
内蔵SPI Flash メモリ内に eeprom の領域もあったりして、
「なるほど・・・、そういう構造だったのか・・・」
と納得してしまいました。
データシートを眺めていただけではいまいちピンとこなかったので、これは収穫です。

ということで、Arduno core for ESP32 の Flash パーティションテーブルの変更方法を以下に紹介します。

ただ、これによって起きたトラブルは一切責任を負いません
十分ご了承していただいた上でご覧いただければと思います。

スポンサーリンク

お勧め ESP-WROOM-32 ボード

まず、USB Host機器や ESP32 チップを保護する機能が付いた、スイッチサイエンス製の ESPr Developer 32 をお勧めします。

ESPr Developer 32
スイッチサイエンス(Switch Science)

次に、保護機能はあまりありませんが、Espressif Systems社純正の ESP32-DevKitC ですね。

Arduino core for ESP32 の設定

Arduino IDE は ver 1.8.5 で動作確認しております。

Arduino core for ESP32 は最新版をインストールしてください
最新版は WiFi WPA2 の脆弱性対策パッチが適用されているそうです。
インストール方法は以下の記事を参照してください。

Arduino core for the ESP32 のインストール方法

「BLEに無効なライブラリ」というコンパイラメッセージが出る場合は、BLEライブラリを別途ダウンロードする必要があります。
BLE Bluetooth BLE を使わなければ、そのままでも特に問題有りません。

内蔵 Flash メモリ Partition Table について

2018/07から、Arduino core for the ESP32 の Stable版が発表になりました。
ボードマネージャからインストールするようになり、ライブラリ群やパーティションテーブルの default.csvファイルは、ESP8266 と同じく、Arduino15フォルダに集約されています。
その場合のWindows 10 のファイルパスは

C:\Users\User-Name\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\tools\partitions

となります。
User-Name はご自分のユーザー名で、1.0.0 は Stable 版のバージョンです。

これより以下は、従来の ZIPファイルから get.exe でインストールした場合の方法です。
将来的に使えなくなるかもしれませんのでご注意ください。
(2018/08/07)

 

Arduino core for ESP32 の パーティションテーブル ( Partition Table )は、Windows 10 の場合、以下のパスにあります。
User-Name のところは各自のユーザーネームです。

C:\Users\User-Name\Documents\Arduino\hardware\espressif\esp32\tools\partitions

この中にある、default.csv というCSV形式ファイルをまず Excel で開くと、こうなります。
(※実際の編集はテキストエディタで行います。詳細は後で述べます)

(基本的に私はアマチュアなので、以下、誤っていることを言っていたらスミマセン。
その場合、コメント投稿欄とかでご連絡いただけると助かります。)

さて、2017/10/24現在で流通しているESP-WROOM-32 の場合、内蔵 SPI Flash メモリは 4MB になります。

Type欄で、data の場合はデータが格納されていて、app はスケッチ(プログラム)をコンパイルしたバイナリデータが格納されていると思われます。
app 領域が2つあるのは恐らく Dual Core だからではないかと思われ、別々の Task を実行できるようにしているものと思われます。

app領域が2つあるのは、OTA を使う場合、片方の領域がOTAで使われるという情報がありました。
Twitter の かでんさんからの情報です。

nvs については、私は正直よく分かりません。
おそらく、いろいろなシステム系のデータ(例えば MAC アドレスなど)が格納されているものと思われますので、いじらない方が無難です。
「東京お気楽カメラ」というブログサイトに nvs のことが書いてある記事がありましたので、そちらが参考になると思います。

esp32のnvsをちょっと見てみた

ota は Over The Air の略で、スケッチをWi-Fi無線アップデートできるようにするためのデータが格納されているものと思われます。

SubType は良く分かりません。

Offset は、そのデータやアプリが格納されている先頭アドレスを示しています。
例えば、nvs ならば、16進数の 0x9000 という値で設定されています。
これは、ESP-WROOM-32 に搭載されている 4MB ( 4,000,000 byte ) の中の、
0x9000 ( 20,480 byte )
の位置から nvs データが始まっていることになります。

nvs の 0x9000までは、ESP-WROOM-32 を起動するためのブートローダーが格納されているらしいです。

eeprom は、スケッチプログラム中で progmem を使うと格納される領域です。

そして、spiffs が今回の目的の SPIFFS メモリ領域になります。

ただ単にSPIFFS サイズだけを変更して大きくしても正常に動作しないのでご注意ください
ここを大きくするためには、他のサイズを小さくする必要があります。

では、その方法を次で紹介します。

コメント

  1. juchang より:

    mgo-tec 様

    新年明けましておめでとうございます。
    新年早々の新作発表に大変感激致しております。
    今回は SPIFFS 領域のサイズアップが必要とのことで本ページに取り組んでいますが、shnm8x16.bdf と shnmk16.bdf (いずれも SDcard_sample_filses より取り込み) のアップロードができません。
    SPIFFS のサイズアップは、シリアルモニタで確認済みです。
    4×8.FNT 、Utf8Sjis.tbl、mgotec48.FNT、MSKG13KU.FNT のアップロードは、シリアルモニタで確認できます。
    エラー表示:
    UnicodeDecodeError: ‘ascil’ code can’t decode byte 0xef in position 0: ordinalnot in range(128)
    Web で調べると、「 str 型と unicode 型を混ぜるな!」との事のようですが、初心者の私にはどこをどう直せばよいのか見当もつきません。
    新年早々で恐縮です、何かお知恵がありましたらアドバイスの程お願いいたします。

    • mgo-tec mgo-tec より:

      juchangさん

      あけましておめでとうございます。
      こちらこそ、本年も当ブログをご覧いただき、ありがとうございます。
      m(_ _)m

      エラーメッセージの件ですが、以前と同じメッセージですね。
      私も再現しようとしたのですが、どうしてもそういうエラーが出ません。
      謎ですね。
      パーティションテーブルも含めたソースコードをテキストエディタで編集した場合、Unicodeで保存してしまった可能性があるかもしれませんね。
      UTF-8形式で保存すれば直るかもしれません。
      また、ブラウザからソースコードをコピペする場合、ブラウザの設定画面で、文字コードをUTF-8に統一すると良いかもしれません。

      でも、そのエラーメッセージはSPIFFSファイルをプラグインアップローダーでアップロードした時に出るメッセージですよね。
      そうなると謎です。
      Arduino IDE の「ツール」メニューの「Flash Size」を2MB にしてしまっているかと思ってやってみたのですが、それでもそういうエラーメッセージは出ませんでした。

      あと考えられるのは、パーティションテーブルをテキストエディタで編集する時に、ブログ記事の文章中から数値をコピペしてしまうと出てしまうかもしれませんね。
      パーティションテーブルのコピペ用テキストはこのブログ記事には載せていないので大丈夫だとは思ったのですが・・・。
      あれは、テキストエディタでご自分で半角数値を入力しなければいけません。
      あと、その中に全角が混じっている可能性がありますのでご注意ください。
      特に、エラーメッセージにある、「0xEF」というのは、半角文字では読み取れないということを意味しています。
      半角英数値は ASCIIコードの表現できる文字コードです。
      パーティションテーブルなどは半角英数値で読み取るので、0xEF という値はASCIIコードにありません。
      恐らく、全角カンマ「,」などは、UTF-8コードで、0xEFBC8C なので、最初のビット 0xEF を読み取ってしまって、エラーが出ている可能性があります。
      文字列意外のプログラムは全て半角英数値で入力しなければなりません。

      以上、それくらいでしょうか・・・。
      いずれにしても、そのエラーメッセージは文字が何らかの不明な文字コードになってしまっている可能性が大きいです。
      そのエラーメッセージの前に他のメッセージはありませんでしたか?

  2. juchang より:

    mgo-tec 様

    いつも初歩的なミスでご迷惑をお掛けし申し訳ありません。
    パーティションテーブルの編集で、Windows メモ帳を使っていたのが原因でした。
    テキストに忠実に実行しようと、Adobe Brackets をインストールし、編集を行ったところ、error 表示が無くなり、「フルカラー有機 EL に倍角日本語フォントを縦横でスクロールさせてみた」を完成することができました。
    ありがとうございました。
    今後ともご指導の程よろしくお願い致します。

    • mgo-tec mgo-tec より:

      動いて良かったですね。
      メモ帳でも、全角、半角と改行を注意すれば問題無いと思います。
      ただ、やっぱり使いにくいので、ちゃんとしたテキストエディタが正解ですね。

  3. Deco より:

    mgo-tec様、はじめまして。
    メモリサイズのことで調べてたら辿り着きました。
    まったくの初心者の私でも参考になる数々の記事に感謝いたします。

    本題ですが、default.csvを開くと、eepromの項目がありませんでした。
    こんな感じです。
    # 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,0x170000,

    eepromがない場合、spiffsのOffsetはどうなるのでしょうか?
    お忙しいところ恐縮ですが、よろしくお願い致します。

    • mgo-tec mgo-tec より:

      Decoさん

      記事をご覧いただきありがとうございます。
      ただ、この記事は3年以上前のもので、当時は動きましたが今の環境では全く異なると思ってください。

      2021/1/21時点のArduino core for the ESP32のstable版最新はver 1.0.4 です。
      この場合、SPIFFSサイズを大きくするならば、Arduino IDE の「ツール」メニューで、
      「Partition Scheme」
      という項目があり、そこで変更する方が確実に安全に変更できます。

      DecoさんのSPIFFSのSizeが、0x170000 とあり、これは16進数表記なので、10進数に直すと、
      0x170000 = 1,507,328 byte = 約1.5MB
      となっています。
      これは、Partition Scheme設定でデフォルト設定だと思いますので、例えば
      No OTA (2MB APP/2MB SPIFFS)
      にすると、SPIFFSを2MBまでサイズアップできます。
      こちらで設定した方が絶対安全で、お勧めです。

      因みに、EEPROMが無い場合、app1のOFFSET値にSize値を足した合計値がSPIFFSのOFFSET値になると思います。
      16進数計算なので10進数計算と異なることに注意すれば良いのではないかと思います。
      ただ、これで正常に動くか分かりませんし、場合によってはフラッシュメモリを破壊してしまう場合も有りえます。

タイトルとURLをコピーしました