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.
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 erase và kiế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
0và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
- STM32G0 Reference Manual RM0444 - Flash controller, page size, dual bank
- AN4894 - EEPROM Emulation on STM32 - ST application note
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.
Flash Operations STM32: Erase, Write, Polling và tại sao program đứng
Cách thao tác Flash STM32 qua HAL: unlock, erase, write, polling vs interrupt, và nguyên nhân program freeze khi xóa Flash.
Linker Script STM32: MEMORY, sections và tại sao .data cần hai địa chỉ
Giải thích linker script STM32 căn bản: MEMORY region, .text/.data/.bss, LMA vs VMA, startup copy.
Reset Vector và Bootloader trên Cortex-M: VTOR, MSP và jump sequence
Reset vector là gì, VTOR hoạt động ra sao, và chuỗi bước cần thiết để bootloader jump đúng cách vào application - tránh crash sau khi có interrupt đầu tiên.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.