2015-02-13 25 views
8

Próbuję użyć wewnętrznej lampy błyskowej STM32F405, aby zachować kilka bajtów ustawialnych dla użytkownika, które pozostaną po ponownym uruchomieniu.Przydzielanie pamięci we Flashu dla danych użytkownika (STM32F4 HAL)

Używam:

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

przydzielić pamięci dla danych chcę, aby przechowywać.

Po uruchomieniu programu, to należy sprawdzić, czy pierwszy bajt jest ustawiony na 0x42, czy nie, i ustawić go przy użyciu:

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

Potem sprawdź wartość w userConfig[0] i widzę 0x42 ... Świetnie!

Kiedy uderzę zresetować jednak i spojrzeć na miejscu ponownie, to nie jest już 0x42 ...

Każdy pomysł gdzie jadę nie tak? Próbowałem również:

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

ale uzyskać ten sam rezultat ..

Odpowiedz

14

Ok znalazłem odpowiedź na the ST forums dzięki clive1. Ten przykład działa dla STM32F405xG.

Najpierw musimy zmodyfikować układ pamięci w pliku skryptu linkera (.ld plik)

modyfikować istniejące Flash i dodać nową linię DATA. Tutaj mam przydzielone wszystkie section 11.

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

Manual for editing linker files on the sourceware website

w tym samym pliku, musimy dodać:

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

Stwarza to section nazywa .user_data że możemy zająć w kodzie programu.

Wreszcie w pliku .c dodać:

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

ten określa, że ​​chcemy zapisać zmienną userConfig w sekcji .user_data i const pilnuje adres userConfig utrzymywana jest statyczne.

Teraz, aby napisać do tego obszaru flash podczas pracy, można użyć sterownika flash stm32f4 stdlib lub HAL.

Zanim będzie można zapisać do pamięci flash, to musi być wymazane (wszystkie bajty ustawione na 0xFF) Instrukcje biblioteki HAL nic nie mówią o tym od jakiegoś powodu ...

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(); 
Powiązane problemy