De nos jours, la mémoire Flash est utilisée pour contenir le code du programme et l'EEPROM (mémoire morte effaçable électriquement) est utilisée pour contenir les données persistantes. Il y a environ 30 ans, avant l'arrivée de Flash, les EEPROM étaient utilisées pour conserver le code du programme.
En fait, la ROM (mémoire morte) est arrivée en premier, puis la PROM (ROM programmable, une seule fois), l'EPROM (PROM effaçable avec une lumière UV), l'EEPROM et enfin Flash. Les ROM sont encore utilisées pour des applications à très haut volume et à faible coût (par exemple, des cartes de voeux parlantes).
La différence importante avec les microcontrôleurs actuels est que vous ne pouvez généralement pas exécuter de code à partir d'EEPROM, et il est gênant pour les programmes de stocker des données en flash. (Les données sont stockées en flash lorsque, par exemple, vous utilisez le mot-clé "const" dans une déclaration de données ou définissez une chaîne, mais qui est géré en arrière-plan par le compilateur et l'éditeur de liens.)
La zone EEPROM peut être utilisée pour conserver la configuration ou d'autres données que vous souhaitez être disponibles lors des redémarrages, y compris si le microcontrôleur a perdu l'alimentation et est ensuite remis sous tension. Fonctionnellement, vous pouvez considérer l'EEPROM comme un très petit disque dur ou une carte SD.
Sur les microcontrôleurs sans EEPROM, il est possible de stocker des données persistantes dans la mémoire flash, mais cela devient difficile car les microcontrôleurs n'ont pas été vraiment conçus pour cela, et vous devez trouver un endroit spécial qui n'interfère pas avec le code du programme, et le mettre de côté avec l'éditeur de liens. De plus, comme mentionné ci-dessous, vous pouvez généralement mettre à jour l'EEPROM plusieurs fois plus que le flash.
Si vous programmez des données en flash, cela ne signifie pas que vous pouvez accéder aux données en tant que variables dans votre programme C, car il n'y a aucun moyen de dire au compilateur où se trouvent ces variables dans votre code (c'est-à-dire que vous ne pouvez pas lier un const variable à cette zone de flash.) Donc, leur lecture doit être effectuée à travers l'ensemble spécial de registres qui sont utilisés pour les écrire. Notez que cette restriction s'applique également aux données en EEPROM, elle n'a donc aucun avantage à cet égard.
Pour programmer un flash ou une EEPROM, un bloc de mémoire doit d'abord être effacé. Ensuite, il est programmé. Pour le flash, l'écriture se fait également en bloc à la fois. Pour les EEPROM, cela peut être fait par blocs ou par octet à la fois, selon le microcontrôleur.
Pour les flashs et les EEPROM, vous pouvez les mettre à jour un nombre maximum de fois avant d'épuiser la mémoire. Ce numéro est donné dans la fiche technique comme valeur minimale garantie. Elle est généralement beaucoup plus élevée pour les EEPROM que pour la mémoire flash. Pour le flash, j'ai vu des nombres aussi bas que 1 000. Pour les EEPROM, j'ai vu des nombres aussi élevés que 1 000 000.
Un des avantages des EEPROM par rapport au flash est que vous pouvez les effacer beaucoup plus de fois que vous ne pouvez effacer le flash.
"Auto-programmable dans le système" signifie simplement que le microcontrôleur peut mettre à jour son propre flash pendant son fonctionnement. La fonctionnalité est généralement utilisée pour mettre à jour le code sur le terrain. L'astuce est que vous devez laisser du code dans le système pendant la mise à jour du programme principal, appelé le chargeur de démarrage. Ce schéma est utilisé dans le système Arduino pour programmer la puce.
J'ajouterai plus d'informations à l'excellente réponse de @tcrosley.
L'ATmega16 implémente une architecture Harvard , c'est-à-dire une topologie système où la mémoire de données est séparée de la mémoire du programme. Citant le paragraphe pertinent de la fiche technique Atmega16 (page 8):
L'architecture Harvard a l'avantage de n'avoir aucun conflit de bus entre les cycles de récupération d'instructions et les cycles d'accès aux données, car les données et les instructions ne partagent pas le même bus, comme dans votre architecture PC conventionnelle.
Par conséquent, la mémoire flash est utilisée comme mémoire de programme, tandis que la mémoire de données est divisée entre SRAM (pour les données transitoires, comme la pile d'appels de fonction et le tas - si vous programmez en C, par exemple) et l'EEPROM (pour le stockage permanent) .
la source