2015-02-13 6 views
8

Ich versuche, den internen Flash eines STM32F405 zu verwenden, um eine Reihe von benutzerdefinierbaren Bytes zu speichern, die nach dem Neustart verbleiben.Speicher in Flash für Benutzerdaten zuweisen (STM32F4 HAL)

Ich verwende:

uint8_t userConfig[64] __attribute__((at(0x0800C000)));

Speicher für die Daten, die ich speichern möchten zuzuteilen.

Wenn das Programm startet, überprüfe ich, ob das erste Byte auf 0x42 wird eingestellt, um zu sehen, wenn nicht, habe ich es mit:

HAL_FLASH_Unlock(); HAL_FLASH_Program(TYPEPROGRAM_BYTE, &userConfig[0], 0x42); HAL_FLASH_Lock();

Danach prüfe ich den Wert in userConfig[0] und ich sehe, 0x42 ... Großartig!

Wenn ich jedoch schlagen zurückgesetzt und wieder an der Stelle sucht, ist es nicht mehr 0x42 ...

Jede Idee, wo ich falsch gehe? Ich habe auch versucht:

#pragma location = 0x0800C00 volatile const uint8_t userConfig[64]

aber ich habe das gleiche Ergebnis ..

Antwort

14

Gut fand ich eine Antwort auf the ST forums dank clive1. Dieses Beispiel funktioniert für ein STM32F405xG.

Zuerst müssen wir das Speicherlayout in der Linker-Skript-Datei (.LD Datei)

Ändern Sie die vorhandenen FLASH und fügen Sie eine neue Zeile für Daten ändern. Hier habe ich alle section 11 zugewiesen.

MEMORY 
{ 
    FLASH (RX)  : ORIGIN = 0x08000000, LENGTH = 1M-128K 
    DATA (RWX)  : ORIGIN = 0x080E0000, LENGTH = 128k 
    ... 
    ... 
} 

Manual for editing linker files on the sourceware website

In der gleichen Datei, müssen wir hinzufügen:

.user_data : 
{ 
    . = ALIGN(4); 
    *(.user_data) 
    . = ALIGN(4); 
} > DATA 

Dies schafft eine section genannt .user_data, die wir im Programmcode ansprechen kann.

schließlich in Ihrer C-Datei hinzufügen:

__attribute__((__section__(".user_data"))) const uint8_t userConfig[64] 

Dies gibt an, dass wir die userConfig Variable im .user_data Abschnitt und const stellt sicher, dass die Adresse des userConfig gehalten statisch gespeichert werden soll.

Jetzt, um in diesem Bereich des Flash während der Laufzeit zu schreiben, können Sie den stm32f4 Stdlib oder HAL Flash-Treiber verwenden.

Bevor Sie in die Flash schreiben können, hat es (alle Bytes auf 0xFF) Die Anweisungen für die HAL-Bibliothek sagt nichts über das tut dies aus irgendeinem Grunde gelöscht werden ...

HAL_FLASH_Unlock(); 

__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR); 

FLASH_Erase_Sector(FLASH_SECTOR_11, VOLTAGE_RANGE_3); 

HAL_FLASH_Program(TYPEPROGRAM_WORD, &userConfig[index], someData); 

HAL_FLASH_Lock();