このページの目次
ストレージ技術
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 Flash | NAND Flash |
|---|---|---|
| 読み出し | ランダムアクセス (XIP 可能) | ページ読み出し |
| 書き込み | 遅い (消去が必要) | 遅い (消去が必要) |
| 消去 | ブロック消去 (~100ms) | ブロック消去 (~ms) |
| 容量 | MB〜1GB | GB〜TB |
| インターフェース | SPI/QSPI/OSPI | パラレル/ONFI |
| 寿命 | 1万〜10万回 | 1千〜1万回 (ウェアレベリング必須!) |
| 不良ブロック | 極めて少ない | 工場出荷時に存在し、管理が必要 |
| 価格 | 高い ($/MB) | 安い ($/GB) |
組み込み MCU の 99% は NOR Flash を使用 (SPI/QSPI経由)
NAND は eMMC/SDカード / SSD 内部で使用されます
EEPROM vs FRAM
| 特性 | EEPROM | FRAM |
|---|---|---|
| 書き込み速度 | 遅い (5ms/ページ) | 極めて速い (nsレベル) |
| 書き込み前に消去が必要? | 不要 (バイト単位で書き込み可能) | 不要 |
| 寿命 | 10万〜100万回 | 10¹²〜10¹⁴ 回! |
| 消費電力 | 低い | さらに低い |
| 容量 | 1Kb〜1Mb | 4Kb〜4Mb |
| インターフェース | I2C/SPI | I2C/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