40#if defined (STM32F030x6) || defined (STM32F031x6) || defined (STM32F038xx) \
41 || defined (STM32F030x8) || defined (STM32F030xC) || defined (STM32F042x6) \
42 || defined (STM32F048xx) || defined (STM32F051x8) || defined (STM32F058xx)
46#elif defined (STM32F070x6) || defined (STM32F070xB) || defined (STM32F071xB) \
47 || defined (STM32F072xB) || defined (STM32F078xx) \
48 || defined (STM32F091xC) || defined (STM32F098xx) \
49 || defined (STM32F303xC) || defined (STM32F303xE)
53#elif defined(STM32L432xx) || defined(STM32L431xx)
58#elif defined(STM32F767xx)
64#elif defined(STM32G0B1xx)
71#error "stm32EEPROMEmulation unsupported STM32 device"
85inline const uint32_t *Stm32EEPROMEmulation::get_block(
86 unsigned sector,
unsigned offset)
98 return get_block(sector, offset);
103extern const unsigned __stm32_eeprom_flash_sector_start;
116 FLASH_EraseInitTypeDef erase_init;
117 memset(&erase_init, 0,
sizeof(erase_init));
119 erase_init.TypeErase = TYPEERASE_SECTORS;
121 ((unsigned)(&__stm32_eeprom_flash_sector_start)) + sector;
122 erase_init.NbSectors = 1;
123 erase_init.VoltageRange = FLASH_VOLTAGE_RANGE_3;
125 portENTER_CRITICAL();
127 HASSERT(HAL_OK == HAL_FLASHEx_Erase(&erase_init, &page_error));
132 auto* address = get_block(sector, 0);
134 FLASH_EraseInitTypeDef erase_init;
135 erase_init.TypeErase = FLASH_TYPEERASE_PAGES;
137 erase_init.Banks = FLASH_BANK_1;
138 uint32_t start_page = erase_init.Page =
139 (((uint32_t)address) - FLASH_BASE) /
PAGE_SIZE;
141 erase_init.PageAddress = (uint32_t)address;
145 portENTER_CRITICAL();
152 erase_init.Page += 1;
156 erase_init.NbPages--;
157 HAL_FLASHEx_Erase(&erase_init, &page_error);
158 erase_init.NbPages = 1;
160 erase_init.Page = start_page;
162 erase_init.PageAddress = (uint32_t)address;
165 HAL_FLASHEx_Erase(&erase_init, &page_error);
180 unsigned relative_sector,
unsigned start_block, uint32_t *data, uint32_t count)
185 auto* address = get_block(relative_sector, start_block);
187 uintptr_t uint_address = (uintptr_t)address;
198 portENTER_CRITICAL();
200#if defined(F7_FLASH)|| defined(L4_FLASH)
201 HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, uint_address, *(uint64_t*)data);
203 HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, uint_address, *data);
const char __eeprom_start
Linker-defined symbol where in the memory space (flash) the eeprom emulation data starts.
Emulates EEPROM in FLASH for the Tiva, LPC17xx and LPC40xx platforms.
static const size_t BLOCK_SIZE
block size in bytes
const uint16_t rawBlockCount_
How many blocks are there in a sector.
static const size_t SECTOR_SIZE
Sector size in bytes.
void mount()
Mount the EEPROM file.
static const size_t BYTES_PER_BLOCK
useful data bytes size in bytes
const uint8_t sectorCount_
Total number of sectors available.
void flash_erase(unsigned sector) override
Simple hardware abstraction for FLASH erase API.
const uint32_t * block(unsigned sector, unsigned offset) override
Computes the pointer to load the data stored in a specific block from.
void flash_program(unsigned sector, unsigned start_block, uint32_t *data, uint32_t byte_count) override
Simple hardware abstraction for FLASH program API.
Stm32EEPROMEmulation()
Default constructor.
static const uintptr_t PAGE_SIZE
The erase page length for the particular MCU.
#define HASSERT(x)
Checks that the value of expression x is true, else terminates the current process.