} }
/* Return PAGE_FULL in case the valid page is full */ return PAGE_FULL; } /**
* @brief Transfers last updated variables data from the full Page to * an empty one.
* @param VirtAddress: 16 bit virtual address of the variable * @param Data: 16 bit data to be written as variable value * @retval Success or error status:
* - FLASH_COMPLETE: on success * - PAGE_FULL: if valid page is full
* - NO_VALID_PAGE: if no valid page was found * - Flash error code: on write Flash error */
static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data) {
FLASH_Status FlashStatus = FLASH_COMPLETE;
uint32_t NewPageAddress = 0x080103FF, OldPageAddress = 0x08010000; uint16_t ValidPage = PAGE0, VarIdx = 0; uint16_t EepromStatus = 0, ReadStatus = 0;
/* Get active Page for read operation */
ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE);
if (ValidPage == PAGE1) /* Page1 valid */ {
/* New page address where variable will be moved to */ NewPageAddress = PAGE0_BASE_ADDRESS;
/* Old page address where variable will be taken from */ OldPageAddress = PAGE1_BASE_ADDRESS; }
else if (ValidPage == PAGE0) /* Page0 valid */ {
/* New page address where variable will be moved to */ NewPageAddress = PAGE1_BASE_ADDRESS;
/* Old page address where variable will be taken from */ OldPageAddress = PAGE0_BASE_ADDRESS; }
else {
return NO_VALID_PAGE; /* No valid Page */ }
/* Set the new Page status to RECEIVE_DATA status */
FlashStatus = FLASH_ProgramHalfWord(NewPageAddress, RECEIVE_DATA); /* If program operation was failed, a Flash error code is returned */ if (FlashStatus != FLASH_COMPLETE) {
return FlashStatus; }
InitCurrWrAddress();//aft 重新初始化写地址
/* Write the variable passed as parameter in the new active page */ EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddress, Data); /* If program operation was failed, a Flash error code is returned */ if (EepromStatus != FLASH_COMPLETE) {
return EepromStatus; }
/* Transfer process: transfer variables from old to the new active page */ for (VarIdx = 0; VarIdx < NumbOfVar; VarIdx++) {
if (VirtAddVarTab[VarIdx] != VirtAddress) /* Check each variable except the one passed as parameter */ {
/* Read the other last variable updates */
ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); /* In case variable corresponding to the virtual address was found */ if (ReadStatus != 0x1) {
/* Transfer the variable to the new active page */
EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); /* If program operation was failed, a Flash error code is returned */ if (EepromStatus != FLASH_COMPLETE) {
return EepromStatus; } } } }
/* Erase the old Page: Set old Page status to ERASED status */ FlashStatus = FLASH_ErasePage(OldPageAddress);
/* If erase operation was failed, a Flash error code is returned */ if (FlashStatus != FLASH_COMPLETE) {
return FlashStatus; }
/* Set new Page status to VALID_PAGE status */
FlashStatus = FLASH_ProgramHalfWord(NewPageAddress, VALID_PAGE); /* If program operation was failed, a Flash error code is returned */ if (FlashStatus != FLASH_COMPLETE) {
return FlashStatus; }
/* Return last operation flash status */ return FlashStatus; } /** * @} */
/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ /*************eeprom.c*************/