Flash et EEPROM

14

La fiche technique Atmega16 indique qu'elle a

a) 16 Ko de mémoire de programme Flash auto-programmable dans le système et b) EEPROM de 512 octets.

Un microcontrôleur peut-il avoir deux ROM distinctes qui peuvent être programmées via la technologie EEPROM et la technologie Flash?

Ou mon inférence (comme indiqué ci-dessus) de la fiche technique est-elle erronée?

Je sais que notre programme est stocké dans la mémoire flash, alors pourquoi quelqu'un aura-t-il besoin d'EEPROM? Quelle est son utilisation si nous avons une mémoire flash pour le programme?

Quelqu'un peut-il également expliquer le terme "auto-programmable dans le système"

Ce que je sais: la technologie Flash peut écrire le programme en blocs de données tandis que l'EEPROM peut écrire des données octet par octet.

Jasser
la source

Réponses:

21

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.

tcrosley
la source
Merci pour votre réponse monsieur. Donc, pour entrer des données dans l'EEPROM, j'aurai besoin d'un programmeur EEPROM comme dans un programmateur USBASP pour vider le programme dans la mémoire flash? Ai-je raison, monsieur.
Jasser
1
@Jasser Non, vous n'avez pas besoin d'un programmeur externe. Vous accéderez à l'EEPROM depuis votre programme. Il y aura un ensemble de registres à l'intérieur de l'ATmega qui, en leur écrivant, vous permettra de mettre à jour l'EEPROM. Vous devrez également utiliser ces registres pour lire l'EEPROM, car il n'apparaîtra pas dans la carte d'adresses normale. Les informations sur la façon d'effacer, d'écrire et de lire l'EEPROM seront dans la fiche technique de la puce.
tcrosley
Étant donné que nous pouvons écrire ou lire à partir de l'EEPROM à l'intérieur du microcontrôleur, le microcontrôleur devrait avoir un circuit pour stocker les données à l'intérieur de l'EEPROM et qui devrait être similaire au programmeur EEPROM. Cela m'amène à nouveau à une autre question: comme l'EEPROM peut être remontée environ 100 000 fois par la suite, il se peut que nous ne puissions pas stocker de données à l'intérieur de l'EEPROM via les registres. Ces déclarations ont-elles un sens? @tcrosley
Jasser
1
@Jasser Correct, le nombre de mises à jour de l'EEPROM est limité. C'est généralement beaucoup plus élevé (parfois un ordre de grandeur de plus) que le nombre de fois que vous pouvez mettre à jour le flash. J'aurais dû le mentionner dans ma réponse et je le mettrai à jour. Le numéro que vous avez cité est un minimum garanti par le fabricant de puces; J'ai fait quelques tests une fois avec une puce qui était spécifiée pour 100 000 écritures, et elle dépassait largement les 500 000 avant que des erreurs ne soient détectées.
tcrosley
1
@Jasser Oui, il est un peu plus difficile de configurer les données en flash. En outre, comme indiqué dans ma mise à jour de ma réponse, vous pouvez effacer et reprogrammer l'EEPROM plusieurs fois plus (généralement 10x) que le flash.
tcrosley
4

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):

Afin de maximiser les performances et le parallélisme, l'AVR utilise une architecture Harvard - avec des mémoires et des bus séparés pour les programmes et les données. Les instructions dans la mémoire du programme sont exécutées avec un pipelining à un seul niveau. Pendant l'exécution d'une instruction, l'instruction suivante est extraite de la mémoire du programme. Ce concept permet d'exécuter des instructions à chaque cycle d'horloge. La mémoire du programme est une mémoire flash reprogrammable dans le système.

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) .

Lorenzo Donati soutient Monica
la source