概要
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 / OPI | 1GB〜 | 〜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 Data | 0x03 | 低速読み出し(〜50MHz) |
| Fast Read | 0x0B | 高速読み出し(〜133MHz) |
| Quad Read | 0xEB | QSPI高速読み出し |
| Page Program | 0x02 | ページ書き込み(256B単位) |
| Sector Erase | 0x20 | 4KBセクタ消去 |
| Block Erase | 0xD8 | 64KBブロック消去 |
| Chip Erase | 0xC7 | 全消去 |
| Write Enable | 0x06 | 書き込み有効化(書き込み前必須) |
| Read Status | 0x05 | ステータスレジスタ読み出し |
動作原理
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フラッシュの専用セクタを使うケースが多くなっています。