メモリ・ストレージ

NORフラッシュ

ランダムアクセスが速いフラッシュ。コード実行向き。

概要

NORフラッシュ(NOR Flash Memory)は、フラッシュメモリの一種で、セルが並列接続(NOR回路的な構成)されたアーキテクチャを持ちます。最大の特徴はバイト単位のランダムアクセス読み出しが可能な点で、プロセッサがフラッシュからコードを直接フェッチして実行するXIP(eXecute In Place)に対応しています。

組み込みシステムでは、マイコン(MCU)のプログラム格納領域として最もよく使われるフラッシュです。STM32やNXP、Microchip(旧Atmel)のマイコンにはNORフラッシュが内蔵されており、電源投入直後からリセットベクタを読み出してコードを実行できます。

容量はNANDフラッシュより小さく(数MB〜数百MB程度)、単価も高めですが、ランダム読み出し速度・信頼性の高さから、ブートローダー格納・コード実行用途では圧倒的に多く使われています。

歴史・背景

NORフラッシュは1988年にIntelが開発・製品化しました。名称はセル構造がNOR論理ゲートに似ていることに由来します。初期はBIOS(PC)のプログラム格納に使われ、シリアル通信でアクセスするのではなく、CPUのアドレスバス・データバスに直結して使うパラレルNORが主流でした。

1990年代〜2000年代前半、組み込みシステムでは外付けパラレルNORフラッシュが一般的で、バスに接続してXIPを行う設計が多く見られました。2000年代後半からSPIインターフェースのシリアルNORフラッシュが普及し、小ピン数・低コストで接続できることから、マイコンの外付けコード格納メモリとして主流となりました。

2010年代にはQSPI(クワッドSPI)や、さらに高速なOctal SPIを持つNORフラッシュが登場し、読み出し速度の課題を克服。ESP32やSTM32H7のような高性能マイコンでも外付けQSPI NORフラッシュからXIPを行う構成が一般化しました。現在はWinbond・Macronix・Micron・ISSI・Spansion(Infineon)などのメーカーがNORフラッシュを供給しています。

技術仕様

容量・インターフェース

インターフェース最大容量読み出し速度用途
パラレル(8/16bit)128MB〜256MB最大80MB/s旧来の外付け、高速XIP
SPI(シングル)512MB〜50Mbps(6.25MB/s)小規模MCU外付け
QSPI(クワッド)512MB〜1GB〜400Mbps(50MB/s)ESP32・STM32外付けXIP
Octal SPI / OPI1GB〜〜800Mbps(100MB/s)高性能MCU/MPU

電気的特性

  • 動作電圧: 1.8V または 3.3V(製品により異なる。マイコンの電源電圧に合わせて選択)
  • 読み出し電流: 10〜30mA(動作時)、スタンバイ: 1〜20µA
  • 書き込み時間: バイト書き込み 8〜100µs程度
  • セクタ消去時間: 0.3〜3秒(セクタサイズにより異なる)
  • チップ消去時間: 数秒〜数十秒
  • 書き換え耐久性: 100,000回(SLC構造のため)
  • データ保持期間: 20年以上(常温保管時)

主要コマンド(SPI NORフラッシュ)

SPI NORフラッシュはJEDECで標準化されたコマンドセットを持ちます:

コマンドコード説明
Read Data0x03低速読み出し(〜50MHz)
Fast Read0x0B高速読み出し(〜133MHz)
Quad Read0xEBQSPI高速読み出し
Page Program0x02ページ書き込み(256B単位)
Sector Erase0x204KBセクタ消去
Block Erase0xD864KBブロック消去
Chip Erase0xC7全消去
Write Enable0x06書き込み有効化(書き込み前必須)
Read Status0x05ステータスレジスタ読み出し

動作原理

XIP(eXecute In Place)

NORフラッシュの最大の特徴は、CPUがフラッシュ上のコードを直接実行できることです。パラレルNORではアドレスバス・データバスをCPUバスに直結するため、RAMと同様にランダムアクセスが可能です。

CPU アドレスバス → NORフラッシュ アドレスピン
CPU データバス  ← NORフラッシュ データピン
              (CPUがアドレスを出力 → NORが1クロックで応答)

QSPIでは、MCUのQSPIコントローラが自動的にSPIコマンドを生成してフラッシュから読み出し、CPUにはメモリマップド領域として見せるメモリマップドモード(OSPI/QUADSPI in Memory-Mapped Mode)を使います。

// STM32 QSPIのメモリマップドモード設定例
QSPI_CommandTypeDef cmd = {
    .InstructionMode   = QSPI_INSTRUCTION_1_LINE,
    .Instruction       = 0xEB,  // Quad Read
    .AddressMode       = QSPI_ADDRESS_4_LINES,
    .AddressSize       = QSPI_ADDRESS_24_BITS,
    .DataMode          = QSPI_DATA_4_LINES,
    .DummyCycles       = 6,
};
QSPI_MemoryMappedTypeDef memmap = {
    .TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE,
};
HAL_QSPI_MemoryMapped(&hqspi, &cmd, &memmap);
// 以降 0x90000000 番地からNORフラッシュの内容がアクセス可能

書き込み・消去の仕組み

NORフラッシュのセルはフローティングゲートMOSFETです。書き込みはホットキャリア注入(CHE: Channel Hot Electron Injection)、消去はFowler-Nordheimトンネリングで行います。消去はセクタ単位(4KB〜64KB)で実施します。

// SPI NORフラッシュへの書き込み手順
void flash_write_page(uint32_t addr, const uint8_t *data, size_t len) {
    flash_write_enable();          // Write Enable コマンド送信
    flash_wait_ready();            // ステータス確認

    spi_select();
    spi_send_byte(0x02);           // Page Program コマンド
    spi_send_byte((addr >> 16) & 0xFF);
    spi_send_byte((addr >> 8)  & 0xFF);
    spi_send_byte( addr        & 0xFF);
    for (size_t i = 0; i < len; i++) {
        spi_send_byte(data[i]);
    }
    spi_deselect();

    flash_wait_ready();            // 書き込み完了待ち
}

用途・ユースケース

マイコン内蔵フラッシュ

STM32・nRF52・RP2040などほとんどのマイコンはNORフラッシュを内蔵しています。容量は16KB〜2MB程度で、プログラムコード・定数データを格納します。マイコンのリセット後、ブートローダーがこのフラッシュから読み込まれて起動します。

外付け大容量コードフラッシュ

ESP32のように内蔵フラッシュが少ない(または持たない)マイコンでは、SPI/QSPIで外付けのNORフラッシュを接続します。ESP32では通常4MB〜16MBのWinbond W25QシリーズなどのSPI NORフラッシュを外付けし、そこからファームウェアを実行します。

ESP32 ─── QSPI ─── Winbond W25Q128 (16MB NOR Flash)
                   ├── Bootloader (〜32KB)
                   ├── Partition Table
                   ├── App0 (OTA_0パーティション)
                   └── App1 (OTA_1パーティション)

ブートローダー専用フラッシュ

セキュアブートを実現する設計では、ブートローダーを改ざん防止のためにWrite Protect設定したNORフラッシュに格納し、アプリケーションは書き換え可能な別パーティションに置く構成が使われます。

産業用・車載用

動作温度範囲(-40℃〜+125℃)・書き換え耐久性(100,000回)・長期データ保持(20年以上)を保証した産業グレード・AEC-Q100準拠の車載グレードNORフラッシュが、PLC・FA機器・車載ECUで使われています。

実装・開発のポイント

SPI通信速度の設定

NORフラッシュのSPIクロックは製品ごとに最大周波数が異なります。Winbond W25Q128JVは通常読み出し(0x03コマンド)は最大50MHz、Fast Read(0x0B)は最大133MHzです。マイコンのSPIクロックを適切に設定しないと誤動作します。

// SPI設定例(STM32 HAL)
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; // APBクロック/4
// 例: APB2=84MHz → SPI=21MHz(NOR Flashの上限内に収める)

Write Protectピンの活用

NORフラッシュの/WP(Write Protect)ピンやステータスレジスタのWP設定を使うと、誤書き込みを防げます。ブートローダー領域など書き換えを禁止したいセクタをハードウェアレベルで保護できます。

QSPIのDQS(Data Strobe)対応

高速OctalSPIフラッシュはDQS(Data Strobe)信号でデータの有効タイミングを通知します。マイコンのOSPIコントローラがDQSに対応しているか確認が必要です。

IDの確認

JEDECで規定されたREAD ID(0x9F)コマンドで製造元・メモリタイプ・容量を確認し、初期化時に意図したフラッシュが接続されているか検証することが推奨されます。

uint8_t jedec_id[3];
spi_select();
spi_send_byte(0x9F);  // READ JEDEC ID
jedec_id[0] = spi_recv_byte();  // Manufacturer ID
jedec_id[1] = spi_recv_byte();  // Memory Type
jedec_id[2] = spi_recv_byte();  // Capacity
spi_deselect();
// Winbond: 0xEF, Macronix: 0xC2, Micron: 0x20

他技術との比較

NORフラッシュ vs NANDフラッシュ

NORは読み出し速度・バイトアクセス・信頼性でNANDより優れますが、容量密度が低く高コストです。大量データの保存にはNANDフラッシュを使い、コード実行・ブートローダーにはNORを使うのが基本の使い分けです。同一システムに両者を搭載する設計も珍しくありません(例: NOR 4MB for boot code + NAND 512MB for data)。

NORフラッシュ vs SRAM

SRAMは読み書き自由・超高速ですが高価で揮発性です。NORフラッシュは不揮発で安価ですが、書き込みに時間がかかり寿命があります。コードはNORに格納し、実行時にSRAMにコピーして高速実行(Execute from RAM)する手法も使われます。

NORフラッシュ vs EEPROM

EEPROMはバイト単位の読み書きが可能で小容量データの保存に適しますが、容量が小さく低速です。NORフラッシュのほうが大容量でコスト効率が良く、現在は設定値保存もNORフラッシュの専用セクタを使うケースが多くなっています。

関連用語

参考リンク