Flash, EEPROM và RAM khác nhau như thế nào?

Giải thích nguyên lý hoạt động của Flash, EEPROM và RAM.

6 phút đọc
STM32 / Firmware cover

Khi làm embedded, ba loại bộ nhớ này xuất hiện liên tục: RAM cho biến runtime, Flash để chứa chương trình, EEPROM để lưu cấu hình. Biết dùng chúng không khó - nhưng hiểu tại sao chúng hoạt động theo cách đó giúp tránh được nhiều bug khó giải thích.

Bức tranh tổng quan

Mục Giá trị Ghi chú
SRAM Lưu trữ tạm thời, biến mất khi mất điện Tốc độ nhanh, ghi/đọc tùy ý, không giới hạn số lần ghi. Dùng cho stack, heap, biến toàn cục.
Flash (NOR) Lưu trữ bền, không mất khi mất điện Chứa firmware/program. Đọc nhanh, ghi chậm, erase theo page/sector. Giới hạn ~10K-100K chu kỳ.
EEPROM Lưu trữ bền, ghi/xóa theo byte Lưu config, calibration. Ghi/xóa từng byte được, chậm hơn Flash đọc, bền hơn Flash (~100K-1M chu kỳ/byte).

RAM - tại sao nhanh nhưng hay quên

SRAM dùng flip-flop - mỗi bit là một mạch điện tử có trạng thái 0 hoặc 1 khi có điện. Ghi tức thì, đọc tức thì, không giới hạn số lần.

Nhược điểm: cần nguồn điện liên tục để giữ trạng thái. Mất điện là mất hết. Trên STM32, RAM thường là 20-256 KB - nhỏ vì transistor SRAM chiếm diện tích chip lớn.

Flash và EEPROM - cùng họ floating gate

Flash và EEPROM đều dùng công nghệ floating gate transistor để lưu trữ electron. Đây là điểm khác biệt căn bản với SRAM.

Floating gate là gì?

Hình dung một transistor bình thường có thêm một “cổng nổi” (floating gate) nằm giữa control gate và channel, được bao quanh bởi lớp oxide cách điện mỏng.

Control Gate

  [oxide]
  [FLOATING GATE]  ← nơi chứa electron
  [oxide]

  Channel (Source ──── Drain)
  • Không có electron trong floating gate → transistor dẫn điện bình thường → bit đọc là 1
  • Có electron trong floating gate → ngưỡng kích hoạt transistor tăng cao → transistor không dẫn → bit đọc là 0

Vì floating gate bị oxide bao quanh, electron không thể tự thoát ra - đây là lý do dữ liệu tồn tại khi mất điện.

Ghi (program) - bắn electron vào

Để ghi bit 0: áp điện áp cao (~10-15V) vào control gate, dùng cơ chế Fowler-Nordheim tunneling hoặc hot electron injection để đẩy electron xuyên qua lớp oxide mỏng vào floating gate.

Kết quả: floating gate có electron → bit = 0.

Xóa (erase) - kéo electron ra

Để xóa (đưa bit về 1): áp điện áp ngược, kéo electron ra khỏi floating gate qua Fowler-Nordheim tunneling theo chiều ngược.

Kết quả: floating gate không còn electron → bit = 1.

Tại sao erase về 0xFF chứ không phải 0x00?

Đây là điểm hay bị nhầm.

Erase = kéo electron ra = floating gate trống = transistor dẫn = bit 1.

Sau khi erase, tất cả bit đều là 1 → mỗi byte = 0xFF.

Ghi = bắn electron vào = floating gate có electron = transistor không dẫn = bit 0.

Nghĩa là: chỉ có thể ghi 0 vào một bit đang là 1. Không thể ghi 1 vào bit đang là 0 - muốn làm vậy phải erase toàn bộ page/sector để kéo hết electron ra trước.

Sau erase:    0xFF = 1111 1111
Ghi 0xA5:     0xA5 = 1010 0101  ← chỉ các bit 0 được "viết" vào
Ghi tiếp 0x0F: không thể trực tiếp → phải erase lại về 0xFF trước

Đây là lý do tại sao Flash không thể ghi đè trực tiếp như RAM - và là nguồn gốc của toàn bộ logic EEPROM emulation.

Flash và EEPROM khác nhau ở đâu?

Cả hai đều dùng floating gate. Sự khác biệt nằm ở granularity erasekiến trúc cell.

EEPROM - erase từng byte

EEPROM có thêm một transistor chọn (select transistor) cho mỗi cell. Nhờ đó có thể erase và program từng byte riêng lẻ mà không ảnh hưởng byte bên cạnh.

Đổi lại: mỗi bit cần 2 transistor → cell lớn hơn → mật độ thấp → giá cao hơn trên cùng diện tích silicon.

Ưu điểm: byte-addressable write, bền hơn (~100K-1M chu kỳ/byte).

Flash - erase cả page/sector

Flash bỏ select transistor để tăng mật độ. Cell nhỏ hơn, mật độ cao hơn, rẻ hơn nhiều. Nhưng khi erase, phải erase cả page/sector cùng lúc vì không có cơ chế chọn từng cell riêng.

Trên STM32G0: page size = 2 KB. Muốn sửa 1 byte trong page, phải đọc cả page vào RAM, erase page, ghi lại cả page.

Mục Giá trị Ghi chú
Erase granularity EEPROM: từng byte | Flash: từng page/sector Đây là khác biệt lớn nhất trong thực tế.
Cell size EEPROM: lớn (2 transistor/bit) | Flash: nhỏ (1 transistor/bit) Flash mật độ cao hơn, rẻ hơn.
Endurance EEPROM: ~100K-1M cycles/byte | Flash NOR: ~10K-100K cycles/page EEPROM bền hơn vì erase nhỏ hơn.
Write đơn vị tối thiểu EEPROM: 1 byte | Flash: thường 8-64 bit (double word trên G0) Flash không ghi được từng bit riêng lẻ.

NAND Flash - một nhánh khác

Trên STM32 on-chip flash là NOR Flash - có thể execute-in-place (XIP), đọc từng byte, truy cập random. CPU fetch instruction thẳng từ đây.

NAND Flash (SSD, eMMC, SD card) khác hẳn: cell nhỏ hơn, mật độ cao hơn, rẻ hơn nhiều, nhưng không thể XIP, không đọc random được, phải đọc theo block, và có bad block. Không dùng để chứa code MCU chạy trực tiếp.

NOR Flash  → on-chip STM32, XIP, random access, nhỏ (KB-MB)
NAND Flash → SSD/SD card, block access, lớn (GB), rẻ/GB

Loại erase về 0x00 - có không?

Có, nhưng hiếm gặp trong embedded thông thường. Một số loại bộ nhớ định nghĩa erase về 0x00:

  • Một số FRAM (Ferroelectric RAM) - công nghệ khác hoàn toàn, không dùng floating gate
  • Một số OTP (One-Time Programmable) - ghi 0 vào fuse, không erase được
  • Một số MRAM (Magnetoresistive RAM)

Với STM32 NOR Flash và EEPROM floating gate standard: erase luôn về 0xFF. Khi đọc một vùng flash chưa được ghi sau khi erase, luôn thấy 0xFF.

Tại sao on-chip Flash không có EEPROM riêng?

STM32F1/F2/F3/F4 không có EEPROM độc lập - chỉ có NOR Flash. Muốn lưu config persistent phải emulate EEPROM trên Flash, với toàn bộ phức tạp của page erase và wear leveling.

STM32L0/L1/L4 có một vùng data EEPROM riêng trên chip - byte-addressable, bền hơn - nhưng tốn silicon hơn.

STM32G0 - dòng cost-optimized - không có EEPROM hardware riêng, chỉ có NOR Flash. Nhưng hỗ trợ dual bank, giúp EEPROM emulation thực tế hơn đáng kể so với single-bank.

Tóm tắt để nhớ nhanh

Muốn lưu biến runtime, stack, heap     → SRAM
Muốn chứa firmware/program             → NOR Flash (on-chip)
Muốn lưu config persistent, ít thay đổi → EEPROM (nếu có) hoặc Flash emulation

Erase Flash về 0xFF → ghi chỉ flip 1→0
Không thể ghi 0→1 mà không erase trước
Erase EEPROM: từng byte → linh hoạt nhưng đắt silicon
Erase Flash: cả page → rẻ silicon nhưng phức tạp khi dùng làm data storage

Bài liên quan

Tài liệu tham khảo

Thấy nội dung này hữu ích?

Lưu lại hoặc chia sẻ cho người cũng đang học firmware, BIOS/UEFI và embedded systems.

Nội dung liên quan

Một số bài viết, ghi chú hoặc project có liên quan đến nội dung bạn vừa đọc.

Biến note thành bài viết hoàn chỉnh

Notes là nơi ghi nhanh khái niệm.