Hallo, ich möchte auf ein EEPROM verzichten und im Flash direkt retain Variablen speichern. Ich benutze einen STM32F413VGT6. Ich habe mir dazu folgende Funktionen geschrieben. Würden diese funktionieren? Habe ich es richtig verstanden, dass ich immer einen ganzen 128kb Sector löschen muss? Es gibt keine kleineren Pages? Das finde ich schade. Dann müsste ich ja ganze 128kB zwischenspeichern, auch wenn nur ein Byte verändert werden soll. Lesen werde ich wohl mir einem normalen Pointer, der auf die entsprechende Flash-Adresse gerichtet ist oder?
1 | uint8_t *p = 0x08040000; //z.B. lesen |
2 | |
3 | void Flash_Unlock(){ |
4 | FLASH->KEYR = 0x45670123; |
5 | FLASH->KEYR = 0xCDEF89AB; |
6 | }
|
7 | |
8 | void Flash_Lock(){ |
9 | FLASH->CR |= FLASH_CR_LOCK; |
10 | }
|
11 | |
12 | void Flash_Erase(uint8_t ucSector){ |
13 | while(FLASH->SR & FLASH_SR_BSY); |
14 | FLASH->CR |= FLASH_CR_SER; |
15 | FLASH->CR |= (ucSector << 3); |
16 | FLASH->CR |= FLASH_CR_STRT; |
17 | while(FLASH->SR & FLASH_SR_BSY); |
18 | }
|
19 | |
20 | void Flash_Write(uint8_t * pucSrc, uint8_t * pucDest, uint16_t usSize){ |
21 | while(FLASH->SR & FLASH_SR_BSY); |
22 | FLASH->CR |= FLASH_CR_PG; |
23 | while(usSize-- > 0){ |
24 | *pucDest++ = *pucSrc++; |
25 | }
|
26 | while(FLASH->SR & FLASH_SR_BSY); |
27 | }
|