このページの目次

ストレージ技術

MCU プロジェクトでのデータの保存場所と保存方法


ストレージピラミッド

      容量        速度      価格/GB
SRAM   KB~MB    最速 (ns)   最高価      ← CPU キャッシュ/レジスタ
DRAM   MB~GB    高速 (10ns)  中程度      ← メモリ
NOR    MB~GB    中速 (μs)   中〜高       ← コード格納
NAND   GB~TB    低速 (ms)   低価格      ← データ格納

組み込みシステムで重要なのは不揮発性ストレージ(電源断でもデータ保持)です:
  - コードの保存場所 → NOR Flash (XIP: その場での実行)
  - データの保存場所 → EEPROM / NOR / NAND / SD

内蔵 vs 外付け

MCU 内蔵 Flash

STM32F407: 1MB 内蔵 NOR Flash
ESP32:     4〜16MB 外付け SPI NOR Flash
RP2040:    内蔵なし、すべて外付け QSPI NOR Flash
nRF52840:  1MB 内蔵

コードは Flash に格納され、電源投入時に直接実行可能 (XIP)
消去書き込み寿命: 一般的に 1万〜10万回

内蔵 EEPROM(シミュレーション)

多くの MCU には真の EEPROM が搭載されておらず、Flash でエミュレートします:
  STM32: Flash の末尾領域を確保し、ウェアレベリングアルゴリズムを使用
  ESP32: NVS (Non-Volatile Storage)、Flash ベース

エミュレートされた EEPROM の寿命は Flash のページ消去回数に制限されます
実用上十分:1日10回書き込み、寿命10万回で約27年

Flash タイプ比較

特性NOR FlashNAND Flash
読み出しランダムアクセス (XIP 可能)ページ読み出し
書き込み遅い (消去が必要)遅い (消去が必要)
消去ブロック消去 (~100ms)ブロック消去 (~ms)
容量MB〜1GBGB〜TB
インターフェースSPI/QSPI/OSPIパラレル/ONFI
寿命1万〜10万回1千〜1万回 (ウェアレベリング必須!)
不良ブロック極めて少ない工場出荷時に存在し、管理が必要
価格高い ($/MB)安い ($/GB)
組み込み MCU の 99% は NOR Flash を使用 (SPI/QSPI経由)
NAND は eMMC/SDカード / SSD 内部で使用されます

EEPROM vs FRAM

特性EEPROMFRAM
書き込み速度遅い (5ms/ページ)極めて速い (nsレベル)
書き込み前に消去が必要?不要 (バイト単位で書き込み可能)不要
寿命10万〜100万回10¹²〜10¹⁴ 回!
消費電力低いさらに低い
容量1Kb〜1Mb4Kb〜4Mb
インターフェースI2C/SPII2C/SPI
価格安い2〜3倍高い
EEPROM: 設定/キャリブレーションデータの保存 (稀な書き込み)
FRAM:   頻繁な記録 (データログ、電源断保護)
        寿命は事実上無限 → 書き込み壊れの心配なし

代表的なチップ:
  EEPROM: 24LC256 (256Kb, I2C), AT25SF041 (4Mb, SPI)
  FRAM:   MB85RC256V (256Kb, I2C), FM25V02A (2Mb, SPI)

SDカード

2つのモード

SPI モード:
  4線 (CS/CLK/MOSI/MISO)
  低速 (25〜50 Mbps)
  全ての MCU で使用可能
  ライブラリ: FatFs + SPI ドライバ

SDIO モード:
  4ビット並列
  高速 (100Mbps以上可能)
  ハードウェア SDIO コントローラが必要 (STM32F4以降または ESP32 が対応)

どちらの場合でも、ファイルシステムが必要 → FatFs (最も一般的)

配線

SDカード      MCU (SPI モード)
──────────────────────────
CS    ←→  GPIO (チップセレクト)
MOSI  ←→  MOSI
MISO  ←→  MISO
SCK   ←→  SCK
VDD   ←→  3.3V
GND   ←→  GND

必須追加部品:
  全信号線に 10k〜100kΩ の 3.3V へのプルアップ抵抗
  VDD にバイパスコンデンサ 0.1μF + 10μF

注意: SDカードは 3.3V です! 5V 印加で破損します

ファイルシステム

裸の MCU で SDカードを使用する場合:

FatFs:  最も一般的、FAT32/exFAT 対応
        コードサイズが小さく、MCU に適している
        http://elm-chan.org/fsw/ff/

LittleFS: Flash 用に設計されたファイルシステム
          電源断安全、ウェアレベリング対応
          MCU 内蔵/外付け NOR Flash に適している

SPIFFS: ESP32 の旧ファイルシステム (LittleFS に置き換え済み)

選択基準:
  SDカード → FatFs (PC 互換性)
  内蔵 Flash → LittleFS (電源断安全)

一般的なストレージソリューション早見表

シナリオ                        推奨ソリューション
────────────────────────────────────
数個の設定値 (WiFiパスワード等) を保存   MCU 内蔵 Flash / EEPROM エミュレーション
数百バイトの設定を保存              I2C EEPROM (24LCxx)
頻繁なデータ記録 (1秒間に複数回)       FRAM または SPI NOR + LittleFS
コードが内蔵 Flash を超える場合        外付け QSPI NOR Flash (例: W25Q64)
ログ/データの保存、PC へのエクスポート必要 SDカード + FatFs
製品レベルのデータ保存               eMMC (大容量、信頼性高、ただし BGA パッケージ)
電源断時のデータキャッシュ           FRAM (寿命無限)

実際のトラブルシューティング

1. Flash への書き込み前に消去が必要
   → 1バイトの書き込みでも、まずページ/ブロック全体を消去する必要がある
   → 設定値の1つを更新するには → 全ページ読み出し → 修正 → 消去 → 書き戻し

2. NAND の不良ブロック管理
   → 工場出荷時点で不良ブロックが存在する!
   → ECC (誤り訂正符号) が必要
   → MCU で NAND を直接制御するのは非常に困難、eMMC (内蔵コントローラ付き) を使用

3. Flash の寿命
   → 10秒ごとに1回書き込み → 寿命10万回 → 使用可能期間わずか11日!
   → 解決策: ウェアレベリング (Wear Leveling)
   → 生の Flash への書き込みは避け、LittleFS または SPIFFS を使用

4. SDカードの互換性
   → 全てのカードが SPI モードをサポートしているわけではない!
   → 一部のカードは電源投入後にダミークロックをさらに数回送信する必要がある
   → 大容量カード (SDHC/SDXC) の初期化プロセスに差異がある

5. 電源断時の Flash 書き込み
   → 書き込み中に電源断 → データ破損
   → 二重領域バックアップを使用: B 領域に新データを書き込み、検証後に有効フラグを設定
   → または、書き込み完了まで維持するための十分なコンデンサを追加 (ただし信頼性は低い)

キーワード: NOR Flash, NAND Flash, EEPROM, FRAM, SDカード, FatFs, LittleFS, ウェアレベリング, QSPI