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:
- Écrivez OPTKEY1 = 0x0819 2A3B dans le registre de touches d'option Flash (FLASH_OPTKEYR)
- É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
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]
.