Al giorno d'oggi, la memoria Flash viene utilizzata per contenere il codice del programma e la EEPROM (memoria di sola lettura cancellabile elettricamente) viene utilizzata per conservare i dati persistenti. Circa 30 anni fa, prima dell'arrivo di Flash, le EEPROM venivano utilizzate per contenere il codice del programma.
In realtà arrivarono prima la ROM (memoria di sola lettura), poi la PROM (ROM programmabile, una sola volta), la EPROM (PROM cancellabile con luce UV), la EEPROM e infine il Flash. Le ROM sono ancora utilizzate per applicazioni ad alto volume e basso costo (ad esempio biglietti d'auguri parlanti).
La differenza importante con gli attuali microcontrollori è che in genere non è possibile eseguire codice da EEPROM ed è scomodo per i programmi archiviare i dati in flash. (I dati vengono archiviati in flash quando, ad esempio, si utilizza la parola chiave "const" in una dichiarazione di dati o si definisce una stringa, ma che viene gestita dietro le quinte dal compilatore e dal linker.)
L'area EEPROM può essere utilizzata per contenere la configurazione o altri dati che si desidera siano disponibili durante i riavvii, anche se il microcontrollore ha perso energia e viene quindi riacceso. Funzionalmente, puoi pensare alla EEPROM come un disco rigido molto piccolo o una scheda SD.
Sui microcontrollori senza EEPROM, è possibile archiviare dati persistenti nella memoria flash, ma ciò diventa difficile poiché i microcontrollori non sono stati realmente progettati per questo, e devi trovare un posto speciale che non interferisca con il codice del programma e metterlo da parte con il linker. Inoltre, come indicato di seguito, di solito è possibile aggiornare la EEPROM molte volte più del flash.
Se esegui i dati del programma in flash, ciò non significa che puoi accedere ai dati come variabili nel tuo programma C, perché non c'è modo di dire al compilatore dove si trovano queste variabili nel tuo codice (cioè non puoi associare una const variabile in quest'area del flash.) Quindi la loro lettura deve essere fatta attraverso l'apposito set di registri che vengono usati per scriverli. Nota che questa restrizione si applica anche ai dati nella EEPROM, quindi non ha alcun vantaggio al riguardo.
Per programmare flash o EEPROM, è necessario prima cancellare un blocco di memoria. Quindi è programmato. Per il flash, la scrittura di solito viene eseguita anche un blocco alla volta. Per le EEPROM, può essere fatto da blocchi o un byte alla volta, a seconda del microcontrollore.
Sia per Flash che per EEPROM, esiste un numero massimo di volte che è possibile aggiornarli prima di esaurire la memoria. Questo numero è indicato nella scheda tecnica come valore minimo garantito. Di solito è molto più alto per le EEPROM che per la memoria flash. Per il flash, ho visto numeri fino a 1000. Per le EEPROM, ho visto numeri fino a 1.000.000.
Un vantaggio delle EEPROM rispetto al flash è che puoi cancellarle molte volte più di quanto tu possa cancellare il flash.
"In-System Self-programmable" significa semplicemente che il microcontrollore può aggiornare il proprio flash mentre è in esecuzione. La funzione viene generalmente utilizzata per aggiornare il codice nel campo. Il trucco è che devi lasciare un po 'di codice nel sistema mentre il programma principale viene aggiornato, chiamato bootloader. Questo schema viene utilizzato nel sistema Arduino per programmare il chip.