/************eeprom.h**************/ /**
****************************************************************************** * @file EEPROM_Emulation/inc/eeprom.h * @author MCD Application Team * @version V3.1.0
* @date 07/27/2009
* @brief This file contains all the functions prototypes for the EEPROM * emulation firmware library.
****************************************************************************** * @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
*/ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __EEPROM_H #define __EEPROM_H
/* Includes ------------------------------------------------------------------*/ #include \
/* Exported constants --------------------------------------------------------*/
/* Define the STM32F10Xxx Flash page size depending on the used STM32 device */ #if defined (STM32F10X_LD) || defined (STM32F10X_MD)
#define PAGE_SIZE (uint16_t)0x400 /* Page size = 1KByte */ #elif defined (STM32F10X_HD) || defined (STM32F10X_CL)
#define PAGE_SIZE (uint16_t)0x800 /* Page size = 2KByte */ #endif
/* EEPROM start address in Flash */
#define EEPROM_START_ADDRESS ((uint32_t)0x08010000) /* EEPROM emulation start address:
after 64KByte of used Flash memory */
/* Pages 0 and 1 base and end addresses */
#define PAGE0_BASE_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + 0x000))
#define PAGE0_END_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + (PAGE_SIZE - 1)))
#define PAGE1_BASE_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + PAGE_SIZE))
#define PAGE1_END_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + (2 * PAGE_SIZE - 1)))
/* Used Flash pages for EEPROM emulation */
#define PAGE0 ((uint16_t)0x0000) #define PAGE1 ((uint16_t)0x0001)
/* No valid page define */
#define NO_VALID_PAGE ((uint16_t)0x00AB)
/* Page status definitions */
#define ERASED ((uint16_t)0xFFFF) /* PAGE is empty */
#define RECEIVE_DATA ((uint16_t)0xEEEE) /* PAGE is marked to receive data */
#define VALID_PAGE ((uint16_t)0x0000) /* PAGE containing valid data */
/* Valid pages in read and write defines */
#define READ_FROM_VALID_PAGE ((uint8_t)0x00) #define WRITE_IN_VALID_PAGE ((uint8_t)0x01)
/* Page full define */
#define PAGE_FULL ((uint8_t)0x80)
/* Variables' number */
#define NumbOfVar ((uint8_t)0x03)
/* Exported types ------------------------------------------------------------*/ /* Exported macro ------------------------------------------------------------*/ /* Exported functions ------------------------------------------------------- */ uint16_t EE_Init(void);
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data); uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data);
#endif /* __EEPROM_H */
/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ /************eeprom.h**************/
/*************eeprom.c*************/ /**
****************************************************************************** * @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 \
/* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/
/* Global variable used to store variable value in read sequence */ uint16_t DataVar = 0; uint32_t CurWrAddress;
/* Virtual address defined by the user: 0xFFFF value is prohibited */ uint16_t VirtAddVarTab[NumbOfVar];
/* 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);
//初始化写地址,减少每次读写时查询时间 uint16_t InitCurrWrAddress(void) {
FLASH_Status FlashStatus = FLASH_COMPLETE; uint16_t ValidPage = PAGE0; //uint32_t Address;
uint32_t PageEndAddress;
/* Get valid Page for write operation */
ValidPage = EE_FindValidPage(WRITE_IN_VALID_PAGE);
/* Check if there is no valid page */ if (ValidPage == NO_VALID_PAGE) {
CurWrAddress = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE)); return NO_VALID_PAGE; }
/* Get the valid Page start Address */
//Address = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE)); CurWrAddress = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE));
/* Get the valid Page end Address */
PageEndAddress = (uint32_t)((EEPROM_START_ADDRESS - 2) + (uint32_t)((1 + ValidPage) * PAGE_SIZE));
/* Check each active page address starting from begining */ while (CurWrAddress < PageEndAddress) {
/* Verify if Address and Address+2 contents are 0xFFFFFFFF */ if ((*(__IO uint32_t*)CurWrAddress) == 0xFFFFFFFF) {
/* Set variable virtual address */ FlashStatus = FLASH_COMPLETE;
/* Return program operation status */ return FlashStatus; } else {
/* Next address location */
CurWrAddress = CurWrAddress + 4; } }
/* Return PAGE_FULL in case the valid page is full */ return PAGE_FULL; } /**
* @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); /* Get Page1 status */
PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS);
/* 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 */