1919#include "stm32_eeprom.h"
2020#include "stm32yyxx_ll_utils.h"
2121#include <string.h>
22+ #include <stdbool.h>
2223
2324#ifdef __cplusplus
2425extern "C" {
@@ -37,15 +38,19 @@ extern "C" {
3738#endif /* !FLASH_BANK_NUMBER */
3839
3940/* Be able to change FLASH_DATA_SECTOR to use if relevant */
40- #if defined(FLASH_SECTOR_TOTAL )
41+ #if defined(FLASH_SECTOR_TOTAL ) || defined( FLASH_SECTOR_NB )
4142#if !defined(FLASH_DATA_SECTOR )
43+ #if defined(FLASH_SECTOR_TOTAL )
4244#define FLASH_DATA_SECTOR ((uint32_t)(FLASH_SECTOR_TOTAL - 1))
45+ #elif defined(FLASH_SECTOR_NB )
46+ #define FLASH_DATA_SECTOR ((uint32_t)(FLASH_SECTOR_NB - 1))
47+ #endif
4348#else
4449#ifndef FLASH_BASE_ADDRESS
4550#error "FLASH_BASE_ADDRESS have to be defined when FLASH_DATA_SECTOR is defined"
4651#endif
4752#endif /* !FLASH_DATA_SECTOR */
48- #endif /* FLASH_SECTOR_TOTAL */
53+ #endif /* FLASH_SECTOR_TOTAL || FLASH_SECTOR_NB */
4954
5055/* Be able to change FLASH_PAGE_NUMBER to use if relevant */
5156#if !defined(FLASH_PAGE_NUMBER ) && defined(FLASH_PAGE_SIZE )
@@ -62,6 +67,12 @@ extern "C" {
6267#define FLASH_END FLASH_BANK2_END
6368#elif defined (FLASH_BANK1_END ) && (FLASH_BANK_NUMBER == FLASH_BANK_1 )
6469#define FLASH_END FLASH_BANK1_END
70+ #elif defined(FLASH_DATA_SECTOR )
71+ #if defined(FLASH_BANK_2 ) && (FLASH_BANK_NUMBER == FLASH_BANK_2 )
72+ #define FLASH_END ((uint32_t)(FLASH_BASE + FLASH_BANK_SIZE + (FLASH_DATA_SECTOR * FLASH_SECTOR_SIZE) + FLASH_SECTOR_SIZE - 1))
73+ #else
74+ #define FLASH_END ((uint32_t)(FLASH_BASE + (FLASH_DATA_SECTOR * FLASH_SECTOR_SIZE) + FLASH_SECTOR_SIZE - 1))
75+ #endif /* FLASH_BANK_2 */
6576#elif defined(FLASH_BASE ) && defined(FLASH_PAGE_NUMBER ) && defined (FLASH_PAGE_SIZE )
6677/* If FLASH_PAGE_NUMBER is defined by user, this is not really end of the flash */
6778#define FLASH_END ((uint32_t)(FLASH_BASE + (((FLASH_PAGE_NUMBER +1) * FLASH_PAGE_SIZE))-1))
@@ -240,6 +251,8 @@ void eeprom_buffer_flush(void)
240251 uint32_t SectorError = 0 ;
241252#if defined(FLASH_TYPEPROGRAM_FLASHWORD )
242253 uint64_t data [4 ] = {0x0000 };
254+ #elif defined(FLASH_TYPEPROGRAM_QUADWORD )
255+ uint32_t data [4 ] = {0x0000 };
243256#else
244257 uint32_t data = 0 ;
245258#endif
@@ -249,10 +262,23 @@ void eeprom_buffer_flush(void)
249262#if defined(FLASH_BANK_NUMBER )
250263 EraseInitStruct .Banks = FLASH_BANK_NUMBER ;
251264#endif
265+ #if defined(FLASH_VOLTAGE_RANGE_3 )
252266 EraseInitStruct .VoltageRange = FLASH_VOLTAGE_RANGE_3 ;
267+ #endif
253268 EraseInitStruct .Sector = FLASH_DATA_SECTOR ;
254269 EraseInitStruct .NbSectors = 1 ;
255270
271+ #if defined(ICACHE ) && defined (HAL_ICACHE_MODULE_ENABLED ) && !defined(HAL_ICACHE_MODULE_DISABLED )
272+ bool icache_enabled = false;
273+ if (HAL_ICACHE_IsEnabled () == 1 ) {
274+ icache_enabled = true;
275+ /* Disable instruction cache prior to internal cacheable memory update */
276+ if (HAL_ICACHE_Disable () != HAL_OK ) {
277+ Error_Handler ();
278+ }
279+ }
280+ #endif /* ICACHE && HAL_ICACHE_MODULE_ENABLED && !HAL_ICACHE_MODULE_DISABLED */
281+
256282 HAL_FLASH_Unlock ();
257283
258284 if (HAL_FLASHEx_Erase (& EraseInitStruct , & SectorError ) == HAL_OK ) {
@@ -263,18 +289,35 @@ void eeprom_buffer_flush(void)
263289 if (HAL_FLASH_Program (FLASH_TYPEPROGRAM_FLASHWORD , address , (uint32_t )data ) == HAL_OK ) {
264290 address += 32 ;
265291 offset += 32 ;
266- #else
292+ #elif defined(FLASH_TYPEPROGRAM_QUADWORD)
293+ /* 128 bits */
294+ memcpy (& data , eeprom_buffer + offset , 4 * sizeof (uint32_t ));
295+ if (HAL_FLASH_Program (FLASH_TYPEPROGRAM_QUADWORD , address , (uint32_t )data ) == HAL_OK ) {
296+ address += 16 ;
297+ offset += 16 ;
298+ #elif defined(FLASH_TYPEPROGRAM_WORD)
267299 memcpy (& data , eeprom_buffer + offset , sizeof (uint32_t ));
268300 if (HAL_FLASH_Program (FLASH_TYPEPROGRAM_WORD , address , data ) == HAL_OK ) {
269301 address += 4 ;
270302 offset += 4 ;
303+ #else
304+ #error "Unknown FLASH Program Type."
305+ if (0 ) {}
271306#endif
272307 } else {
273308 address = address_end + 1 ;
274309 }
275310 }
276311 }
277312 HAL_FLASH_Lock ();
313+ #if defined(ICACHE ) && defined (HAL_ICACHE_MODULE_ENABLED ) && !defined(HAL_ICACHE_MODULE_DISABLED )
314+ if (icache_enabled ) {
315+ /* Re-enable instruction cache */
316+ if (HAL_ICACHE_Enable () != HAL_OK ) {
317+ Error_Handler ();
318+ }
319+ }
320+ #endif /* ICACHE && HAL_ICACHE_MODULE_ENABLED && !HAL_ICACHE_MODULE_DISABLED */
278321#endif
279322}
280323
0 commit comments