Forum: Mikrocontroller und Digitale Elektronik EEPROM Speicher Verwaltung


von Matthias F. (frank91)


Lesenswert?

Hallo alle zusammen,

Ich verwende gerade zum ersten mal ein externes EEPROM.
Bytes schreiben und auslesen funktioniert auch bereits.
Das ich bei uint16_t mehrere bytes im EEPROM belegen muss ist mir klar.

SO jetzt meine Frage:
Gibt es eine Möglichkeit, dass die Speicherplatzzuweisung automatisch 
erfolgt oder muss ich mir hier selbst den Kopf zerbrechen?
Schön wäre, wenn man wie bei internen EEPROM bei ATMEL Controllern eine 
Möglichkeit wie "EMEMM" hätte.
Mein verwendeter Controller ist ein STM32f4.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Es gibt die Möglichkeit sich eine Struktur an zu legen:

struct EE_Data {
 uint8_t  VersionDer_EEPROM_Struktur; // Für Update wichtig
 unit8_t  DatenEEPROMGueltig; // Zahl was anderes als 0xFF
 uint16_t Parameter1;
 uint16_t Parameter2;
 uint8_t Parameter3;
 uint8_t Parameter4;
 uint8_t Parameter5;
 uint8_t Parameter6;
 uint32_t Parameter7;
 uint32_t Parameter8;
 int32_t Parameter9;
 uint8_t ParamTable1[256];
};

Und dann schreibst Du diese komplette Struktur in das EEPROM, bzw liest 
diese wieder aus.

Beim Schreiben musst Du aufpassen, da das EEPROM nur maximal eine 
PageSize auf einmal schreiben kann und danach eine kurze Wartezeit 
benötigt. Da musst Du eine Schleife aufbauen, die Erkennt wie viele 
Bytes deine Struktur groß ist (sizeof(EE_Data)).

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Ich habe bei einem anderen Projekt je Page nur eine einzige Variable 
abgelegt. Dabei wird eine Zahl für "DatenEEPROMGueltig" sowie die Zahl 
und die ~Zahl gespeichert. Damit weiß ich dass die Variable einmal 
gespeichert worden ist und dass diese Zahl auch gültig ist.

Je nach dem was für Parameter man ablegen möchte gibt es 
unterschiedliche Methoden.

Für meine Anwendung kam daher ein EEPROM 24LC512 zum Einsatz, das hat 
eine PageSize von 16 Byte, wovon ich 12 Byte nutze und 32 Pages, da mir 
32 Parameter dicke reichen.
Da das EEPROM eine Schreib-Rate von 1Mio Zyklen hat, kann ich jeden 
einzelnen Parameter 1 Mio mal schreiben. Bei der ersten Variante kann 
man nur alle Parameter 1 Mio mal schreiben - das ist der Unterschied.

von Matthias F. (frank91)


Lesenswert?

Markus M. schrieb:
> Es gibt die Möglichkeit sich eine Struktur an zu legen.


Finde ich schon einen guten Ansatz.
Aber das heißt ja dann auch, dass ich beim schreiben jedes mal die 
gesamte Struktur schreiben muss.

von Sascha W. (sascha-w)


Lesenswert?

Matthias F. schrieb:
> Markus M. schrieb:
>> Es gibt die Möglichkeit sich eine Struktur an zu legen.
>
>
> Finde ich schon einen guten Ansatz.
> Aber das heißt ja dann auch, dass ich beim schreiben jedes mal die
> gesamte Struktur schreiben muss.
Warum?
Du liest zuerst Pageweise die Daten noch mal aus und vergleichst mit den 
Daten in der Struktur. Wird ein Unterschied festgestellt schreibst dann 
nur diese Page neu. Spart Zeit und schon den EEprom. Macht aber mM nach 
nur Sinn wenn die Struktur klein bleibt - belegt ja schließlich RAM in 
entsprechender Größe.

Sascha

von Matthias F. (frank91)


Lesenswert?

> Macht aber mM nach
> nur Sinn wenn die Struktur klein bleibt - belegt ja schließlich RAM in
> entsprechender Größe.

Ja ich denke, dass die Datenmengen nicht allzu groß werden.

Das mit der Struktur ist auch momentan die beste Möglichkeit, welche mir 
einfallen würde.

Vor allem
uint8_t  VersionDer_EEPROM_Struktur; // Für Update wichtig
unit8_t  DatenEEPROMGueltig; // Zahl was anderes als 0xFF
finde ich sehr sinnvoll.

Allerdings hatte ich immer noch gehofft eine Möglichkeit zu finden, dass 
ich mich nicht selbst im die Adressen kümmern muss.
Hier muss ich jetzt quasi (zumindest für jede Page) mir selbst die 
Gedanken über die Adressierung machen.

Wahrscheinlich werde ich 2 gleiche Strukturen erstellen.
In der einen Speichere ich mein eigentlichen Werte und in der anderen 
die dazugehörige Adresse.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.