Saat ini, memori Flash digunakan untuk menyimpan kode program, dan EEPROM (Memori Hanya Baca yang Dapat Dihapus Secara Listrik) digunakan untuk menyimpan data yang persisten. Kembali sekitar 30 tahun yang lalu, sebelum Flash datang, EEPROM digunakan untuk menyimpan kode program.
Sebenarnya ROM (Read-Only Memory) datang lebih dulu, kemudian PROM (Programmable ROM, sekali saja), EPROM (PROM Dihapus dengan sinar UV), EEPROM, dan akhirnya Flash. ROM masih digunakan untuk aplikasi yang sangat bervolume tinggi dan berbiaya rendah (mis. Berbicara kartu ucapan).
Perbedaan penting dengan mikrokontroler saat ini adalah bahwa Anda umumnya tidak dapat mengeksekusi kode dari EEPROM, dan itu aneh bagi program untuk menyimpan data dalam flash. (Data disimpan dalam flash ketika misalnya Anda menggunakan kata kunci "const" dalam deklarasi data, atau mendefinisikan string, tetapi itu ditangani di belakang layar oleh kompiler dan tautan.)
Area EEPROM dapat digunakan untuk menyimpan konfigurasi atau data lain yang Anda inginkan tersedia di seluruh reboot termasuk termasuk jika mikrokontroler kehilangan daya dan kemudian didukung kembali. Secara fungsional, Anda dapat menganggap EEPROM sebagai hard drive atau kartu SD yang sangat kecil.
Pada mikrokontroler tanpa EEPROM, dimungkinkan untuk menyimpan data persisten dalam memori flash, tetapi ini menjadi sulit karena mikrokontroler tidak benar-benar dirancang untuk ini, dan Anda harus menemukan tempat khusus yang tidak akan mengganggu kode program, dan mengesampingkannya dengan tautan. Plus seperti yang disebutkan di bawah ini, Anda biasanya dapat memperbarui EEPROM berkali-kali lebih banyak daripada flash.
Jika Anda melakukan data program dalam flash, ini tidak berarti Anda dapat mengakses data sebagai variabel dalam program C Anda, karena tidak ada cara untuk memberitahu kompiler di mana variabel-variabel ini dalam kode Anda (yaitu Anda tidak dapat mengikat sebuah konst variabel untuk area flash ini.) Jadi, membacanya harus dilakukan melalui set register khusus yang digunakan untuk menulisnya. Perhatikan pembatasan ini berlaku untuk data dalam EEPROM juga, sehingga tidak memiliki keuntungan dalam hal ini.
Untuk memprogram flash atau EEPROM, blok memori terlebih dahulu harus dihapus. Kemudian diprogram. Untuk flash, penulisan biasanya dilakukan satu blok sekaligus. Untuk EEPROM, itu dapat dilakukan dengan blok atau byte pada suatu waktu, tergantung pada mikrokontroler.
Untuk flash dan EEPROM, ada jumlah maksimum kali Anda dapat memperbaruinya sebelum Anda kehabisan memori. Nomor ini diberikan dalam lembar data sebagai minimum dijamin. Biasanya untuk EEPROM jauh lebih tinggi daripada untuk memori flash. Untuk flash, saya telah melihat angka serendah 1000. Untuk EEPROM, saya telah melihat angka setinggi 1.000.000.
Salah satu keuntungan EEPROM dibandingkan flash, adalah Anda dapat menghapusnya lebih banyak daripada menghapus flash.
"In-System Self-programmable" berarti mikrokontroler dapat memperbarui flash-nya sendiri saat berjalan. Fitur ini biasanya digunakan untuk memperbarui kode di lapangan. Kuncinya adalah Anda perlu meninggalkan beberapa kode di sistem saat program utama sedang diperbarui, disebut bootloader. Skema ini digunakan dalam sistem Arduino untuk memprogram chip.
Saya akan menambahkan beberapa info lagi ke jawaban yang sangat bagus oleh @tcrosley.
ATmega16 mengimplementasikan arsitektur Harvard , yaitu topologi sistem di mana memori data dipisahkan dari memori program. Mengutip paragraf yang relevan dari lembar data Atmega16 (halaman 8):
Arsitektur Harvard memiliki keuntungan karena tidak memiliki pertentangan bus antara siklus pengambilan instruksi dan siklus akses data, karena data dan instruksi tidak berbagi bus yang sama, seperti dalam arsitektur PC konvensional Anda.
Oleh karena itu memori flash digunakan sebagai memori program, sedangkan memori data dibagi antara SRAM (untuk data sementara, seperti stack panggilan fungsi dan heap - jika Anda memprogram dalam C, misalnya) dan EEPROM (untuk penyimpanan permanen) .
sumber