Ngày nay, bộ nhớ Flash được sử dụng để giữ mã chương trình và EEPROM (Bộ nhớ chỉ đọc có thể xóa bằng điện) được sử dụng để giữ dữ liệu liên tục. Quay trở lại khoảng 30 năm trước, trước khi Flash xuất hiện, EEPROM đã được sử dụng để giữ mã chương trình.
Trên thực tế, ROM (Bộ nhớ chỉ đọc) xuất hiện đầu tiên, sau đó là PROM (ROM có thể lập trình, chỉ một lần), EPROM (PROM có thể xóa bằng đèn UV), EEPROM và cuối cùng là Flash. ROM vẫn được sử dụng cho các ứng dụng có khối lượng rất lớn, chi phí thấp (ví dụ: thiệp chúc mừng nói chuyện).
Sự khác biệt quan trọng với các bộ vi điều khiển hiện tại là bạn thường không thể thực thi mã ra khỏi EEPROM và thật khó xử khi các chương trình lưu trữ dữ liệu trong flash. (Dữ liệu được lưu trữ trong flash khi ví dụ bạn sử dụng từ khóa "const" trong khai báo dữ liệu hoặc xác định chuỗi, nhưng được trình biên dịch và trình liên kết xử lý phía sau hậu trường.)
Vùng EEPROM có thể được sử dụng để giữ cấu hình hoặc dữ liệu khác mà bạn muốn có sẵn trên các lần khởi động lại, kể cả nếu vi điều khiển bị mất nguồn và sau đó được cấp nguồn trở lại. Về mặt chức năng, bạn có thể nghĩ về EEPROM như một ổ cứng hoặc thẻ SD rất nhỏ.
Trên các bộ vi điều khiển không có EEPROM, có thể lưu trữ dữ liệu liên tục trong bộ nhớ flash, nhưng điều này trở nên khó khăn vì các bộ vi điều khiển không thực sự được thiết kế cho điều này và bạn phải tìm một vị trí đặc biệt sẽ không can thiệp vào mã chương trình và đặt nó sang một bên với các liên kết. Ngoài ra, như được đề cập dưới đây, bạn thường có thể cập nhật EEPROM nhiều lần hơn so với đèn flash.
Nếu bạn thực hiện dữ liệu chương trình trong flash, điều đó không có nghĩa là bạn có thể truy cập dữ liệu dưới dạng các biến trong chương trình C của mình, vì không có cách nào để nói với trình biên dịch nơi các biến này nằm trong mã của bạn (nghĩa là bạn không thể liên kết một const biến thành vùng flash này.) Vì vậy, việc đọc chúng phải được thực hiện thông qua bộ thanh ghi đặc biệt được sử dụng để ghi chúng. Lưu ý hạn chế này cũng áp dụng cho dữ liệu trong EEPROM, vì vậy nó không có lợi thế trong vấn đề này.
Để lập trình flash hoặc EEPROM, trước tiên phải xóa một khối bộ nhớ. Sau đó, nó được lập trình. Đối với flash, viết thường được thực hiện một khối tại một thời điểm cũng có. Đối với EEPROM, nó có thể được thực hiện bằng các khối hoặc một byte tại một thời điểm, tùy thuộc vào vi điều khiển.
Đối với cả flash và EEPROM, có số lần tối đa bạn có thể cập nhật chúng trước khi bạn sử dụng hết bộ nhớ. Con số này được đưa ra trong biểu dữ liệu dưới dạng giá trị được bảo đảm tối thiểu . EEPROM thường cao hơn nhiều so với bộ nhớ flash. Đối với flash, tôi đã thấy các số thấp tới 1000. Đối với EEPROM, tôi đã thấy các số cao tới 1.000.000.
Một lợi thế của EEPROM so với flash, là bạn có thể xóa chúng nhiều lần hơn bạn có thể xóa flash.
"Tự lập trình trong hệ thống" đơn giản là vi điều khiển có thể cập nhật đèn flash của chính nó trong khi chạy. Tính năng này thường được sử dụng để cập nhật mã trong trường. Mẹo nhỏ là bạn cần để lại một số mã trong hệ thống trong khi chương trình chính đang được cập nhật, được gọi là bộ nạp khởi động. Sơ đồ này được sử dụng trong hệ thống Arduino để lập trình chip.