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))
@@ -164,7 +175,25 @@ void eeprom_buffered_write_byte(uint32_t pos, uint8_t value)
164
175
*/
165
176
void eeprom_buffer_fill (void )
166
177
{
178
+ #if defined(ICACHE ) && defined (HAL_ICACHE_MODULE_ENABLED ) && !defined(HAL_ICACHE_MODULE_DISABLED )
179
+ bool icache_enabled = false;
180
+ if (HAL_ICACHE_IsEnabled () == 1 ) {
181
+ icache_enabled = true;
182
+ /* Disable instruction cache prior to internal cacheable memory update */
183
+ if (HAL_ICACHE_Disable () != HAL_OK ) {
184
+ Error_Handler ();
185
+ }
186
+ }
187
+ #endif /* ICACHE && HAL_ICACHE_MODULE_ENABLED && !HAL_ICACHE_MODULE_DISABLED */
167
188
memcpy (eeprom_buffer , (uint8_t * )(FLASH_BASE_ADDRESS ), E2END + 1 );
189
+ #if defined(ICACHE ) && defined (HAL_ICACHE_MODULE_ENABLED ) && !defined(HAL_ICACHE_MODULE_DISABLED )
190
+ if (icache_enabled ) {
191
+ /* Re-enable instruction cache */
192
+ if (HAL_ICACHE_Enable () != HAL_OK ) {
193
+ Error_Handler ();
194
+ }
195
+ }
196
+ #endif /* ICACHE && HAL_ICACHE_MODULE_ENABLED && !HAL_ICACHE_MODULE_DISABLED */
168
197
}
169
198
170
199
#if defined(EEPROM_RETRAM_MODE )
@@ -188,6 +217,16 @@ void eeprom_buffer_flush(void)
188
217
*/
189
218
void eeprom_buffer_flush (void )
190
219
{
220
+ #if defined(ICACHE ) && defined (HAL_ICACHE_MODULE_ENABLED ) && !defined(HAL_ICACHE_MODULE_DISABLED )
221
+ bool icache_enabled = false;
222
+ if (HAL_ICACHE_IsEnabled () == 1 ) {
223
+ icache_enabled = true;
224
+ /* Disable instruction cache prior to internal cacheable memory update */
225
+ if (HAL_ICACHE_Disable () != HAL_OK ) {
226
+ Error_Handler ();
227
+ }
228
+ }
229
+ #endif /* ICACHE && HAL_ICACHE_MODULE_ENABLED && !HAL_ICACHE_MODULE_DISABLED */
191
230
FLASH_EraseInitTypeDef EraseInitStruct ;
192
231
uint32_t offset = 0 ;
193
232
uint32_t address = FLASH_BASE_ADDRESS ;
@@ -240,6 +279,8 @@ void eeprom_buffer_flush(void)
240
279
uint32_t SectorError = 0 ;
241
280
#if defined(FLASH_TYPEPROGRAM_FLASHWORD )
242
281
uint64_t data [4 ] = {0x0000 };
282
+ #elif defined(FLASH_TYPEPROGRAM_QUADWORD )
283
+ uint32_t data [4 ] = {0x0000 };
243
284
#else
244
285
uint32_t data = 0 ;
245
286
#endif
@@ -249,7 +290,9 @@ void eeprom_buffer_flush(void)
249
290
#if defined(FLASH_BANK_NUMBER )
250
291
EraseInitStruct .Banks = FLASH_BANK_NUMBER ;
251
292
#endif
293
+ #if defined(FLASH_VOLTAGE_RANGE_3 )
252
294
EraseInitStruct .VoltageRange = FLASH_VOLTAGE_RANGE_3 ;
295
+ #endif
253
296
EraseInitStruct .Sector = FLASH_DATA_SECTOR ;
254
297
EraseInitStruct .NbSectors = 1 ;
255
298
@@ -263,11 +306,20 @@ void eeprom_buffer_flush(void)
263
306
if (HAL_FLASH_Program (FLASH_TYPEPROGRAM_FLASHWORD , address , (uint32_t )data ) == HAL_OK ) {
264
307
address += 32 ;
265
308
offset += 32 ;
266
- #else
309
+ #elif defined(FLASH_TYPEPROGRAM_QUADWORD)
310
+ /* 128 bits */
311
+ memcpy (& data , eeprom_buffer + offset , 4 * sizeof (uint32_t ));
312
+ if (HAL_FLASH_Program (FLASH_TYPEPROGRAM_QUADWORD , address , (uint32_t )data ) == HAL_OK ) {
313
+ address += 16 ;
314
+ offset += 16 ;
315
+ #elif defined(FLASH_TYPEPROGRAM_WORD)
267
316
memcpy (& data , eeprom_buffer + offset , sizeof (uint32_t ));
268
317
if (HAL_FLASH_Program (FLASH_TYPEPROGRAM_WORD , address , data ) == HAL_OK ) {
269
318
address += 4 ;
270
319
offset += 4 ;
320
+ #else
321
+ #error "Unknown FLASH Program Type."
322
+ if (0 ) {}
271
323
#endif
272
324
} else {
273
325
address = address_end + 1 ;
@@ -276,6 +328,15 @@ void eeprom_buffer_flush(void)
276
328
}
277
329
HAL_FLASH_Lock ();
278
330
#endif
331
+ #if defined(ICACHE ) && defined (HAL_ICACHE_MODULE_ENABLED ) && !defined(HAL_ICACHE_MODULE_DISABLED )
332
+ if (icache_enabled )
333
+ {
334
+ /* Re-enable instruction cache */
335
+ if (HAL_ICACHE_Enable () != HAL_OK ) {
336
+ Error_Handler ();
337
+ }
338
+ }
339
+ #endif /* ICACHE && HAL_ICACHE_MODULE_ENABLED && !HAL_ICACHE_MODULE_DISABLED */
279
340
}
280
341
281
342
#endif /* defined(EEPROM_RETRAM_MODE) */
0 commit comments