Forum: Mikrocontroller und Digitale Elektronik Temperaturen im Flash Pointer


von Flash writer (Gast)


Lesenswert?

Hallo, ich überlege gerade wie man am einfachsten einen Temperaturlogger 
realisiert. Eine Messung benötigt 16 Bit. In einem Stm32f103 mit 
ca.100kb Flash lässt sich einiges speichern, nur ergibt sich das Problem 
"woher weiß ich beim auslesen wie viele Messungen gespeichert sind". 
Folgedessen muss eine Variable mit jeder Messung inkrementiert werden 
und auch abgespeichert werden. Im Datasheet steht 10k bis 100k 
Lebenserwartung. Wie umgehe ich das Problem ohne, dass ich meinen Flash 
kaputt schreibe.

von tux (Gast)


Lesenswert?


von Stefan K. (stefan64)


Lesenswert?

Bei ST gibt es eine Application-note "virtuelles EEPROM im Flash", schau 
die mal an.

Bei der Speicherung im EEPROM oder Flash ist eine Index-Variable, die 
auf den aktuellen Temperaturwert zeigt, ziemlich problematisch (da diese 
Zelle bei jedem Schreibvorgang inkrementiert werden würde). Besser ist 
es, den Wert vor dem aktuellen Wert mit einer Null zu beschreiben, 
anhand derer Du den aktuellen Wert finden kannst.

Gruß, Stefan

von Alexander L. (alexander82)


Lesenswert?

Hallo,
als Tipp Ringspeicher, damit ist das Problem mit den Schreibzyklen 
gelöst.

Wenn dein Ringspeicher mit 0xFFFF gefüllt ist, musst du nur von Beginn 
bis 0xFFFF scannen und du kennst die Anzahl. Dies fällt zwangsweise ab, 
da du im Flash nur ganze Sektoren löschen kannst. (schreiben geht 
byteweise). Falls du wirklich 16-Bit ausnutzt, dann lege die Werte als 
32-Bit ab.

An der Stelle musst du einen kompletten Sektor für die Messwerte 
vorhalten, da du ja nur diesen komplett löschen kannst. Bitte im 
Datenblatt nachschauen, die meisten STM32 haben unterschiedliche 
Sektorgrößen innerhalb des Flash (z.B. 4x 4kB, 3x 16kB, 1x 64kB macht 
zusammen 128kB)

Gruß Alex

von Arc N. (arc)


Lesenswert?

Alexander L. schrieb:
> Hallo,
> als Tipp Ringspeicher, damit ist das Problem mit den Schreibzyklen
> gelöst...

Kleine Ergänzung dazu noch:
Irgendwo wird wahrscheinlich auch Startzeit/datum und Messintervall 
gespeichert werden, dann kann man den gesamten Bereich, je nach 
gewünschtem Overhead, auch in bspw. Blöcke a 64 Byte aufteilen und an 
den Beginn z.B. Zeitstempel (32-Bit mit Sekunden seit xy) packen.
Wenn es kein Ringspeicher wird und stattdessen immer von "vorn" 
geschrieben wird, kann dann der letzte geschriebene Block auch mit einer 
"halben" Binärsuche gefunden werden.

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.