18#ifdef USE_EEPROM_EMULATION
35 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
36 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR);
37 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR);
38 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR);
39 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGPERR);
40 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR);
55 if(readRes == 1 || (readRes == 0 && buf != dat) ){
57 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
58 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR);
59 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR);
60 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR);
61 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGPERR);
62 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR);
93 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
94 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR);
95 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR);
96 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR);
97 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGPERR);
98 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR);
106#elif defined(I2C_PORT_EEPROM)
113 uint16_t dataLength =
sizeof(dat);
115 adr *=
sizeof(dat)/I2C_EEPROM_DATA_SIZE;
117 uint16_t curAdr =
adr;
118 assert(
adr < I2C_EEPROM_SIZE);
122 while(curAdr <
adr+dataLength){
123 while(!HAL_I2C_IsDeviceReady(&I2C_PORT_EEPROM, I2C_EEPROM_ADR, 100, I2C_EEPROM_TIMEOUT) == HAL_OK){
127 uint16_t wLen = std::min<uint16_t>(dataLength,I2C_EEPROM_PAGEWRITE_SIZE - (
adr % I2C_EEPROM_PAGEWRITE_SIZE));
128 res = HAL_I2C_Mem_Write(&I2C_PORT_EEPROM, I2C_EEPROM_ADR, curAdr, I2C_EEPROM_ADR_SIZE,
i2cBufferEeprom, wLen,I2C_EEPROM_TIMEOUT) == HAL_OK;
147 adr *=
sizeof(*buf)/I2C_EEPROM_DATA_SIZE;
148 assert(
adr < I2C_EEPROM_SIZE);
149 while(!HAL_I2C_IsDeviceReady(&I2C_PORT_EEPROM, I2C_EEPROM_ADR, 100, I2C_EEPROM_TIMEOUT) == HAL_OK){
152 bool res = HAL_I2C_Mem_Read(&I2C_PORT_EEPROM, I2C_EEPROM_ADR, I2C_EEPROM_OFS+
adr, I2C_EEPROM_ADR_SIZE,
i2cBufferEeprom, 2, I2C_EEPROM_TIMEOUT) == HAL_OK;
162 res = empty ? false : res;
174 std::array<uint8_t,I2C_EEPROM_PAGEWRITE_SIZE> eraseBuf;
175 eraseBuf.fill(I2C_EEPROM_ERASED);
176 for(uint32_t i=I2C_EEPROM_OFS;i<I2C_EEPROM_SIZE;i+=I2C_EEPROM_PAGEWRITE_SIZE){
178 bool res = HAL_I2C_Mem_Write(&I2C_PORT_EEPROM, I2C_EEPROM_ADR, I2C_EEPROM_OFS+i, I2C_EEPROM_ADR_SIZE, eraseBuf.data(), std::min<int>(I2C_EEPROM_PAGEWRITE_SIZE,I2C_EEPROM_SIZE-i),I2C_EEPROM_TIMEOUT) == HAL_OK;
182 while(!HAL_I2C_IsDeviceReady(&I2C_PORT_EEPROM, I2C_EEPROM_ADR, 100, I2C_EEPROM_TIMEOUT) == HAL_OK){
190 return HAL_I2C_IsDeviceReady(&I2C_PORT_EEPROM, I2C_EEPROM_ADR, 10, I2C_EEPROM_TIMEOUT) == HAL_OK;
216void Flash_Dump(std::vector<std::tuple<uint16_t,uint16_t>> *result,
bool includeAll){
217 uint16_t amount = NB_EXPORTABLE_ADR;
226 for(uint32_t i = 0;i<amount ; i++){
228 uint16_t
adr = list[i];
231 result->push_back(std::tuple<uint16_t,uint16_t>{
adr,v});
const uint16_t VirtAddVarTab[NB_OF_VAR]
const uint16_t exportableFlashAddresses[NB_EXPORTABLE_ADR]
bool Flash_Read(uint16_t adr, uint16_t *buf, bool checkempty)
bool Flash_ReadWriteDefault(uint16_t adr, uint16_t *buf, uint16_t def)
bool Flash_Write(uint16_t adr, uint16_t dat)
void Flash_Dump(std::vector< std::tuple< uint16_t, uint16_t > > *result, bool includeAll)
uint8_t i2cBufferEeprom[sizeof(uint16_t)]
cpp_freertos::MutexStandard flashMutex
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t *Data)
Returns the last stored variable data, if found, which correspond to the passed virtual address.
uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data)
Writes/upadtes variable data in EEPROM.
HAL_StatusTypeDef EE_Format()
Erases PAGE and PAGE1 and writes VALID_PAGE header to PAGE.
uint16_t EE_Init(void)
Restore the pages to a known good state in case of page's status corruption after a power loss.
static void * memcpy(void *dst, const void *src, size_t n)