EEPROM-Überlauf

Ich habe STM32f401RE verwendet und eine Reihe von Zahlen im AT24c512 gespeichert, EEPROM-Lese- und Schreibvorgänge wurden mehrmals während der Implementierung des Codes durchgeführt, etwa 10.000 Mal bei jeder Codeausführung. Am Anfang werden die Nummern des EEPROM richtig gelesen und richtig darauf geschrieben.

Aber wenn dieses Gerät für etwa 5 bis 6 Stunden beleuchtet bleibt und die EEPROM-Daten geschrieben und gelesen werden können, erhält der Mikrocontroller nicht die richtigen Zahlen.

Beispielsweise sollte 500 in das EEPROM geschrieben werden, aber diese Zahl, die aus dem EEPROM gelesen wird, ist 1.589.436. Dass durch Ausschalten des Gerätes oder Schreiben die neuen Nummern nicht korrekt ausgegeben werden. Was ist Ihrer Meinung nach das Problem? Wie behebe ich das?

Haben Sie das Datenblatt gelesen, um zu überprüfen, was die Schreibausdauerspezifikation für Ihr EEPROM ist? Es ist gleich auf der 1. Seite.
EEPROMs haben eine begrenzte Lebensdauer beim Schreiben in den Speicher; Jedes Bit eines AT24c512 ist so spezifiziert, dass es 100000 Schreibzyklen übersteht. Es gibt wahrscheinlich einen großen Spielraum über den angegebenen 100.000 Schreibvorgängen, aber irgendwann wird der Speicher verschleißen, wenn Sie nichts tun, außer Daten 6 Stunden lang immer wieder an dieselben Adressen zu schreiben.
Wie kann ich nun meine Daten lesen und schreiben? Jetzt kann ich EEPROM nicht verwenden
Warum haben Sie sich für EEPROM entschieden? Warum kein Arbeitsspeicher?
@Mehrshad: Denken Sie über eine andere Strategie nach. Ich kann mir nicht vorstellen, dass es wirklich notwendig ist, so oft in einen nicht flüchtigen Speicher zu schreiben / zu löschen, aber wenn ja, sind andere Technologien möglicherweise die bessere Wahl. Schauen Sie sich zum Beispiel Folgendes an: ti.com/lit/an/slaa526a/slaa526a.pdf

Antworten (1)

Es scheint, dass Sie das EEPROM abnutzen. Alle diese Floating-Gate-Speicherzellen können nur begrenzt oft beschrieben und gelöscht werden, bevor sie irreparabel beschädigt werden. Überprüfen Sie das Datenblatt. Es sollte die garantierten Mindestlebensdauerwerte für Schreib- und Löschvorgänge angeben.

Die meisten reinen EEPROMs sind für deutlich mehr als 10.000 solcher Operationen ausgelegt. Das ist es jedoch, was Ihr Code anscheinend jedes Mal tut . Und insbesondere während der Entwicklung und beim Debuggen ist es durchaus möglich, dass etwas in einer Schleife ausgeführt wurde und diese Operationen viele Male ausgeführt hat.

Ihr EEPROM ist geröstet, fertig, abgenutzt. Wenn Sie ihn durch einen neuen Chip ersetzen und das Problem (vorübergehend) verschwindet, dann ist das definitiv passiert.

Wenn Sie häufige Aktualisierungen von nichtflüchtigen Daten benötigen, müssen Sie im Allgemeinen etwas anderes tun, als einfach blind ein EEPROM anzuschließen. Die erste Strategie besteht darin, die Architektur so zu ändern, dass der nichtflüchtige Zustand nicht so oft aktualisiert werden muss. Wenn das nicht möglich ist, dann leben Sie entweder mit der begrenzten Lebensdauer oder verwenden eine andere Technologie.

Etwas anderes, das Sie sich ansehen sollten, ist, wie genau die Firmware in das EEPROM schreibt. Diese Dinge haben normalerweise "Seiten", die gleichzeitig elektrisch gelöscht oder beschrieben werden. Manchmal ist das Schreiben einzelner Bytes möglich, zählt aber dennoch als ein Ereignis für die gesamte Seite.

Die Firmware muss daher intelligent sein, wie Schreibvorgänge durchgeführt werden. Normalerweise erstelle ich Schnittstellenroutinen, die es ermöglichen, einzelne Bytes zufällig zu lesen oder zu schreiben. Darunter cachen sie jedoch wirklich eine ganze Seite. Schreibvorgänge gehen nicht in das physische EEPROM, bis eine andere Seite benötigt wird oder bis die explizite FLUSH-Routine aufgerufen wird. Manchmal wird die FLUSH-Routine automatisch von einem Timer aufgerufen.

In allen Fällen führen Sie jedoch keinen physischen Schreibvorgang durch, wenn kein Wert geändert wird. Ich behalte ein "schmutziges" Bit, das angibt, ob die zwischengespeicherte Seite geändert wurde, seit sie aus dem EEPROM gelesen wurde. Beim Wechseln zu einer anderen Seite erfolgt kein Schreibvorgang, wenn der aktuelle Cache nicht schmutzig ist. Es gibt auch eine Logik, um zu prüfen, ob einzelne Byte-Schreibvorgänge den zwischengespeicherten Wert nicht ändern. In diesem Fall wird das Dirty-Flag nicht gesetzt.

Geeignete EEPROM-Zugriffsroutinen auf niedriger Ebene können helfen, aber die Anwendung muss sich auch der Beschränkungen des nichtflüchtigen Speichers bewusst sein. Sie sollten beispielsweise vermeiden, im gesamten Adressraum herumzuspringen und kleine Zahlen von Bytes zu schreiben. Wenn Sie viel schreiben müssen, achten Sie darauf, dies nacheinander zu tun.

Natürlich können Sie beispielsweise nicht jede Sekunde einen neuen Wert schreiben und erwarten, dass ein Gerät mit 100.000 Schreibvorgängen mehr als 28 Stunden hält. Selbst ein Gerät mit einer Lebensdauer von 1.000.000 Schreibvorgängen würde in diesem Fall nicht einmal 12 Tage halten.

Danke, jetzt brauche ich Nummern speichern und diese Nummern sind sehr wichtig, also wenn die Stromversorgung niedrig ist oder das Board zurückgesetzt wird, sollten diese Nummern nicht gelöscht werden. Wie kann ich diese Zahlen zu diesem Zeitpunkt speichern und lesen? während ich viele und viele lesen und schreiben muss.
@Mehrshad Sie könnten die Daten im RAM behalten und den RAM-Inhalt in das EEPROM schreiben, sobald Sie feststellen, dass die Stromversorgung nicht mehr verfügbar ist. Beim Einschalten würden Sie die EEPROM-Daten in den RAM kopieren. Natürlich müssen Sie das EEPROM und den Prozessor irgendwie mit Strom versorgen, wenn die Stromversorgung unterbrochen wird, bis die Datenübertragung abgeschlossen ist. Ein großer Kondensator, der von einer Schottky-Diode gespeist wird, sollte ausreichen.
Ok, wie kann ich feststellen, dass die Stromversorgung nicht mehr verfügbar ist? Ich arbeite mit STM32F401RE
@Mehrshad Während Ihr Mikrocontroller keinen analogen Komparator hat, können Sie den ADC verwenden, um die Eingangsspannung in einen digitalen Wert umzuwandeln. Da die Eingangsspannung höchstwahrscheinlich höher ist als die Versorgungsspannung des Mikrocontrollers, benötigen Sie einen Spannungsteiler, um sie zu messen, etwa so . Dieser spezielle ADC hat auch eine Funktion nur für solche Fälle: den analogen Watchdog. Er kann so konfiguriert werden, dass ein Interrupt generiert wird, wenn die Eingangsspannung einen bestimmten Bereich verlässt.
@Olin Lathrop kann ich internen SRAM anstelle von EEPROM verwenden?
Wenn ich SRAM verwenden kann, wie kann ich eine Variable im SRAM definieren und meine Daten im SRAM speichern?