STM32F4 Flash-Speicherprogrammierung

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?

Sie haben ein Linker-Skript, das genau definiert, welchen Platz Ihr Programm einnimmt. Sie können einige Symbole daraus exportieren und in Ihrem Programm verwenden.
Kannst du dafür nicht EEPROM verwenden? Es ist viel einfacher, dauerhaften Speicher in diesem Bereich zu organisieren, wenn Sie von Flash aus arbeiten.
STM32F4 hat ein paar Bytes batteriegepufferten RAM. Können Sie eine kleine Batterie hinzufügen und diese stattdessen verwenden?
Als Programmierer entscheiden Sie, wie viel wovon verwendet wird. Wenn Sie diesen Wert löschen müssen, möchten Sie ihn allein in einem Löschblock mit nichts anderem oder mit anderen Werten, die Sie löschen und neu schreiben möchten. Wenn Sie ihn nur einmal schreiben müssen, lassen Sie dann irgendwo einige 0xFFFF-Bytes ändere sie.
@ Tibo STM32F4 hat kein EEPROM, es hat nur FLASH-Speicher.
@gbulmer Ich muss eine Variable speichern, die ich verwenden kann, falls es zu unerwarteten Abschaltungen kommt. Batterie ist in meinem Fall nicht die Option.
@dwelch Ich habe eine Variable und muss sie im Falle eines unerwarteten Herunterfahrens speichern - um sie nach einem Neustart zu verwenden.
Sie können einen Block löschen, dann nach Bedarf schreiben, beim Booten den Block untersuchen, den letzten nicht 0xFF ... FF-Wert nehmen, sobald Sie ihn voll sehen, dann einen weiteren Löschvorgang durchführen. Sie müssen nicht jedes Ausschalten (oder Booten) löschen. spart Verschleiß.
Sehen Sie sich dieses Dokument zur EEPROM-Emulation im RAM für STM32F4 an www2.st.com/content/ccc/resource/technical/document/…

Antworten (2)

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.

Oder man verwendet Eeprom-Emulation auf Flash. Grundsätzlich schreibt das Schema kontinuierlich Blöcke von <addr><data> in die Flash-Seite, bis das Ende erreicht ist. Das Laden liest nur alle Paare und holt die Daten in einen RAM-Puffer. Wenn die Seite voll ist, wird gelöscht. Auf diese Weise wird Flash sehr selten gelöscht.