web-dev-qa-db-fra.com

Comment écrire / lire sur FLASH sur STM32F4, Cortex M4

Je veux écrire une variable, par exemple un entier avec le numéro 5 dans le FLASH, puis une fois que l'alimentation est coupée et que l'appareil est rallumé, lisez-le.

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

Dans le manuel, il est écrit:

  1. Écrivez OPTKEY1 = 0x0819 2A3B dans le registre de touches d'option Flash (FLASH_OPTKEYR)
  2. Écrivez OPTKEY2 = 0x4C5D 6E7F dans le registre de touches d'option Flash (FLASH_OPTKEYR)

Comment effectuer ces tâches?

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

Voici le lien vers le manuel, page 71: Manuel STM32

8
Alex M.

Vous pouvez utiliser le code suivant pour écrire des données à flasher avec la bibliothèque 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. Ajoutez DATA dans MEMORY et ajoutez .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 l'attribut suivant sur le code principal pour lire les 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 en appelant userConfig[0].

9
Gürtaç Kadem