Skip to content

Commit

Permalink
library(eeproom): add STM32H5xx support
Browse files Browse the repository at this point in the history
Signed-off-by: Frederic Pillon <[email protected]>
  • Loading branch information
fpistm committed May 17, 2023
1 parent 26ee82f commit 5fd35fd
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 4 deletions.
50 changes: 47 additions & 3 deletions libraries/EEPROM/src/utility/stm32_eeprom.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include "stm32_eeprom.h"
#include "stm32yyxx_ll_utils.h"
#include <string.h>
#include <stdbool.h>

#ifdef __cplusplus
extern "C" {
Expand All @@ -37,15 +38,19 @@ extern "C" {
#endif /* !FLASH_BANK_NUMBER */

/* Be able to change FLASH_DATA_SECTOR to use if relevant */
#if defined(FLASH_SECTOR_TOTAL)
#if defined(FLASH_SECTOR_TOTAL) || defined(FLASH_SECTOR_NB)
#if !defined(FLASH_DATA_SECTOR)
#if defined(FLASH_SECTOR_TOTAL)
#define FLASH_DATA_SECTOR ((uint32_t)(FLASH_SECTOR_TOTAL - 1))
#elif defined(FLASH_SECTOR_NB)
#define FLASH_DATA_SECTOR ((uint32_t)(FLASH_SECTOR_NB - 1))
#endif
#else
#ifndef FLASH_BASE_ADDRESS
#error "FLASH_BASE_ADDRESS have to be defined when FLASH_DATA_SECTOR is defined"
#endif
#endif /* !FLASH_DATA_SECTOR */
#endif /* FLASH_SECTOR_TOTAL */
#endif /* FLASH_SECTOR_TOTAL || FLASH_SECTOR_NB */

/* Be able to change FLASH_PAGE_NUMBER to use if relevant */
#if !defined(FLASH_PAGE_NUMBER) && defined(FLASH_PAGE_SIZE)
Expand All @@ -62,6 +67,12 @@ extern "C" {
#define FLASH_END FLASH_BANK2_END
#elif defined (FLASH_BANK1_END) && (FLASH_BANK_NUMBER == FLASH_BANK_1)
#define FLASH_END FLASH_BANK1_END
#elif defined(FLASH_DATA_SECTOR)
#if defined(FLASH_BANK_2) && (FLASH_BANK_NUMBER == FLASH_BANK_2)
#define FLASH_END ((uint32_t)(FLASH_BASE + (FLASH_SECTOR_NB * FLASH_SECTOR_SIZE) + (FLASH_DATA_SECTOR * FLASH_SECTOR_SIZE) + FLASH_SECTOR_SIZE - 1))
#else
#define FLASH_END ((uint32_t)(FLASH_BASE + (FLASH_DATA_SECTOR * FLASH_SECTOR_SIZE) + FLASH_SECTOR_SIZE - 1))
#endif /* FLASH_BANK_2 */
#elif defined(FLASH_BASE) && defined(FLASH_PAGE_NUMBER) && defined (FLASH_PAGE_SIZE)
/* If FLASH_PAGE_NUMBER is defined by user, this is not really end of the flash */
#define FLASH_END ((uint32_t)(FLASH_BASE + (((FLASH_PAGE_NUMBER +1) * FLASH_PAGE_SIZE))-1))
Expand Down Expand Up @@ -240,6 +251,8 @@ void eeprom_buffer_flush(void)
uint32_t SectorError = 0;
#if defined(FLASH_TYPEPROGRAM_FLASHWORD)
uint64_t data[4] = {0x0000};
#elif defined(FLASH_TYPEPROGRAM_QUADWORD)
uint32_t data[4] = {0x0000};
#else
uint32_t data = 0;
#endif
Expand All @@ -249,10 +262,23 @@ void eeprom_buffer_flush(void)
#if defined(FLASH_BANK_NUMBER)
EraseInitStruct.Banks = FLASH_BANK_NUMBER;
#endif
#if defined(FLASH_VOLTAGE_RANGE_3)
EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
#endif
EraseInitStruct.Sector = FLASH_DATA_SECTOR;
EraseInitStruct.NbSectors = 1;

#if defined(ICACHE) && defined (HAL_ICACHE_MODULE_ENABLED) && !defined(HAL_ICACHE_MODULE_DISABLED)
bool icache_enabled = false;
if (HAL_ICACHE_IsEnabled() == 1) {
icache_enabled = true;
/* Disable instruction cache prior to internal cacheable memory update */
if (HAL_ICACHE_Disable() != HAL_OK) {
Error_Handler();
}
}
#endif /* ICACHE && HAL_ICACHE_MODULE_ENABLED && !HAL_ICACHE_MODULE_DISABLED */

HAL_FLASH_Unlock();

if (HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) == HAL_OK) {
Expand All @@ -263,18 +289,36 @@ void eeprom_buffer_flush(void)
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, address, (uint32_t)data) == HAL_OK) {
address += 32;
offset += 32;
#else
#elif defined(FLASH_TYPEPROGRAM_QUADWORD)
/* 128 bits */
memcpy(&data, eeprom_buffer + offset, 4 * sizeof(uint32_t));
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_QUADWORD, address, (uint32_t)data) == HAL_OK) {
address += 16;
offset += 16;
#elif defined(FLASH_TYPEPROGRAM_WORD)
memcpy(&data, eeprom_buffer + offset, sizeof(uint32_t));
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data) == HAL_OK) {
address += 4;
offset += 4;
#else
#error "Unknown FLASH Program Type."
if (0) {}
#endif
} else {
address = address_end + 1;
}
}
}
HAL_FLASH_Lock();
#if defined(ICACHE) && defined (HAL_ICACHE_MODULE_ENABLED) && !defined(HAL_ICACHE_MODULE_DISABLED)
if (icache_enabled)
{
/* Re-enable instruction cache */
if (HAL_ICACHE_Enable() != HAL_OK) {
Error_Handler();
}
}
#endif /* ICACHE && HAL_ICACHE_MODULE_ENABLED && !HAL_ICACHE_MODULE_DISABLED */
#endif
}

Expand Down
2 changes: 1 addition & 1 deletion libraries/EEPROM/src/utility/stm32_eeprom.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ extern "C" {
* emulation. Anyway, all the sector size will be erased.
* So pay attention to not use this sector for other stuff.
*/
#define FLASH_PAGE_SIZE ((uint32_t)(16*1024)) /* 16kB page */
#define FLASH_PAGE_SIZE ((uint32_t)(8*1024)) /* 8kB page */
#endif

#if defined(DATA_EEPROM_BASE) || defined(FLASH_EEPROM_BASE)
Expand Down

0 comments on commit 5fd35fd

Please sign in to comment.