19
19
#include "stm32_eeprom.h"
20
20
#include "stm32yyxx_ll_utils.h"
21
21
#include <string.h>
22
+ #include <stdbool.h>
22
23
23
24
#ifdef __cplusplus
24
25
extern "C" {
@@ -37,15 +38,19 @@ extern "C" {
37
38
#endif /* !FLASH_BANK_NUMBER */
38
39
39
40
/* 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 )
41
42
#if !defined(FLASH_DATA_SECTOR )
43
+ #if defined(FLASH_SECTOR_TOTAL )
42
44
#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
43
48
#else
44
49
#ifndef FLASH_BASE_ADDRESS
45
50
#error "FLASH_BASE_ADDRESS have to be defined when FLASH_DATA_SECTOR is defined"
46
51
#endif
47
52
#endif /* !FLASH_DATA_SECTOR */
48
- #endif /* FLASH_SECTOR_TOTAL */
53
+ #endif /* FLASH_SECTOR_TOTAL || FLASH_SECTOR_NB */
49
54
50
55
/* Be able to change FLASH_PAGE_NUMBER to use if relevant */
51
56
#if !defined(FLASH_PAGE_NUMBER ) && defined(FLASH_PAGE_SIZE )
@@ -62,6 +67,12 @@ extern "C" {
62
67
#define FLASH_END FLASH_BANK2_END
63
68
#elif defined (FLASH_BANK1_END ) && (FLASH_BANK_NUMBER == FLASH_BANK_1 )
64
69
#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 */
65
76
#elif defined(FLASH_BASE ) && defined(FLASH_PAGE_NUMBER ) && defined (FLASH_PAGE_SIZE )
66
77
/* If FLASH_PAGE_NUMBER is defined by user, this is not really end of the flash */
67
78
#define FLASH_END ((uint32_t)(FLASH_BASE + (((FLASH_PAGE_NUMBER +1) * FLASH_PAGE_SIZE))-1))
@@ -240,6 +251,8 @@ void eeprom_buffer_flush(void)
240
251
uint32_t SectorError = 0 ;
241
252
#if defined(FLASH_TYPEPROGRAM_FLASHWORD )
242
253
uint64_t data [4 ] = {0x0000 };
254
+ #elif defined(FLASH_TYPEPROGRAM_QUADWORD )
255
+ uint32_t data [4 ] = {0x0000 };
243
256
#else
244
257
uint32_t data = 0 ;
245
258
#endif
@@ -249,10 +262,23 @@ void eeprom_buffer_flush(void)
249
262
#if defined(FLASH_BANK_NUMBER )
250
263
EraseInitStruct .Banks = FLASH_BANK_NUMBER ;
251
264
#endif
265
+ #if defined(FLASH_VOLTAGE_RANGE_3 )
252
266
EraseInitStruct .VoltageRange = FLASH_VOLTAGE_RANGE_3 ;
267
+ #endif
253
268
EraseInitStruct .Sector = FLASH_DATA_SECTOR ;
254
269
EraseInitStruct .NbSectors = 1 ;
255
270
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
+
256
282
HAL_FLASH_Unlock ();
257
283
258
284
if (HAL_FLASHEx_Erase (& EraseInitStruct , & SectorError ) == HAL_OK ) {
@@ -263,18 +289,36 @@ void eeprom_buffer_flush(void)
263
289
if (HAL_FLASH_Program (FLASH_TYPEPROGRAM_FLASHWORD , address , (uint32_t )data ) == HAL_OK ) {
264
290
address += 32 ;
265
291
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)
267
299
memcpy (& data , eeprom_buffer + offset , sizeof (uint32_t ));
268
300
if (HAL_FLASH_Program (FLASH_TYPEPROGRAM_WORD , address , data ) == HAL_OK ) {
269
301
address += 4 ;
270
302
offset += 4 ;
303
+ #else
304
+ #error "Unknown FLASH Program Type."
305
+ if (0 ) {}
271
306
#endif
272
307
} else {
273
308
address = address_end + 1 ;
274
309
}
275
310
}
276
311
}
277
312
HAL_FLASH_Lock ();
313
+ #if defined(ICACHE ) && defined (HAL_ICACHE_MODULE_ENABLED ) && !defined(HAL_ICACHE_MODULE_DISABLED )
314
+ if (icache_enabled )
315
+ {
316
+ /* Re-enable instruction cache */
317
+ if (HAL_ICACHE_Enable () != HAL_OK ) {
318
+ Error_Handler ();
319
+ }
320
+ }
321
+ #endif /* ICACHE && HAL_ICACHE_MODULE_ENABLED && !HAL_ICACHE_MODULE_DISABLED */
278
322
#endif
279
323
}
280
324
0 commit comments