Skip to content

Commit 5fd35fd

Browse files
committed
library(eeproom): add STM32H5xx support
Signed-off-by: Frederic Pillon <frederic.pillon@st.com>
1 parent 26ee82f commit 5fd35fd

File tree

2 files changed

+48
-4
lines changed

2 files changed

+48
-4
lines changed

libraries/EEPROM/src/utility/stm32_eeprom.c

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "stm32_eeprom.h"
2020
#include "stm32yyxx_ll_utils.h"
2121
#include <string.h>
22+
#include <stdbool.h>
2223

2324
#ifdef __cplusplus
2425
extern "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_SECTOR_NB * FLASH_SECTOR_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,36 @@ 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+
{
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 */
278322
#endif
279323
}
280324

libraries/EEPROM/src/utility/stm32_eeprom.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ extern "C" {
8484
* emulation. Anyway, all the sector size will be erased.
8585
* So pay attention to not use this sector for other stuff.
8686
*/
87-
#define FLASH_PAGE_SIZE ((uint32_t)(16*1024)) /* 16kB page */
87+
#define FLASH_PAGE_SIZE ((uint32_t)(8*1024)) /* 8kB page */
8888
#endif
8989

9090
#if defined(DATA_EEPROM_BASE) || defined(FLASH_EEPROM_BASE)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy