Skip to content

Commit 5b37acd

Browse files
committed
library(eeproom): add STM32H5xx support
Signed-off-by: Frederic Pillon <[email protected]>
1 parent 26ee82f commit 5b37acd

File tree

2 files changed

+48
-4
lines changed

2 files changed

+48
-4
lines changed

libraries/EEPROM/src/utility/stm32_eeprom.c

+47-3
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_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,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

+1-1
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)