Forum: Mikrocontroller und Digitale Elektronik Sytemlaufzeit bei STM32F4xx speichern


von Starseed (Gast)


Lesenswert?

Hallo Zusammen,

ich würde gerne tracken, wie lange mein System seit dem ersten mal 
einschalten insgesamt gelaufen ist (Hauptsächlich für Loggingzwecke). 
Der Microcontroller soll ein STM32F4 werden.

Der Plan wäre gewesen, nach jedem Einschalten des Systems die bisherige 
Systemlaufzeit zu laden und alle 1ms diesen Wert um eins zu 
inkrementieren (1ms reicht für meine Zwecke dicke). Der Knackpunkt an 
der Geschichte ist das Speichern der aktuellen Systemlaufzeit, so dass 
ich sie auch wieder Laden kann. Vor allem vor dem Hintergrund, dass die 
Spannungsversorgung jederzeit abbrechen kann ("Ausschalten").

Wie wird sowas denn typischerweise realisiert?

Vielen Dank und Grüße!

von hp-freund (Gast)


Lesenswert?

Mit einer backup Batterie, dem backup SRAM und backup RTC Registern ist 
eine Variante.

von eagle user (Gast)


Lesenswert?

Es gibt RTC-Chips, die die aktuelle Uhrzeit in eigenen Timestamp 
Registern speichern sobald sie auf Batterieversorgung umschalten, z.B. 
PCF2129T.

von 6a66 (Gast)


Lesenswert?

hp-freund schrieb:
> Mit einer backup Batterie, dem backup SRAM und backup RTC Registern ist
> eine Variante.

Der Prozessor hat extra Register die den Inhalt nicht verlieren solange 
die Backup Domain unter Spannung steht.
Alternativen dazu wenn keine Spannung mehr anliegt: Im internen EEPROM 
speichern (wenn vorhanden, ich denke die F4 haben das noch nicht), in 
einem externen EERPOM speichern oder im internen Flash.
Beim Speichern im EERPOM oder FLASH das Thema "Wear Levelling" beachten.

rgds

von WehOhWeh (Gast)


Lesenswert?

Mein Vorschlag als Alternative zum SRAM wäre FRAM, das braucht keine 
Backupbatterie. Ein ganz kleines mit 4k oder so reicht da ja. Giebts mit 
I2C.

Das hat mehr als ausreichend Schreibzyklen dafür.

Du musst allerdings immer irgendwie sicherstellen, dass du beim 
Schreiben nicht unterbrochen wirst, z.B. durch das Ausschalten der 
Stromversorgung. Hier ist kapazitive Pufferung und eine 
Vorausfallsmeldung angesagt. Hierfür gehen z.B. Resetcontroller oder 
ähnliches.

Wenn man z.B. 10ms zur Vollendung des Schreibvorgangs braucht (weil das 
erst über I2C raus muss), ist das noch gut mit normalen Elkos oder sogar 
nur mit den normalen Pufferkondensatoren realisierbar, wenn der 
Stromverbrauch im unteren mA Bereich liegt. Man hat ja oft 3V3, aber die 
Kisten rennen  laut Spec bis 1V8 runter.

von Johannes O. (jojo_2)


Lesenswert?

Starseed schrieb:
> Wie wird sowas denn typischerweise realisiert?

Kommt auf die Anforderungen drauf an.
Folgende Faktoren würde ich berücksichtigen:

- Muss es manipulationssicher ausgeführt sein?
- Welche zeitliche Auflösung brauchst du?
- Wie oft wird ein/aus geschaltet, wie lange ist die erwartete 
durchschnittliche Betriebsdauer?
- Externe Bauteile möglich?
- Produkt, Bastelei oder Labortest/Forschung&Entwicklung?


Da geht die Lösung von (interne) RTC mit Batteriepuffer über internes 
Flash/EEPROM bis hin zu externes FRAM/MRAM/Flash.

von 6a66 (Gast)


Lesenswert?

WehOhWeh schrieb:
> Mein Vorschlag als Alternative zum SRAM wäre FRAM, das braucht keine
> Backupbatterie. Ein ganz kleines mit 4k oder so reicht da ja. Giebts mit
> I2C.

Interessant :)
Danke!

rgds

von Pete K. (pete77)


Lesenswert?

Ich weiss, ist uncool, gibt es aber auch fertig zu kaufen:
https://www.conrad.de/technik/betriebsstundenzaehler.html

von Starseed (Gast)


Lesenswert?

Hallo,

vielen Dank für die hilfreichen Antworten.

Ein so großer Kasten als Zähler kommt nicht in Frage, es muss eine 
embedded Lösung (im wahrsten Sinne des Wortes) sein.

Aus regulatorischen Gründen sind Batterien leider auch nicht drin 
(obwohl mit Sicherheit die beste Lösung).

Eine Abschaltdetektion + Verzögerung durch Kondensatoren oder der FRAM 
scheinen mir die schönsten Lösungen zu sein.

Wie kritisch ist ein Speicherabbruch (Stromausfall) während des 
Schreibens beim:

- Internen Flash
- EEPROM
- FRAM

?

Vielen Dank und Grüße!

von 6a66 (Gast)


Lesenswert?

Starseed schrieb:
> - EEPROM

Da ist die Zelle halt noch nicht geschrieben. Wenn Du allerdings mehrere 
Zellen in einem Rutsch schreibst kann Dir das dazwischen unterbrochen 
werden und dann hast Du u.U. illegale Zustände Deines Inhaltes (z.B. 
32bit auf 4x8bit aufgeteilt, aber nur 2x8bit geschrieben.
Kommt halt darauf an wie schnell Du bist, was Du wie schreiben 
möchstest. Das wird aber bei allen Systemen so sein.

rgds

von Starseed (Gast)


Lesenswert?

Hallo,

also kann ich theoretisch folgendes machen:

Ich schreibe regelmäßig in den Flash (mit einem simplen 
Speicheralgorithmus, welcher einen Flashbereich linear beschreibt bis 
dieser voll ist und dann wieder von vorne beginnt) die aktuelle 
Systemzeit + Checksumme.

Sollte mir die Spannung während des Schreibens abhauen, habe ich 
schlimmstenfalls einen Schreibzyklus verloren (erkenne ich anhand der 
fehlerhaften Checksumme). Stelle ich so einen Fehler fest, stelle ich 
einfach den letzten gültigen Wert wieder her und mache weiter als wäre 
nichts gewesen.

Wichtig wäre halt, dass mir nicht der ganze Flashblock flöten geht, in 
dem ich gerade die Schreiboperation durchführe, während mir der µC 
ausgeht.

Viele Grüße!

von Gerd E. (robberknight)


Lesenswert?

Starseed schrieb:
> Ich schreibe regelmäßig in den Flash (mit einem simplen
> Speicheralgorithmus, welcher einen Flashbereich linear beschreibt bis
> dieser voll ist und dann wieder von vorne beginnt) die aktuelle
> Systemzeit + Checksumme.
[...]
> Wichtig wäre halt, dass mir nicht der ganze Flashblock flöten geht, in
> dem ich gerade die Schreiboperation durchführe, während mir der µC
> ausgeht.

Bei Flash-Speicher hast Du halt das Problem, daß Du immer nur einen 
ganzen Block am Stück löschen kannst und das dann auch noch ne Weile 
dauert. Wenn in dem Augenblick der Stecker gezogen wird, dann ist das 
Flash danach in irgendeinem undefinierten Zustand.

Flash würde ich daher nicht ohne Lösung mit sauberer Spannungspufferung 
(z.B. Kondensator) verwenden.

Ohne Kondensatorpufferung würde ich eher FRAM nehmen und dort das oben 
von Dir beschriebene Prinzip anwenden.

von Starseed (Gast)


Lesenswert?

Hallo Gerd,

FRAM ist leider relativ teuer, der Flash kostenlos dabei. Es wäre also 
schön  irgendwie den Flash nutzen zu können.

Ich hätte gemeint, dass man den Flash Block nur einmal initial löschen 
muss (=> jedes byte auf 0xFF), und ihn dann beliebig umschreiben kann 
solange man dadurch nur Bits vom Zustand 1 auf 0 setzt.

Sprich ich würde so vorgehen (stark vereinfacht):
Löschen 4 byte block, Speicherzustand: 0xFF 0xFF 0xFF 0xFF
1. Schreibzyklus: 0x01 0xFF 0xFF 0xFF
2. Schreibzyklus: 0x01 0x02 0xFF 0xFF
3. Schreibzyklus: 0x01 0x02 0x03 0xFF
4. Schreibzyklus: 0x01 0x02 0x03 0x04
5. Schreibzyklus, wieder löschen des 4 byte block + 1. byte schreiben: 
0x05 0xFF 0xFF 0xFF
usw.usf...

Oder habe ich hier jetzt einen größeren Denkfehler drin?

Einen schönen Elko + Eingangsspannungsüberwachung ist aber durchaus 
realisierbar.

Viele Grüße!

(PS: Checksumme etc.pp. der Einfachheit weg gelassen)

von Gerd E. (robberknight)


Lesenswert?

Starseed schrieb:
> FRAM ist leider relativ teuer, der Flash kostenlos dabei. Es wäre also
> schön  irgendwie den Flash nutzen zu können.

Naja, nicht mal 90 Cent:
https://octopart.com/search?q=FM24CL04B

Dafür sparst Du halt den dicken Kondensator den Du bei der Flash-Lösung 
brauchst.

> Ich hätte gemeint, dass man den Flash Block nur einmal initial löschen
> muss (=> jedes byte auf 0xFF), und ihn dann beliebig umschreiben kann
> solange man dadurch nur Bits vom Zustand 1 auf 0 setzt.

klar, das ist schon richtig.

Aber irgendwann bist Du am Ende von Deinem Flash-Block angekommen und 
musst den nächsten Löschen. Und genau dieser Löschvorgang ist der 
kritische Moment. Wenn da der Saft abgedreht wird, ist der hinterher in 
nem undefinierten Zustand.

Sowas ist durchaus ernst zu nehmen, ich erinnere mich noch an Atmegas 
bei denen danach das ganze EEPROM durcheinander war. Das ist natürlich 
ein ganz anderer Hersteller und µC, aber ich glaube nicht daß ST Dir 
garantiert daß das alles sauber abgefangen wird.

Also musst Du Dir aus dem Datenblatt von Deinem Controller die maximale 
Löschdauer für ne Flash-Page holen, den worst-case Stromverbrauch den 
Controllers berechnen und den Kondensator dann so dimensionieren, daß 
der Löschvorgang immer sauber abgeschlossen werden kann.

von Steffen R. (steffen_rose)


Lesenswert?

Starseed schrieb:
> Löschen 4 byte block, Speicherzustand: 0xFF 0xFF 0xFF 0xFF
> 1. Schreibzyklus: 0x01 0xFF 0xFF 0xFF
> 2. Schreibzyklus: 0x01 0x02 0xFF 0xFF

Überflashen ist hier nicht erlaubt. Ob sich dies auf die jeweilige 
Schreibbreite oder auf das ganze Word bezieht, bin ich mit im Moment 
unsicher.

Starseed schrieb:
> Sollte mir die Spannung während des Schreibens abhauen, habe ich
> schlimmstenfalls einen Schreibzyklus verloren

Hier bekommt man wenig Infos. Das löschen und Schreiben ins Flash ist 
kein simpler Vorgang. Es werden Spannungen angehoben ...
Daher kannst Du nur vom Hersteller gesicherte Informationen bekommen, 
wie sich eine Spannungsunterbrechung in dieser Situation auswirkt. Mit 
etwas Pech wird die gesamte Bank in Mitleidenschaft gezogen.

von Pete K. (pete77)


Lesenswert?

Woher bekommst Du denn die neue Zeit, wenn die Stromversorgung 
einbricht?

Falls Du eine batteriegepufferte RTC benutzt, dann schau mal, ob da 
nicht ein paar Bytes EEPROM verfügbar sind.

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.