77范文网 - 专业文章范例文档资料分享平台

stm32_flash_eeprom_断电保护_数值存储程序

来源:网络收集 时间:2018-11-21 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

/************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 */

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库stm32_flash_eeprom_断电保护_数值存储程序在线全文阅读。

stm32_flash_eeprom_断电保护_数值存储程序.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/294358.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: