Flash und EEPROM

14

Atmega16 Datenblatt sagt, dass es hat

a) 16 KByte selbstprogrammierbarer systeminterner Flash-Programmspeicher und b) 512 Byte EEPROM.

Kann ein Mikrocontroller zwei separate ROMs haben, die mit EEPROM- und Flash-Technologie programmiert werden können?

Oder ist meine Schlussfolgerung (wie oben angegeben) aus dem Datenblatt falsch?

Ich weiß, dass unser Programm im Flash-Speicher gespeichert ist. Warum braucht jemand ein EEPROM? Was nützt es, wenn wir einen Flash-Speicher für das Programm haben?

Kann auch jemand erklären, was der Begriff "In-System Self-programmable" ist

Was ich weiß: Flash-Technologie kann das Programm in Datenblöcken schreiben, während EEPROM Daten byteweise schreiben kann.

Jasser
quelle

Antworten:

21

Heutzutage wird der Flash-Speicher zur Speicherung von Programmcode und der EEPROM (Electrically Erasable Read Only Memory) zur Speicherung persistenter Daten verwendet. Vor etwa 30 Jahren, bevor Flash auf den Markt kam, wurden EEPROMs zum Speichern von Programmcode verwendet.

Tatsächlich kamen zuerst ROM (Nur-Lese-Speicher), dann PROM (programmierbarer ROM, nur einmal), EPROM (mit UV-Licht löschbarer PROM), EEPROM und schließlich Flash. ROMs werden immer noch für sehr volumenstarke und kostengünstige Anwendungen (z. B. sprechende Grußkarten) verwendet.

Der wichtige Unterschied zu aktuellen Mikrocontrollern besteht darin, dass Sie im Allgemeinen keinen Code aus dem EEPROM ausführen können und es für Programme umständlich ist, Daten in Flash zu speichern. (Daten werden in Flash gespeichert, wenn Sie beispielsweise das Schlüsselwort "const" in einer Datendeklaration verwenden oder eine Zeichenfolge definieren, dies wird jedoch vom Compiler und Linker im Hintergrund behandelt.)

Der EEPROM-Bereich kann verwendet werden, um Konfigurationsdaten oder andere Daten zu speichern, die nach einem Neustart verfügbar sein sollen, z. Funktional kann man sich das EEPROM als eine sehr kleine Festplatte oder SD-Karte vorstellen.

Auf Mikrocontrollern ohne EEPROM ist es möglich, persistente Daten im Flash-Speicher zu speichern. Dies wird jedoch schwierig, da Mikrocontroller nicht wirklich dafür entwickelt wurden und Sie einen speziellen Ort suchen müssen, der den Programmcode nicht beeinträchtigt, und diesen beiseite legen mit dem Linker. Wie weiter unten erwähnt, können Sie das EEPROM in der Regel um ein Vielfaches mehr aktualisieren als das Flash.

Wenn Sie Daten in Flash programmieren, bedeutet dies nicht, dass Sie in Ihrem C-Programm als Variablen auf die Daten zugreifen können, da Sie dem Compiler nicht mitteilen können, wo sich diese Variablen in Ihrem Code befinden (dh, Sie können keine Konstante binden variabel auf diesen Bereich des Flashs.) Das Lesen muss also über die speziellen Register erfolgen, mit denen sie geschrieben werden. Beachten Sie, dass diese Einschränkung auch für die Daten im EEPROM gilt, sodass diesbezüglich kein Vorteil besteht.

Um Flash oder EEPROM zu programmieren, muss zuerst ein Speicherblock gelöscht werden. Dann ist es programmiert. Beim Flash wird normalerweise auch blockweise geschrieben. Bei EEPROMs kann dies je nach Mikrocontroller blockweise oder byteweise erfolgen.

Sowohl für Flash- als auch für EEPROMs können Sie sie maximal so oft aktualisieren, bis der Speicher aufgebraucht ist. Diese Nummer ist im Datenblatt als garantierter Mindestwert angegeben. Sie ist bei EEPROMs normalerweise viel höher als bei Flash-Speichern. Bei Flash habe ich Zahlen von nur 1000 gesehen. Bei EEPROMs habe ich Zahlen von bis zu 1.000.000 gesehen.

Ein Vorteil von EEPROMs gegenüber Flash ist, dass Sie sie viel häufiger löschen können als Flash.

"In-System Self-Programmable" bedeutet einfach, dass der Mikrocontroller seinen eigenen Flash aktualisieren kann, während er ausgeführt wird. Diese Funktion wird normalerweise verwendet, um den Code im Feld zu aktualisieren. Der Trick besteht darin, dass Sie Code im System belassen müssen, während das Hauptprogramm aktualisiert wird, das als Bootloader bezeichnet wird. Dieses Schema wird im Arduino-System verwendet, um den Chip zu programmieren.

Tcrosley
quelle
Vielen Dank für Ihre Antwort, Sir. Um Daten im EEPROM einzugeben, benötige ich einen EEPROM-Programmierer wie einen USBASP-Programmierer, um das Programm im Flash-Speicher abzulegen? Habe ich recht, Sir?
Jasser
1
@Jasser Nein, du brauchst keinen externen Programmierer. Sie greifen von Ihrem Programm aus auf das EEPROM zu. Im ATmega befindet sich eine Reihe von Registern, mit deren Hilfe Sie das EEPROM aktualisieren können. Sie müssen diese Register auch zum Auslesen aus dem EEPROM verwenden, da sie in der normalen Adresszuordnung nicht angezeigt werden. Informationen zum Löschen, Schreiben und Lesen des EEPROM finden Sie im Datenblatt des Chips.
Tcrosley
Da wir im Mikrocontroller aus dem EEPROM schreiben oder lesen können, sollte der Mikrocontroller über eine Schaltung zum Speichern von Daten im EEPROM verfügen, die der des EEPROM-Programmiergeräts ähnelt. Dies führt mich erneut zu einer anderen Frage: Da das EEPROM ungefähr 100.000 Mal verdrahtet werden kann, ist es möglicherweise nicht möglich, Daten im EEPROM über die Register zu speichern. Sind diese Aussagen sinnvoll? @tcrosley
Jasser
1
@Jasser Richtig, die Anzahl der Aktualisierungen des EEPROMs ist begrenzt. Dies ist in der Regel viel höher (manchmal eine Größenordnung höher) als die Häufigkeit, mit der Sie den Blitz aktualisieren können. Ich hätte das in meiner Antwort erwähnen sollen und werde es aktualisieren. Die von Ihnen angegebene Anzahl ist ein vom Chiphersteller garantiertes Minimum. Ich habe einige Tests einmal mit einem Chip durchgeführt, der für 100.000 Schreibvorgänge spezifiziert war, und es ging weit über 500.000, bevor irgendwelche Fehler entdeckt wurden.
Tcrosley
1
@Jasser Ja, es ist etwas schwieriger, die Daten in Flash einzurichten. Wie in meinem Update zu meiner Antwort erläutert, können Sie das EEPROM außerdem um ein Vielfaches (in der Regel 10x) löschen und neu programmieren.
Tcrosley
4

Ich werde der exzellenten Antwort von @tcrosley ein paar weitere Informationen hinzufügen.

Der ATmega16 implementiert eine Harvard-Architektur , dh eine Systemtopologie, bei der der Datenspeicher vom Programmspeicher getrennt ist. Zitieren des relevanten Abschnitts aus dem Atmega16-Datenblatt (Seite 8):

Um die Leistung und Parallelität zu maximieren, verwendet der AVR eine Harvard-Architektur - mit separaten Speichern und Bussen für Programm und Daten. Anweisungen im Programmspeicher werden mit einem einstufigen Pipelining ausgeführt. Während eine Anweisung ausgeführt wird, wird die nächste Anweisung aus dem Programmspeicher vorabgerufen. Dieses Konzept ermöglicht die Ausführung von Anweisungen in jedem Taktzyklus. Der Programmspeicher ist ein In-System Reprogrammable Flash-Speicher.

Die Harvard-Architektur hat den Vorteil, dass keine Buskonflikte zwischen Befehlsabrufzyklen und Datenzugriffszyklen auftreten, da sich Daten und Befehle nicht den gleichen Bus teilen, wie in Ihrer herkömmlichen PC-Architektur.

Daher wird der Flash-Speicher als Programmspeicher verwendet, während der Datenspeicher zwischen SRAM (für vorübergehende Daten wie Funktionsaufrufstapel und Heap - wenn Sie beispielsweise in C programmieren) und EEPROM (für dauerhafte Speicherung) aufgeteilt wird. .

Lorenzo Donati unterstützt Monica
quelle