Ich versuche, den internen Flash eines STM32F405 zu verwenden, um eine Menge benutzerdefinierbarer Bytes zu speichern, die nach dem Neustart erhalten bleiben.
Ich benutze:
uint8_t userConfig[64] __attribute__((at(0x0800C000)));
um Speicher für die Daten zu reservieren, die ich speichern möchte.
Wenn das Programm startet, überprüfe ich, ob das erste Byte auf 0x42
gesetzt ist, wenn nicht, setze ich es mit:
HAL_FLASH_Unlock();
HAL_FLASH_Program(TYPEPROGRAM_BYTE, &userConfig[0], 0x42);
HAL_FLASH_Lock();
Danach überprüfe ich den Wert in userConfig[0]
und ich sehe 0x42
... Großartig!
Wenn ich jedoch auf "Reset" klicke und den Standort erneut betrachte, ist es nicht 0x42
mehr ...
Irgendeine Idee, wo ich falsch liege? Ich habe es auch versucht:
#pragma location = 0x0800C00
volatile const uint8_t userConfig[64]
aber ich bekomme das gleiche Ergebnis ..
Okay, ich habe eine Antwort auf die ST-Foren dank clive1
. Dieses Beispiel funktioniert für ein STM32F405xG.
Zuerst müssen wir das Speicherlayout in der Linker-Skriptdatei (.ld-Datei)
ändern Ändern Sie den vorhandenen FLASH und fügen Sie eine neue Zeile für DATA hinzu. Hier habe ich alle section 11
zugewiesen.
Handbuch zum Bearbeiten von Linker-Dateien auf der Sourceware-Website
In der gleichen Datei müssen wir hinzufügen:
%Vor% Dies erzeugt eine section
namens .user_data
, die wir im Programmcode adressieren können.
Fügen Sie abschließend in Ihrer .c-Datei Folgendes hinzu:
%Vor% Dies gibt an, dass wir die Variable userConfig
im Abschnitt .user_data
speichern und const
sicherstellen, dass die Adresse von userConfig
unverändert bleibt.
Um nun während der Laufzeit in diesen Flash-Bereich zu schreiben, können Sie den stm32f4 stdlib oder HAL Flash-Treiber verwenden.
Bevor Sie in den Flash schreiben können, muss er gelöscht werden (alle Bytes sind auf 0xFF gesetzt). Die Anweisungen für die HAL-Bibliothek sagen aus irgendeinem Grund nichts darüber aus ...
%Vor%Tags und Links microcontroller stm32 flash-memory stm32f4discovery