Ich habe also ein STM32F4-Board und lange Rede kurzer Sinn - ich hänge daran, eine benutzerdefinierte Nummer (0 - 60) in den FLASH-Speicher zu schreiben, sodass ich nach dem Neustart die zuletzt verwendeten Einstellungen verwenden könnte. Wie weise ich den richtigen Speicherplatz im Flash-Speicher zu, damit mein Code nicht beeinträchtigt wird? Wie speichere ich es?
Schreiben Sie Daten über die EEPROM-Emulation in den Flash-Speicher, wie hier im Anwendungshinweis AN3969: EEPROM-Emulation in STM32F40x/STM32F41x-Mikrocontrollern beschrieben .
Um einen Wert für den Neustart nach einem unerwarteten Herunterfahren zu speichern, wäre es viel besser, ein Byte batteriegepufferten RAM zu verwenden, als zu versuchen, in Flash zu schreiben.
Eine Aktualisierung von einem Byte im Flash muss den gesamten "Sektor" löschen und dann aktualisieren. Laut Datenblatt von ST beträgt die typische Zeit für das Löschen eines 16-kB-Sektors 250 ms für einen STM32F405/7 (5.3.12 "Speichereigenschaften", Tabelle 40 "Flash-Speicherprogrammierung"). Wenn die Stromversorgung unterbrochen wird, während der Flash aktualisiert wird, kann der gesamte Sektor beschädigt werden. Außerdem wird der gesamte Sektor gelöscht, sodass er nicht für Code verwendet werden kann. Es hängt vom genauen STM32-Teil ab, aber der kleinste Sektor könnte 16 kB groß sein, was für ein Byte ziemlich viel zu verlieren wäre.
Ein kleineres weiteres Problem bei Flash ist, dass es nur für 10k Lösch-/Schreibzyklen garantiert ist. Das mag für Ihre Anwendung ausreichen, aber ein Fehler im Programm könnte diese in ein oder zwei Stunden durchbrennen.
Andere zu beachtende Dinge: Während Flash geschrieben wird, wird die CPU daran gehindert, auf diesen Sektor zuzugreifen, sodass sie den magischen Wert nicht aktualisieren kann. Daher müssen Sie möglicherweise den Zugriff auf den Wert mit etwas Code schützen, um Flash zu überprüfen wird nicht geändert. Es könnte also komplexer sein, als Sie erwarten.
Die offensichtliche Alternative, ohne ein externes EEPROM hinzuzufügen, ist die Verwendung von batteriegepuffertem RAM. Dies ist etwas komplexer zu programmieren als die Verwendung einer In-Memory-Variablen, da sie Teil der RTC ist, die initialisiert werden muss. Sobald es jedoch eingerichtet ist, kann es mit nur wenigen zusätzlichen Anweisungen gelesen und geschrieben werden. Die Zugriffszeit beträgt also weniger als eine Mikrosekunde, schnell genug, um in einer Interrupt-Service-Routine verwendet zu werden, und sie nutzt sich nicht ab.
Das bedeutet, dass Sie an den VBat-Pin herankommen und ihn an eine kleine Batterie anschließen müssen, z. B. eine Hörgerätebatterie.
Eugen Sch.
Benutzer72833
gbulmer
Oldtimer
PauliusM
PauliusM
PauliusM
Oldtimer
Scott Seidmann