Postup: 1. zjistím si jak velkou má moje MCU flash (v názvu MCU kódováno druhým znakem za číslem), u STM32G071RB je to "B" 2. v reference manuálu se rozhodnu kterou část flashe si "zarezervuji" pro účely "EEPROM" - výhodné poslední sektory 3. V linkerskriptu (.ld, konkrétně STM32G071RBTX_FLASH.ld) zmenším v sekci MEMORY velikost FLASHe, zde ze 128kB na 126kB. A přidám svou sekci, jejíž počátek identifikuji z reference manuálu (Table 9. Flash memory organization) FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 126K EEPROM (rx) : ORIGIN = 0x0801F800, LENGTH = 2K 4. v linkerskriptu v části SECTIONS přidám informace o tomto bloku /* Michalova sekce EEPROM */ .eeprom (NOLOAD) : { . = ALIGN(4); KEEP (*(.eeprom)) . = ALIGN(4); } >EEPROM 5. v mainu si deklaruji proměnnou s atributem .eeprom čímž sděluji linkeru že ji má umístit do této sekce uint32_t __attribute__((__section__(".eeprom"))) x; 6. Všechny tyto úpravy v linkerskriptu dělat nemusím, ale pak se vystavuji (nejspíš malému) riziku že do sekce kterou mažu něco umístí a já to pak zlikviduju. Krom toho pak budu muset přistupovat do flash ke svým datům jen skrze adresy. Teoreticky pokud odstraním parametr NOLOAD měly by se při zápisu programu zapsat do proměnných i počáteční hodnoty, přiřazené při deklaraci, což může a nemusí být výhodné. Funkce pro práci s flashí se pro různé rodiny MCU liší. Sledovat obsah flash pamětí lze pomocí "memory manager" nebo teba pomocí "expressions". // demo funkce pro STM32G0 // zápis 64bit hodnoty do flash na zvolenou adresu - funkce maže celou page (!) // pro praktické použití (zápis více hodnot) je nutné funkci upravit void flash_write(uint32_t adresa, uint64_t value){ FLASH_EraseInitTypeDef erase; // struktura s parametry mazání HAL_StatusTypeDef stat; // návratovhá hodnota HAL funkcí (OK/Error) uint32_t pageerror; // jen pomocná promenná, kam se může zapsat informace o chybě při mazání erase.Banks = FLASH_BANK_1; // mažeme banku 1 (jinou ani nemáme) erase.TypeErase = FLASH_TYPEERASE_PAGES; // mazat chceme jednotlivé page erase.NbPages = 1; // smažeme jednu page erase.Page = 63; // idendifikace konkrétní page - zvolili jsme "poslendí" (63) stat=HAL_FLASH_Unlock(); // odemčít manipulaci s flashí stat=HAL_FLASHEx_Erase(&erase,&pageerror); // smazat page stat=HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD,adresa,value); // zapsat 64bit hodnotu na zvolenou adresu stat=HAL_FLASH_Lock(); // zamčít zápis flash (nemusí být potřeba) }