52#ifdef USE_EEPROM_EMULATION
81 uint16_t PageStatus0 = 6, PageStatus1 = 6;
83 uint16_t EepromStatus = 0, ReadStatus = 0;
85 HAL_StatusTypeDef FlashStatus;
86 uint32_t SectorError = 0;
87 FLASH_EraseInitTypeDef pEraseInit;
91 PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS);
93 PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS);
95 pEraseInit.TypeErase = TYPEERASE_SECTORS;
96 pEraseInit.Sector = PAGE0_ID;
97 pEraseInit.NbSectors = 1;
98 pEraseInit.VoltageRange = VOLTAGE_RANGE;
104 if (PageStatus1 == VALID_PAGE)
109 FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
111 if (FlashStatus != HAL_OK)
117 else if (PageStatus1 == RECEIVE_DATA)
122 FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
124 if (FlashStatus != HAL_OK)
130 FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE1_BASE_ADDRESS, VALID_PAGE);
132 if (FlashStatus != HAL_OK)
142 if (FlashStatus != HAL_OK)
150 if (PageStatus1 == VALID_PAGE)
153 for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++)
155 if (( *(__IO uint16_t*)(PAGE0_BASE_ADDRESS + 6)) ==
VirtAddVarTab[VarIdx])
164 if (ReadStatus != 0x1)
169 if (EepromStatus != HAL_OK)
177 FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE);
179 if (FlashStatus != HAL_OK)
183 pEraseInit.Sector = PAGE1_ID;
184 pEraseInit.NbSectors = 1;
185 pEraseInit.VoltageRange = VOLTAGE_RANGE;
189 FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
191 if (FlashStatus != HAL_OK)
197 else if (PageStatus1 == ERASED)
199 pEraseInit.Sector = PAGE1_ID;
200 pEraseInit.NbSectors = 1;
201 pEraseInit.VoltageRange = VOLTAGE_RANGE;
205 FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
207 if (FlashStatus != HAL_OK)
213 FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE);
215 if (FlashStatus != HAL_OK)
225 if (FlashStatus != HAL_OK)
233 if (PageStatus1 == VALID_PAGE)
238 if (FlashStatus != HAL_OK)
243 else if (PageStatus1 == ERASED)
245 pEraseInit.Sector = PAGE1_ID;
246 pEraseInit.NbSectors = 1;
247 pEraseInit.VoltageRange = VOLTAGE_RANGE;
251 FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
253 if (FlashStatus != HAL_OK)
262 for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++)
264 if ((*(__IO uint16_t*)(PAGE1_BASE_ADDRESS + 6)) ==
VirtAddVarTab[VarIdx])
273 if (ReadStatus != 0x1)
278 if (EepromStatus != HAL_OK)
286 FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE1_BASE_ADDRESS, VALID_PAGE);
288 if (FlashStatus != HAL_OK)
292 pEraseInit.Sector = PAGE0_ID;
293 pEraseInit.NbSectors = 1;
294 pEraseInit.VoltageRange = VOLTAGE_RANGE;
298 FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
300 if (FlashStatus != HAL_OK)
312 if (FlashStatus != HAL_OK)
334 uint32_t ReadStatus = 1;
335 uint16_t AddressValue = 0x5555;
338 while (Address <= PAGE0_END_ADDRESS)
341 AddressValue = (*(__IO uint16_t*)Address);
344 if (AddressValue != ERASED)
353 Address = Address + 4;
372 uint16_t ValidPage = PAGE0;
373 uint16_t AddressValue = 0x5555, ReadStatus = 1;
374 uint32_t Address = EEPROM_START_ADDRESS, PageStartAddress = EEPROM_START_ADDRESS;
380 if (ValidPage == NO_VALID_PAGE)
382 return NO_VALID_PAGE;
386 PageStartAddress = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE));
389 Address = (uint32_t)((EEPROM_START_ADDRESS - 2) + (uint32_t)((1 + ValidPage) * PAGE_SIZE));
392 while (Address > (PageStartAddress + 2))
395 AddressValue = (*(__IO uint16_t*)Address);
398 if (AddressValue == VirtAddress)
401 *Data = (*(__IO uint16_t*)(Address - 2));
411 Address = Address - 4;
437 if (Status == PAGE_FULL)
455 HAL_StatusTypeDef FlashStatus = HAL_OK;
456 uint32_t SectorError = 0;
457 FLASH_EraseInitTypeDef pEraseInit;
459 pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;
460 pEraseInit.Sector = PAGE0_ID;
461 pEraseInit.NbSectors = 1;
462 pEraseInit.VoltageRange = VOLTAGE_RANGE;
466 FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
468 if (FlashStatus != HAL_OK)
474 FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE);
476 if (FlashStatus != HAL_OK)
481 pEraseInit.Sector = PAGE1_ID;
485 FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
487 if (FlashStatus != HAL_OK)
507 uint16_t PageStatus0 = 6, PageStatus1 = 6;
510 PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS);
513 PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS);
518 case WRITE_IN_VALID_PAGE:
519 if (PageStatus1 == VALID_PAGE)
522 if (PageStatus0 == RECEIVE_DATA)
531 else if (PageStatus0 == VALID_PAGE)
534 if (PageStatus1 == RECEIVE_DATA)
545 return NO_VALID_PAGE;
548 case READ_FROM_VALID_PAGE:
549 if (PageStatus0 == VALID_PAGE)
553 else if (PageStatus1 == VALID_PAGE)
559 return NO_VALID_PAGE ;
579 HAL_StatusTypeDef FlashStatus = HAL_OK;
580 uint16_t ValidPage = PAGE0;
581 uint32_t Address = EEPROM_START_ADDRESS, PageEndAddress = EEPROM_START_ADDRESS+PAGE_SIZE;
587 if (ValidPage == NO_VALID_PAGE)
589 return NO_VALID_PAGE;
593 Address = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE));
596 PageEndAddress = (uint32_t)((EEPROM_START_ADDRESS - 1) + (uint32_t)((ValidPage + 1) * PAGE_SIZE));
599 while (Address < PageEndAddress)
602 if ((*(__IO uint32_t*)Address) == 0xFFFFFFFF)
605 FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, Address, Data);
607 if (FlashStatus != HAL_OK)
612 FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, Address + 2, VirtAddress);
619 Address = Address + 4;
640 HAL_StatusTypeDef FlashStatus = HAL_OK;
641 uint32_t NewPageAddress = EEPROM_START_ADDRESS;
642 uint16_t OldPageId=0;
643 uint16_t ValidPage = PAGE0, VarIdx = 0;
644 uint16_t EepromStatus = 0, ReadStatus = 0;
645 uint32_t SectorError = 0;
646 FLASH_EraseInitTypeDef pEraseInit;
651 if (ValidPage == PAGE1)
654 NewPageAddress = PAGE0_BASE_ADDRESS;
657 OldPageId = PAGE1_ID;
659 else if (ValidPage == PAGE0)
662 NewPageAddress = PAGE1_BASE_ADDRESS;
665 OldPageId = PAGE0_ID;
669 return NO_VALID_PAGE;
673 FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, NewPageAddress, RECEIVE_DATA);
675 if (FlashStatus != HAL_OK)
683 if (EepromStatus != HAL_OK)
689 for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++)
696 if (ReadStatus != 0x1)
701 if (EepromStatus != HAL_OK)
709 pEraseInit.TypeErase = TYPEERASE_SECTORS;
710 pEraseInit.Sector = OldPageId;
711 pEraseInit.NbSectors = 1;
712 pEraseInit.VoltageRange = VOLTAGE_RANGE;
715 FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
717 if (FlashStatus != HAL_OK)
723 FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, NewPageAddress, VALID_PAGE);
725 if (FlashStatus != HAL_OK)
const uint16_t VirtAddVarTab[NB_OF_VAR]
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(void)
Erases PAGE and PAGE1 and writes VALID_PAGE header to PAGE.
static uint16_t EE_FindValidPage(uint8_t Operation)
Find valid Page for write or read operation.
static uint16_t EE_VerifyPageFullyErased(uint32_t Address)
Verify if specified page is fully erased.
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 uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data)
Transfers last updated variables data from the full Page to an empty one.
static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data)
Verify if active page is full and Writes variable in EEPROM.