2017-06-08 6 views
1

Je veux écrire une variable, par exemple un nombre entier avec le numéro 5 à la FLASH, puis après la mise en va et l'appareil est allumé le relire.Comment écrire/lire à Flash sur STM32F4, Cortex M4

Je sais déjà que pour écrire quelque chose que je dois d'abord effacer la page et écrire.

Dans le manuel, il dit:

  1. Ecrire OPTKEY1 = 0x0819 2A3B dans l'option flash registre clé (FLASH_OPTKEYR)
  2. Ecrire OPTKEY2 = 0x4C5D 6E7F dans l'option flash registre clé (FLASH_OPTKEYR)

Comment puis-je effectuer thi s tâches?

Le secteur 0 a une adresse de bloc de 0x0800 0000 à 0x0800 3FFF, c'est où je veux écrire.

Voici le lien vers le manuel, la page 71: STM32 Manual

+0

Il dépend fortement du matériel. Certains types de mémoire flash n'autorisent aucune opération non bloquante. – 0andriy

+0

@ 4386427 C'est incorrect. 'OPTKEY1' et' OPTKEY2' sont des valeurs, pas des adresses. Les ajouter à l'adresse FLASH_OPTKEYR entraînera un plantage ou un comportement inattendu. – duskwuff

+0

@duskwuff - Je vois. Je l'ai lu comme si OPTKEY1 et OPTKEY2 étaient deux registres dans un groupe de registres appelé FLASH_OPTKEYR. Commentaire supprimé. Merci. – 4386427

Répondre

1

Vous pouvez utiliser le code suivant pour les données d'écriture à la bibliothèque flash avec HAL.

void Write_Flash(uint8_t data) 
{ 
    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_6, VOLTAGE_RANGE_3); 
    HAL_FLASH_Program(TYPEPROGRAM_WORD, FlashAddress, data); 
    HAL_FLASH_Lock(); 
} 

Vous devez mettre à jour le script de l'éditeur de liens comme suit. Ajouter à DATAMEMORY et ajouter .user_data dans SECTIONS.

MEMORY 
{ 
RAM (xrw)  : ORIGIN = 0x20000000, LENGTH = 320K 
CCMRAM (rw)  : ORIGIN = 0x10000000, LENGTH = 64K 
FLASH (rx)  : ORIGIN = 0x8000000, LENGTH = 2048K 
DATA (rwx)  : ORIGIN = 0x08040000, LENGTH = 128k 
} 

/* Define output sections */ 
SECTIONS 
{ 
.user_data : 
    { 
    . = ALIGN(4); 
    KEEP(*(.user_data)) 
    . = ALIGN(4); 
    } > DATA 

Vous devez ajouter attribut suivant le code principal pour la lecture des données après la mise sous tension

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

Après tout cela, vous pouvez lire vos données flash avec l'appel userConfig[0].

+0

merci, et comment pourrais-je lire les valeurs dans le flash? Parce que je dois d'abord les lire, effacer le flash et enfin écrire les anciens plus les nouveaux. Droite? –

+0

vous pouvez lire la première variable 8bit en appelant 'userConfig [0]' et en suivant 8bit à 'userConfig [1]'. –