Skip to content

Commit 249208f

Browse files
committed
library(eeproom): add STM32H5xx support
Signed-off-by: Frederic Pillon <[email protected]>
1 parent 74fd5b5 commit 249208f

File tree

2 files changed

+49
-4
lines changed

2 files changed

+49
-4
lines changed

libraries/EEPROM/src/utility/stm32_eeprom.c

Lines changed: 48 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,13 @@ 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+
/* FLASH_BANK_SIZE is not used as it requires access to FLASH registers so replaced by (FLASH_SECTOR_NB * FLASH_SECTOR_SIZE) */
73+
#define FLASH_END ((uint32_t)(FLASH_BASE + (FLASH_SECTOR_NB * FLASH_SECTOR_SIZE) + (FLASH_DATA_SECTOR * FLASH_SECTOR_SIZE) + FLASH_SECTOR_SIZE - 1))
74+
#else
75+
#define FLASH_END ((uint32_t)(FLASH_BASE + (FLASH_DATA_SECTOR * FLASH_SECTOR_SIZE) + FLASH_SECTOR_SIZE - 1))
76+
#endif /* FLASH_BANK_2 */
6577
#elif defined(FLASH_BASE) && defined(FLASH_PAGE_NUMBER) && defined (FLASH_PAGE_SIZE)
6678
/* If FLASH_PAGE_NUMBER is defined by user, this is not really end of the flash */
6779
#define FLASH_END ((uint32_t)(FLASH_BASE + (((FLASH_PAGE_NUMBER +1) * FLASH_PAGE_SIZE))-1))
@@ -240,6 +252,8 @@ void eeprom_buffer_flush(void)
240252
uint32_t SectorError = 0;
241253
#if defined(FLASH_TYPEPROGRAM_FLASHWORD)
242254
uint64_t data[4] = {0x0000};
255+
#elif defined(FLASH_TYPEPROGRAM_QUADWORD)
256+
uint32_t data[4] = {0x0000};
243257
#else
244258
uint32_t data = 0;
245259
#endif
@@ -249,10 +263,23 @@ void eeprom_buffer_flush(void)
249263
#if defined(FLASH_BANK_NUMBER)
250264
EraseInitStruct.Banks = FLASH_BANK_NUMBER;
251265
#endif
266+
#if defined(FLASH_VOLTAGE_RANGE_3)
252267
EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
268+
#endif
253269
EraseInitStruct.Sector = FLASH_DATA_SECTOR;
254270
EraseInitStruct.NbSectors = 1;
255271

272+
#if defined(ICACHE) && defined (HAL_ICACHE_MODULE_ENABLED) && !defined(HAL_ICACHE_MODULE_DISABLED)
273+
bool icache_enabled = false;
274+
if (HAL_ICACHE_IsEnabled() == 1) {
275+
icache_enabled = true;
276+
/* Disable instruction cache prior to internal cacheable memory update */
277+
if (HAL_ICACHE_Disable() != HAL_OK) {
278+
Error_Handler();
279+
}
280+
}
281+
#endif /* ICACHE && HAL_ICACHE_MODULE_ENABLED && !HAL_ICACHE_MODULE_DISABLED */
282+
256283
HAL_FLASH_Unlock();
257284

258285
if (HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) == HAL_OK) {
@@ -263,18 +290,36 @@ void eeprom_buffer_flush(void)
263290
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, address, (uint32_t)data) == HAL_OK) {
264291
address += 32;
265292
offset += 32;
266-
#else
293+
#elif defined(FLASH_TYPEPROGRAM_QUADWORD)
294+
/* 128 bits */
295+
memcpy(&data, eeprom_buffer + offset, 4 * sizeof(uint32_t));
296+
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_QUADWORD, address, (uint32_t)data) == HAL_OK) {
297+
address += 16;
298+
offset += 16;
299+
#elif defined(FLASH_TYPEPROGRAM_WORD)
267300
memcpy(&data, eeprom_buffer + offset, sizeof(uint32_t));
268301
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data) == HAL_OK) {
269302
address += 4;
270303
offset += 4;
304+
#else
305+
#error "Unknown FLASH Program Type."
306+
if (0) {}
271307
#endif
272308
} else {
273309
address = address_end + 1;
274310
}
275311
}
276312
}
277313
HAL_FLASH_Lock();
314+
#if defined(ICACHE) && defined (HAL_ICACHE_MODULE_ENABLED) && !defined(HAL_ICACHE_MODULE_DISABLED)
315+
if (icache_enabled)
316+
{
317+
/* Re-enable instruction cache */
318+
if (HAL_ICACHE_Enable() != HAL_OK) {
319+
Error_Handler();
320+
}
321+
}
322+
#endif /* ICACHE && HAL_ICACHE_MODULE_ENABLED && !HAL_ICACHE_MODULE_DISABLED */
278323
#endif
279324
}
280325

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)