2015-02-13 51 views
8

Sto provando a utilizzare il flash interno di un STM32F405 per memorizzare un gruppo di byte impostabili dall'utente che rimangono dopo il riavvio.Allocazione della memoria in Flash per i dati utente (STM32F4 HAL)

sto usando:

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

allocare memoria per i dati che voglio per memorizzare.

All'avvio del programma, controllo per vedere se il primo byte è impostato su 0x42, se non, ho impostato utilizzando:

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

Dopo che controllo il valore nel userConfig[0] e vedo 0x42 ... fantastico!

Quando mi ha colpito azzerato però, e cerca nella posizione ancora una volta, non è più ... 0x42

Hai idea di dove sto andando male? Ho anche provato:

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

ma ottengo lo stesso risultato ..

risposta

14

Ok ho trovato una risposta su the ST forums grazie alla clive1. Questo esempio funziona per un STM32F405xG.

In primo luogo abbiamo bisogno di modificare il layout di memoria nel file di script del linker (file .LD)

Modificare il FLASH esistente e aggiungere una nuova linea per i dati. Qui ho assegnato tutto il 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

Nello stesso file, abbiamo bisogno di aggiungere:

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

Questo crea un section chiamato .user_data che possiamo affrontare nel codice del programma.

Infine, nel file .c aggiungere:

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

Questo specifica che vogliamo memorizzare la variabile userConfig nella sezione .user_data e const si assicura l'indirizzo del userConfig è mantenuta statica.

Ora, per scrivere in questa area di flash durante il runtime, è possibile utilizzare il driver flash stdlib std32f4 o HAL.

Prima di poter scrivere il flash, deve essere cancellata (tutti i byte impostati su 0xFF) Le istruzioni per la libreria HAL non parlare di fare questo per qualche motivo ...

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();