/**使用方法
1,解锁flash
FLASH_Unlock();
2,初始化
EE_Init();
测试例子参考
eeprom_test();
**/
/**
******************************************************************************
* @file EEPROM_Emulation/src/eeprom.c
* @author MCD Application Team
* @version V3.1.0
* @date 07/27/2009
* @brief This file provides all the EEPROM emulation firmware functions.
******************************************************************************
* @copy
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
*
© COPYRIGHT 2009 STMicroelectronics
*/
/** @addtogroup EEPROM_Emulation
* @{
*/
/* Includes ------------------------------------------------------------------*/
#include "eeprom.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Global variable used to store variable value in read sequence */
uint16_t DataVar = 0;
/* Virtual address defined by the user: 0xFFFF value is prohibited */
uint16_t VirtAddVarTab[]={
CURSET_RESET_TIME,
CURSET_UPDATE_STATE,
CURSET_SET_VER,
CURSET_RESERVED1,
CURSET_RESERVED2,
CURSET_RESERVED3,
CURSET_DEVICE_DevEUI0,
CURSET_DEVICE_DevEUI1,
CURSET_DEVICE_DevEUI2,
CURSET_DEVICE_DevEUI3,
CURSET_DEVICE_DevAddr0,
CURSET_DEVICE_DevAddr1,
CURSET_DEVICE_TYPE,
CURSET_DEVICE_HARD_VER,
CURSET_DEVICE_MFD0,
CURSET_DEVICE_MFD1,
CURSET_GW_ID0,
CURSET_GW_ID1,
CURSET_CHANNELL_NUM,
CURSET_BT_SOFT_VER0,
CURSET_BT_SOFT_VER1,
CURSET_PROTOCOL_VER0,
CURSET_PROTOCOL_VER1,
CURSET_APP1_START_ADDR0,
CURSET_APP1_START_ADDR1,
CURSET_APP1_VER_ADDR0,
CURSET_APP1_VER_ADDR1,
CURSET_APP1_LEN_ADDR0,
CURSET_APP1_LEN_ADDR1,
CURSET_APP1_CRC_ADDR0,
CURSET_APP1_CRC_ADDR1,
CURSET_APP2_START_ADDR0,
CURSET_APP2_START_ADDR1,
CURSET_APP2_VER_ADDR0,
CURSET_APP2_VER_ADDR1,
CURSET_APP2_LEN_ADDR0,
CURSET_APP2_LEN_ADDR1,
CURSET_APP2_CRC_ADDR0,
CURSET_APP2_CRC_ADDR1,
CURSET_APP3_START_ADDR0,
CURSET_APP3_START_ADDR1,
CURSET_APP3_VER_ADDR0,
CURSET_APP3_VER_ADDR1,
CURSET_APP3_LEN_ADDR0,
CURSET_APP3_LEN_ADDR1,
CURSET_APP3_CRC_ADDR0,
CURSET_APP3_CRC_ADDR1,
CURSET_APP3_FIREWARE_TYPE,
CURSET_BASE_KEY0,
CURSET_BASE_KEY1,
CURSET_BASE_KEY2,
CURSET_BASE_KEY3,
CURSET_BASE_KEY4,
CURSET_BASE_KEY5,
CURSET_BASE_KEY6,
CURSET_BASE_KEY7,
CURSET_LORA_CH0_PARM0,
CURSET_LORA_CH0_PARM1,
CURSET_LORA_CH0_PARM2,
CURSET_LORA_CH0_PARM3,
CURSET_LORA_CH0_PARM4,
CURSET_LORA_CH1_PARM0,
CURSET_LORA_CH1_PARM1,
CURSET_LORA_CH1_PARM2,
CURSET_LORA_CH1_PARM3,
CURSET_LORA_CH1_PARM4,
CURSET_YTSF_EN,
CURSET_LOOP_PERIOD,
CURSET_SKK_PORT0,
CURSET_SKK_PORT1,
CURSET_YTSF_PORT0_SN0,
CURSET_YTSF_PORT0_SN1,
CURSET_YTSF_PORT0_SN2,
CURSET_YTSF_PORT1_SN0,
CURSET_YTSF_PORT1_SN1,
CURSET_YTSF_PORT1_SN2,
CURSET_CRC0,
CURSET_CRC1
};
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
static FLASH_Status EE_Format(void);
static uint16_t EE_FindValidPage(uint8_t Operation);
static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data);
static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data);
/**
* @brief Restore the pages to a known good state in case of page's status
* corruption after a power loss.
* @param None.
* @retval - Flash error code: on write Flash error
* - FLASH_COMPLETE: on success
*/
uint16_t EE_Init(void)
{
uint16_t PageStatus0 = 6, PageStatus1 = 6;
uint16_t VarIdx = 0;
uint16_t EepromStatus = 0, ReadStatus = 0;
int16_t x = -1;
uint16_t FlashStatus;
/* Get Page0 status */
PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS);
EEPROM_DEBUG("PAGE0_BASE_ADDRESS=0x%08x,PageStatus0=0x%04x\r\n",PAGE0_BASE_ADDRESS,PageStatus0);
/* Get Page1 status */
PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS);
EEPROM_DEBUG("PAGE1_BASE_ADDRESS=0x%08x,PageStatus1=0x%04x\r\n",PAGE1_BASE_ADDRESS,PageStatus1);
/* Check for invalid header states and repair if necessary */
switch (PageStatus0)
{
case ERASED:
if (PageStatus1 == VALID_PAGE) /* Page0 erased, Page1 valid */
{
/* Erase Page0 */
FlashStatus = FLASH_ErasePage(PAGE0_BASE_ADDRESS);
/* If erase operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
}
else if (PageStatus1 == RECEIVE_DATA) /* Page0 erased, Page1 receive */
{
/* Erase Page0 */
FlashStatus = FLASH_ErasePage(PAGE0_BASE_ADDRESS);
/* If erase operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
/* Mark Page1 as valid */
FlashStatus = FLASH_ProgramHalfWord(PAGE1_BASE_ADDRESS, VALID_PAGE);
/* If program operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
}
else /* First EEPROM access (Page0&1 are erased) or invalid state -> format EEPROM */
{
/* Erase both Page0 and Page1 and set Page0 as valid page */
FlashStatus = EE_Format();
/* If erase/program operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
}
break;
case RECEIVE_DATA:
if (PageStatus1 == VALID_PAGE) /* Page0 receive, Page1 valid */
{
/* Transfer data from Page1 to Page0 */
for (VarIdx = 0; VarIdx < NumbOfVar; VarIdx++)
{
if (( *(__IO uint16_t*)(PAGE0_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx])
{
x = VarIdx;
}
if (VarIdx != x)
{
/* Read the last variables' 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 Page0 */
EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar);
/* If program operation was failed, a Flash error code is returned */
if (EepromStatus != FLASH_COMPLETE)
{
return EepromStatus;
}
}
}
}
/* Mark Page0 as valid */
FlashStatus = FLASH_ProgramHalfWord(PAGE0_BASE_ADDRESS, VALID_PAGE);
/* If program operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
/* Erase Page1 */
FlashStatus = FLASH_ErasePage(PAGE1_BASE_ADDRESS);
/* If erase operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
}
else if (PageStatus1 == ERASED) /* Page0 receive, Page1 erased */
{
/* Erase Page1 */
FlashStatus = FLASH_ErasePage(PAGE1_BASE_ADDRESS);
/* If erase operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
/* Mark Page0 as valid */
FlashStatus = FLASH_ProgramHalfWord(PAGE0_BASE_ADDRESS, VALID_PAGE);
/* If program operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
}
else /* Invalid state -> format eeprom */
{
/* Erase both Page0 and Page1 and set Page0 as valid page */
FlashStatus = EE_Format();
/* If erase/program operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
}
break;
case VALID_PAGE:
if (PageStatus1 == VALID_PAGE) /* Invalid state -> format eeprom */
{
/* Erase both Page0 and Page1 and set Page0 as valid page */
FlashStatus = EE_Format();
/* If erase/program operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
}
else if (PageStatus1 == ERASED) /* Page0 valid, Page1 erased */
{
/* Erase Page1 */
FlashStatus = FLASH_ErasePage(PAGE1_BASE_ADDRESS);
/* If erase operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
}
else /* Page0 valid, Page1 receive */
{
/* Transfer data from Page0 to Page1 */
for (VarIdx = 0; VarIdx < NumbOfVar; VarIdx++)
{
if ((*(__IO uint16_t*)(PAGE1_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx])
{
x = VarIdx;
}
if (VarIdx != x)
{
/* Read the last variables' 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 Page1 */
EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar);
/* If program operation was failed, a Flash error code is returned */
if (EepromStatus != FLASH_COMPLETE)
{
return EepromStatus;
}
}
}
}
/* Mark Page1 as valid */
FlashStatus = FLASH_ProgramHalfWord(PAGE1_BASE_ADDRESS, VALID_PAGE);
/* If program operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
/* Erase Page0 */
FlashStatus = FLASH_ErasePage(PAGE0_BASE_ADDRESS);
/* If erase operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
}
break;
default: /* Any other state -> format eeprom */
/* Erase both Page0 and Page1 and set Page0 as valid page */
FlashStatus = EE_Format();
/* If erase/program operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
break;
}
return FLASH_COMPLETE;
}
/**
* @brief Returns the last stored variable data, if found, which correspond to
* the passed virtual address
* @param VirtAddress: Variable virtual address
* @param Data: Global variable contains the read variable value
* @retval Success or error status:
* - 0: if variable was found
* - 1: if the variable was not found
* - NO_VALID_PAGE: if no valid page was found.
*/
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)
{
uint16_t ValidPage = PAGE0;
uint16_t AddressValue = 0x5555, ReadStatus = 1;
uint32_t Address = 0x0800F000, PageStartAddress = 0x0800F000;
IWDG_Feed(); //喂狗
/* Get active Page for read operation */
ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE);
//EEPROM_DEBUG("ValidPage=0x%04x\r\n",ValidPage);
/* Check if there is no valid page */
if (ValidPage == NO_VALID_PAGE)
{
return NO_VALID_PAGE;
}
/* Get the valid Page start Address */
PageStartAddress = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE));
//EEPROM_DEBUG("PageStartAddress=0x%08x\r\n",PageStartAddress);
/* Get the valid Page end Address */
Address = (uint32_t)((EEPROM_START_ADDRESS - 2) + (uint32_t)((1 + ValidPage) * PAGE_SIZE));
//EEPROM_DEBUG("Address=0x%08x\r\n",Address);
/* Check each active page address starting from end */
while (Address > (PageStartAddress + 2))
{
/* Get the current location content to be compared with virtual address */
AddressValue = (*(__IO uint16_t*)Address);
/* Compare the read address with the virtual address */
if (AddressValue == VirtAddress)
{
/* Get content of Address-2 which is variable value */
*Data = (*(__IO uint16_t*)(Address - 2));
EEPROM_DEBUG("ValidPage=0x%04x,RealAddress=0x%08x,VirtAddress=0x%04x,Data=0x%04x\r\n",ValidPage,(Address - 2),VirtAddress,*Data);
/* In case variable value is read, reset ReadStatus flag */
ReadStatus = 0;
break;
}
else
{
/* Next address location */
Address = Address - 4;
}
}
/* Return ReadStatus value: (0: variable exist, 1: variable doesn't exist) */
return ReadStatus;
}
/**
* @brief Writes/upadtes variable data in EEPROM.
* @param VirtAddress: Variable virtual address
* @param Data: 16 bit data to be written
* @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
*/
uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data)
{
uint16_t Status = 0;
IWDG_Feed(); //喂狗
/* Write the variable virtual address and value in the EEPROM */
Status = EE_VerifyPageFullWriteVariable(VirtAddress, Data);
/* In case the EEPROM active page is full */
if (Status == PAGE_FULL)
{
/* Perform Page transfer */
EEPROM_DEBUG("Status == PAGE_FULL\r\n");
Status = EE_PageTransfer(VirtAddress, Data);
}
/* Return last operation status */
return Status;
}
/**
* @brief Erases PAGE0 and PAGE1 and writes VALID_PAGE header to PAGE0
* @param None
* @retval Status of the last operation (Flash write or erase) done during
* EEPROM formating
*/
static FLASH_Status EE_Format(void)
{
FLASH_Status FlashStatus = FLASH_COMPLETE;
EEPROM_DEBUG("Erases PAGE0 and PAGE1 and writes VALID_PAGE header to PAGE0\r\n");
/* Erase Page0 */
FlashStatus = FLASH_ErasePage(PAGE0_BASE_ADDRESS);
/* If erase operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
/* Set Page0 as valid page: Write VALID_PAGE at Page0 base address */
FlashStatus = FLASH_ProgramHalfWord(PAGE0_BASE_ADDRESS, VALID_PAGE);
/* If program operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
/* Erase Page1 */
FlashStatus = FLASH_ErasePage(PAGE1_BASE_ADDRESS);
/* Return Page1 erase operation status */
return FlashStatus;
}
/**
* @brief Find valid Page for write or read operation
* @param Operation: operation to achieve on the valid page.
* This parameter can be one of the following values:
* @arg READ_FROM_VALID_PAGE: read operation from valid page
* @arg WRITE_IN_VALID_PAGE: write operation from valid page
* @retval Valid page number (PAGE0 or PAGE1) or NO_VALID_PAGE in case
* of no valid page was found
*/
static uint16_t EE_FindValidPage(uint8_t Operation)
{
uint16_t PageStatus0 = 6, PageStatus1 = 6;
/* Get Page0 actual status */
PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS);
//EEPROM_DEBUG("PageStatus0=0x%04x\r\n",PageStatus0);
/* Get Page1 actual status */
PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS);
//EEPROM_DEBUG("PageStatus1=0x%04x\r\n",PageStatus1);
/* Write or read operation */
switch (Operation)
{
case WRITE_IN_VALID_PAGE: /* ---- Write operation ---- */
if (PageStatus1 == VALID_PAGE)
{
/* Page0 receiving data */
if (PageStatus0 == RECEIVE_DATA)
{
return PAGE0; /* Page0 valid */
}
else
{
return PAGE1; /* Page1 valid */
}
}
else if (PageStatus0 == VALID_PAGE)
{
/* Page1 receiving data */
if (PageStatus1 == RECEIVE_DATA)
{
return PAGE1; /* Page1 valid */
}
else
{
return PAGE0; /* Page0 valid */
}
}
else
{
return NO_VALID_PAGE; /* No valid Page */
}
case READ_FROM_VALID_PAGE: /* ---- Read operation ---- */
if (PageStatus0 == VALID_PAGE)
{
return PAGE0; /* Page0 valid */
}
else if (PageStatus1 == VALID_PAGE)
{
return PAGE1; /* Page1 valid */
}
else
{
return NO_VALID_PAGE ; /* No valid Page */
}
default:
return PAGE0; /* Page0 valid */
}
}
/**
* @brief Verify if active page is full and Writes variable in EEPROM.
* @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_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data)
{
FLASH_Status FlashStatus = FLASH_COMPLETE;
uint16_t ValidPage = PAGE0;
uint32_t Address = 0x0800F000, PageEndAddress = 0x0800F7FF;
/* Get valid Page for write operation */
ValidPage = EE_FindValidPage(WRITE_IN_VALID_PAGE);
//EEPROM_DEBUG("ValidPage=0x%04x\r\n",ValidPage);
/* Check if there is no valid page */
if (ValidPage == NO_VALID_PAGE)
{
return NO_VALID_PAGE;
}
/* Get the valid Page start Address */
Address = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE));
//EEPROM_DEBUG("Address=0x%04x\r\n",Address);
/* Get the valid Page end Address */
PageEndAddress = (uint32_t)((EEPROM_START_ADDRESS - 2) + (uint32_t)((1 + ValidPage) * PAGE_SIZE));
//EEPROM_DEBUG("PageEndAddress=0x%04x\r\n",PageEndAddress);
/* Check each active page address starting from begining */
while (Address < PageEndAddress)
{
/* Verify if Address and Address+2 contents are 0xFFFFFFFF */
if ((*(__IO uint32_t*)Address) == 0xFFFFFFFF)
{
/* Set variable data */
FlashStatus = FLASH_ProgramHalfWord(Address, Data);
/* If program operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
/* Set variable virtual address */
FlashStatus = FLASH_ProgramHalfWord(Address + 2, VirtAddress);
EEPROM_DEBUG("ValidPage=0x%04x,RealAddress=0x%08x,VirtAddress=0x%04x,Data=0x%04x\r\n",ValidPage,(Address+2),VirtAddress,Data);
/* Return program operation status */
return FlashStatus;
}
else
{
/* Next address location */
Address = Address + 4;
}
}
/* 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 = 0x0800F3FF, OldPageAddress = 0x0800F000;
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 */
}
EEPROM_DEBUG("NewPageAddress=0x%08x,OldPageAddress=0x%08x\r\n",NewPageAddress,OldPageAddress);
/* 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;
}
/* 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;
}
EEPROM_DEBUG("Transfer process: transfer variables from old to the new active page\r\n");
/* Transfer process: transfer variables from old to the new active page */
for (VarIdx = 0; VarIdx < NumbOfVar; VarIdx++)
{
IWDG_Feed(); //喂狗
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;
}
}
}
}
EEPROM_DEBUG("Erase the old Page: Set old Page status to ERASED status,OldPageAddress=0x%08x\r\n",OldPageAddress);
/* 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;
}
EEPROM_DEBUG("Set new Page status to VALID_PAGE status,NewPageAddress=0x%08x\r\n",NewPageAddress);
/* 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;
}
/*计算eeprom CRC值*/
uint16_t Calc_Eeprom_CRC32(uint32_t *crcvalue){
uint16_t i=0,ReadStatus =1;
uint16_t EE_h = 0xffff,EE_l = 0xffff;
CRC_ResetDR();
for (i = 0; i < NumbOfVar-4;i+=2)
{
if(EE_ReadVariable(i , &EE_h)!=0)
return ReadStatus;
if(EE_ReadVariable(i+1, &EE_l)!=0)
return ReadStatus;
CRC_CalcCRC((EE_h<<16) & EE_l);
EE_h = 0xffff;
EE_l = 0xffff;
}
if(NumbOfVar%2)
{
if(EE_ReadVariable(i , &EE_h)!=0)
return ReadStatus;
CRC_CalcCRC((EE_h<<16) & EE_l);
}
*crcvalue = CRC_GetCRC();
ReadStatus = 0;
return ReadStatus;
}
/* Virtual address defined by the user: 0xFFFF value is prohibited */
//uint16_t VirtAddVarTab[3] = {0x5555, 0x6666, 0x7777};
uint16_t eeprom_test(void)
{
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
uint16_t VarValue = 0,resultcode = 1;
uint16_t temp=0;
uint32_t CRCValue=0;
EEPROM_DEBUG("\r\nStart EEPROM TEST\r\n");
if(EE_ReadVariable(CURSET_RESET_TIME, &temp)!=0)
{
EE_WriteVariable(CURSET_RESET_TIME, 0x0000);
EE_WriteVariable(CURSET_UPDATE_STATE, 0x0000);
EE_WriteVariable(CURSET_SET_VER, 0x0000);
/*
EE_WriteVariable(CURSET_RESERVED1, 0xFFFF);
EE_WriteVariable(CURSET_RESERVED2, 0xFFFF);
EE_WriteVariable(CURSET_RESERVED3, 0xFFFF);
EE_WriteVariable(CURSET_DEVICE_DevEUI0, 0xFFFF);
EE_WriteVariable(CURSET_DEVICE_DevEUI1, 0xFFFF);
EE_WriteVariable(CURSET_DEVICE_DevEUI2, 0xFFFF);
EE_WriteVariable(CURSET_DEVICE_DevEUI3, 0xFFFF);
EE_WriteVariable(CURSET_DEVICE_DevAddr0, 0xFFFF);
EE_WriteVariable(CURSET_DEVICE_DevAddr1, 0xFFFF);
EE_WriteVariable(CURSET_DEVICE_TYPE, 0x0003);
EE_WriteVariable(CURSET_DEVICE_HARD_VER, 0x0001);
EE_WriteVariable(CURSET_DEVICE_MFD0, 0x2020);
EE_WriteVariable(CURSET_DEVICE_MFD1, 0x0808);
EE_WriteVariable(CURSET_GW_ID0, 0xFFFF);
EE_WriteVariable(CURSET_GW_ID1, 0xFFFF);
EE_WriteVariable(CURSET_CHANNELL_NUM, 0xFFFF);
EE_WriteVariable(CURSET_BT_SOFT_VER0, 0x0001);
EE_WriteVariable(CURSET_BT_SOFT_VER1, 0x6301);
EE_WriteVariable(CURSET_PROTOCOL_VER0, 0x0001);
EE_WriteVariable(CURSET_PROTOCOL_VER1, 0x0000);
EE_WriteVariable(CURSET_APP1_START_ADDR0, 0x0000);
EE_WriteVariable(CURSET_APP1_START_ADDR1, 0x0801);
EE_WriteVariable(CURSET_APP1_VER_ADDR0, 0x0001);
EE_WriteVariable(CURSET_APP1_VER_ADDR1, 0x6301);
EE_WriteVariable(CURSET_APP1_LEN_ADDR0, 0xFFF8);
EE_WriteVariable(CURSET_APP1_LEN_ADDR1, 0x0801);
EE_WriteVariable(CURSET_APP1_CRC_ADDR0, 0xFFFC);
EE_WriteVariable(CURSET_APP1_CRC_ADDR1, 0x0801);
EE_WriteVariable(CURSET_APP2_START_ADDR0, 0x0000);
EE_WriteVariable(CURSET_APP2_START_ADDR1, 0x0802);
EE_WriteVariable(CURSET_APP2_VER_ADDR0, 0xFFF4);
EE_WriteVariable(CURSET_APP2_VER_ADDR1, 0x0802);
EE_WriteVariable(CURSET_APP2_LEN_ADDR0, 0xFFF8);
EE_WriteVariable(CURSET_APP2_LEN_ADDR1, 0x0802);
EE_WriteVariable(CURSET_APP2_CRC_ADDR0, 0xFFFC);
EE_WriteVariable(CURSET_APP2_CRC_ADDR1, 0x0802);
EE_WriteVariable(CURSET_APP3_START_ADDR0, 0x0000);
EE_WriteVariable(CURSET_APP3_START_ADDR1, 0x0803);
EE_WriteVariable(CURSET_APP3_VER_ADDR0, 0x0002);
EE_WriteVariable(CURSET_APP3_VER_ADDR1, 0x6301);
EE_WriteVariable(CURSET_APP3_LEN_ADDR0, 0x494C);
EE_WriteVariable(CURSET_APP3_LEN_ADDR1, 0x0000);
EE_WriteVariable(CURSET_APP3_CRC_ADDR0, 0xFFFC);
EE_WriteVariable(CURSET_APP3_CRC_ADDR1, 0x0803);
EE_WriteVariable(CURSET_APP3_FIREWARE_TYPE, 0x0000);
EE_WriteVariable(CURSET_BASE_KEY0, 0xABAA);
EE_WriteVariable(CURSET_BASE_KEY1, 0xB826);
EE_WriteVariable(CURSET_BASE_KEY2, 0xF479);
EE_WriteVariable(CURSET_BASE_KEY3, 0x7818);
EE_WriteVariable(CURSET_BASE_KEY4, 0x668E);
EE_WriteVariable(CURSET_BASE_KEY5, 0xFF3D);
EE_WriteVariable(CURSET_BASE_KEY6, 0x1CFB);
EE_WriteVariable(CURSET_BASE_KEY7, 0xCF95);
EE_WriteVariable(CURSET_LORA_CH0_PARM0, 0x9488);
EE_WriteVariable(CURSET_LORA_CH0_PARM1, 0x4A4B);
EE_WriteVariable(CURSET_LORA_CH0_PARM2, 0x0907);
EE_WriteVariable(CURSET_LORA_CH0_PARM3, 0x1880);
EE_WriteVariable(CURSET_LORA_CH0_PARM4, 0x6464);
EE_WriteVariable(CURSET_LORA_CH1_PARM0, 0x1488);
EE_WriteVariable(CURSET_LORA_CH1_PARM1, 0x4D68);
EE_WriteVariable(CURSET_LORA_CH1_PARM2, 0x0907);
EE_WriteVariable(CURSET_LORA_CH1_PARM3, 0x1880);
EE_WriteVariable(CURSET_LORA_CH1_PARM4, 0x6464);
EE_WriteVariable(CURSET_YTSF_EN, 0x0000);
EE_WriteVariable(CURSET_LOOP_PERIOD, 0x000A);
EE_WriteVariable(CURSET_SKK_PORT0, 0x0103);
EE_WriteVariable(CURSET_SKK_PORT1, 0x0103);
EE_WriteVariable(CURSET_YTSF_PORT0_SN0, 0xFFFF);
EE_WriteVariable(CURSET_YTSF_PORT0_SN1, 0xFFFF);
EE_WriteVariable(CURSET_YTSF_PORT0_SN2, 0xFFFF);
EE_WriteVariable(CURSET_YTSF_PORT1_SN0, 0xFFFF);
EE_WriteVariable(CURSET_YTSF_PORT1_SN1, 0xFFFF);
EE_WriteVariable(CURSET_YTSF_PORT1_SN2, 0xFFFF);
*/
if(Calc_Eeprom_CRC32(&CRCValue)!=0)
return resultcode;
EEPROM_DEBUG("CRCValue=0x%08x\r\n",CRCValue);
EE_WriteVariable(CURSET_CRC0, (uint16_t)((CRCValue >> 0) & 0xffff));
EE_WriteVariable(CURSET_CRC1, (uint16_t)((CRCValue >> 16) & 0xffff));
EE_WriteVariable(CURSET_RESET_TIME, 0x0001);
}
for (VarValue = 0; VarValue < NumbOfVar; VarValue++)
{
EE_ReadVariable(VirtAddVarTab[VarValue], &temp);
EEPROM_DEBUG("VirtAdd=0x%04x,data=0x%04x\r\n",VirtAddVarTab[VarValue],temp);
}
EEPROM_DEBUG("\r\nEnd EEPROM TEST\r\n");
resultcode = 0;
return resultcode;
}
/**
* @}
*/
/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/