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))
@@ -164,7 +175,25 @@ void eeprom_buffered_write_byte(uint32_t pos, uint8_t value)
164175 */
165176void eeprom_buffer_fill (void )
166177{
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 */
167188 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 */
168197}
169198
170199#if defined(EEPROM_RETRAM_MODE )
@@ -188,6 +217,16 @@ void eeprom_buffer_flush(void)
188217 */
189218void eeprom_buffer_flush (void )
190219{
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 */
191230 FLASH_EraseInitTypeDef EraseInitStruct ;
192231 uint32_t offset = 0 ;
193232 uint32_t address = FLASH_BASE_ADDRESS ;
@@ -240,6 +279,8 @@ void eeprom_buffer_flush(void)
240279 uint32_t SectorError = 0 ;
241280#if defined(FLASH_TYPEPROGRAM_FLASHWORD )
242281 uint64_t data [4 ] = {0x0000 };
282+ #elif defined(FLASH_TYPEPROGRAM_QUADWORD )
283+ uint32_t data [4 ] = {0x0000 };
243284#else
244285 uint32_t data = 0 ;
245286#endif
@@ -249,7 +290,9 @@ void eeprom_buffer_flush(void)
249290#if defined(FLASH_BANK_NUMBER )
250291 EraseInitStruct .Banks = FLASH_BANK_NUMBER ;
251292#endif
293+ #if defined(FLASH_VOLTAGE_RANGE_3 )
252294 EraseInitStruct .VoltageRange = FLASH_VOLTAGE_RANGE_3 ;
295+ #endif
253296 EraseInitStruct .Sector = FLASH_DATA_SECTOR ;
254297 EraseInitStruct .NbSectors = 1 ;
255298
@@ -263,11 +306,20 @@ void eeprom_buffer_flush(void)
263306 if (HAL_FLASH_Program (FLASH_TYPEPROGRAM_FLASHWORD , address , (uint32_t )data ) == HAL_OK ) {
264307 address += 32 ;
265308 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)
267316 memcpy (& data , eeprom_buffer + offset , sizeof (uint32_t ));
268317 if (HAL_FLASH_Program (FLASH_TYPEPROGRAM_WORD , address , data ) == HAL_OK ) {
269318 address += 4 ;
270319 offset += 4 ;
320+ #else
321+ #error "Unknown FLASH Program Type."
322+ if (0 ) {}
271323#endif
272324 } else {
273325 address = address_end + 1 ;
@@ -276,6 +328,15 @@ void eeprom_buffer_flush(void)
276328 }
277329 HAL_FLASH_Lock ();
278330#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 */
279340}
280341
281342#endif /* defined(EEPROM_RETRAM_MODE) */
0 commit comments