STM32 Flash 均衡保存算法

发布者:书香门第最新更新时间:2019-04-01 来源: eefocus关键字:STM32  Flash  均衡保存算法 手机看文章 扫描二维码
随时随地手机看文章

在实际应用中,经常需要在程序运行过程中保存或读取一些数据,这些数据在工作中经常会变化,而且掉电后也不能丢失,所以需要及时地进行存储,存储这些数据常用的存储器是 EEPROM。


STM32 虽然本身不带 EEPROM,但是它支持自编程技术,可以利用内部 FLASH 来模拟 EEPROM,这样不仅简化了设计,而且降低了成本。


FLASH 的擦写次数是有限的,一般是 10W 次, FLASH 单个存储单元bit只能从1变为0,而不能从0变成1。


想要变成1,只能 page 擦除,这里的 page 表示一个擦除单位,擦除过程就是把 page 所有的位都写1,这种硬件特性决定需要一种比较高效的写 flash 算法。


总不能一次更改数值时擦除整一大片 FLASH。


1、均值保存算法


处理方法是将 1024 字节按 16 字节大小分成 64 等份,按后面格式存储参数地址:


划分:0x10*n +0x00 +0x01  +0x02 ... +0x0E  +0x0F


内容:       flag  data1  data2 ... data14 data15  check_sum


check_sum=(flag+data1+data2+...+data15)&0xFF


flag 为 0xA5 表示当前 16 个字节为正在使用的记录,为其它值表示当前 16 字节已经丢弃。


这种保存方法是使用空间来换取擦写次数。


2、具体实现


1)定义 FLASH 页大小,储存数据大小:


#define FLASH_PAGE      1024

#define FLASH_DATAPACK  16  

2)定义一个储存结构体     


typedef struct {

  u32 Addr;            // 地址为 flash 一页的首地址

  u8  Read;            // 读地址的计数

  u8  Write;           // 写地址的计数

  u8  ReadBuff[FLASH_DATAPACK];  // 读取缓存区

  u8  WriteBuff[FLASH_DATAPACK];  // 写入缓存区

} EEPROMTypeDef;

// FLASH 写函数

void FlashWrite( EEPROMTypeDef *Flash_16 )

{

  u8 Flag;

  

  while_1:

  

  // 获取标志位

  Flag = *(vu8*)(Flash_16->Addr + (Flash_16->Write) * FLASH_DATAPACK);

  

  if(Flash_16->Write < 64 && Flag == 0xff)     // 如果地址在一页内且内容空白

  

  {

    HT_Flash_ByteWrite(Flash_16->WriteBuff, Flash_16->Addr + (Flash_16->Write++) * FLASH_DATAPACK,        FLASH_DATAPACK);

  }

  else if ( Flash_16->Write < 64 && Flag != 0xff ) // 如果地址在一页内却有数据存储

  {

    Flash_16->Write++;

    

    goto while_1;

  }     

  else if(Flash_16->Write >= 64 ) // 如果地址不在一页内

  {

    Flash_16->Write = 63;

  }

}

 

// FLASH 读函数

void FlashRead(EEPROMTypeDef *Flash_16)

{

  u8 Flag;

  

  while_1:

 

  // 获取标志位

  Flag = *(vu8*)(Flash_16->Addr + (Flash_16->Read) * FLASH_DATAPACK); 

 

  if( Flash_16->Read < 64 && Flag == 0xA5 )  // 如果地址在一页之内且数据有效

  {

    HT_Flash_ByteRead(Flash_16->ReadBuff, Flash_16->Addr + (Flash_16->Read) * FLASH_DATAPACK, FLASH_DATAPACK);  

 

  HT_Flash_ByteWrite(00, Flash_16->Addr + (Flash_16->Read++) * FLASH_DATAPACK, 1);  // 标记数据无效

  }

  else if(Flash_16->Read < 64 && Flag != 0xA5) // 如果地址在一页之内但数据无效

 {    

   if(Flag != 0xff)

    {                   

      Flash_16->Read++;

      

      goto while_1;

    }

  }     

 

  else if(Flash_16->Read >= 64)  // 如果地址不在一页之内

  {

    Flash_16->Read = 0;

 

    Flash_16->Write = 0;

 

    HT_Flash_PageErase(Flash_16->Addr); // 页擦除

  }

}

 

关键字:STM32  Flash  均衡保存算法 引用地址:STM32 Flash 均衡保存算法

上一篇:STM32 FLASH 掉电数据丢失处理策略以及备份机制
下一篇:STM32 查看 FLASH 和 RAM 使用情况

推荐阅读最新更新时间:2024-03-16 16:26

STM32——GPIO(1)
【对单片机的操作就是控制IO口】 一、GPIO(通用输入输出口) 1、选定需要的引脚(对应哪一个IO口); 2、配置需要的功能(输入还是输出); 3、设置需要的高低电平; 二、GPIO寄存器 配置寄存器:输入还是输出 数据寄存器:保存输入电平或将要输出电平 位控制寄存器:控制电平的输出 锁定寄存器:设置某锁定引脚后,不能修改配置 每4位控制一个引脚。寄存器都是32位的。 三、STM32地址映射 Cortex-M3 有 32 根地址线,所以它的寻址空间大小为 2^32 bit=4GB。 ARM 公司设计时,预先把这 4GB 的寻址空间大致地分配好了。地址从 0x4000 0000 至 0x5FFF FFFF(
[单片机]
<font color='red'>STM32</font>——GPIO(1)
STM32—FMSC详解
这个是从网上找到的,内容如下: STM32 FMSC LCD难点解析: 以下是网上和自己整理的:感觉应该可以把STM32 ----FSMC LCD中的关键RS说清楚~ ---------------------------------------------------------------------------------------------------------------------- 第一个角度理解STM32有FSMC(其实其他芯片基本都有类似的总线功能),FSMC的好处就是你一旦设置好之后,WR(写)、RD(读)、DB0-DB15这些控制线和数据线, 都是FSMC自动控制的。打个比方,当你在程序中写到:
[单片机]
STM32学习手记⑤-SysTick精确延时
/*********************************************************** 例程名称:SysTick实验 硬件连接:指示灯连接 PE0 功能描述:每秒PEO翻转一次 */ #include stm32f10x_lib.h extern vu32 TimingDelay; //在本文件引用stm32f10x_it.c定义的精确计时变量 /************************************************************ * 函数名称 :void RCC_Configuration() * 功能描述 : 复位和时钟控制 配置 * 参数
[单片机]
2023 STM32全国巡展,米尔限量发STM32MP135开发板优惠券
2023年9月12日至10月27日,以“STM32,不止于芯”为主题的第十六届STM32全国巡回研讨会将走进11个城市,本届研讨会为全天会议,我们将围绕STM32最新产品开展技术演讲和方案演示。 本次STM32全国研讨会,米尔电子将现场展出STM32相关的最新产品技术和应用演示,为工程师们提供共话交流共同探索开放式平台,届时,米尔电子的技术工程师将与各位嘉宾面对面深入交流。感兴趣的客户和朋友欢迎莅临参观了解! 米尔电子的明星产品将精彩亮相 米尔MYC-YF13X 核心板及开发板 基于STM32MP1系列MPU,STM32MP135高性价比入门级MPU设计平台,完整的安全生态系统让MCU开发者友好地过渡到MPU平
[单片机]
2023 <font color='red'>STM32</font>全国巡展,米尔限量发STM32MP135开发板优惠券
STM32 | OpenBLT Bootloader的使用分享
OpenBLT 简介 OpenBLT是一种开源引导加载程序,可以在任何微控制器上运行并使用任何类型的通信接口来执行软件更新,而无需专用的调试器硬件。 官网介绍页: https://www.feaser.com/openblt/doku.php?id=homepage 源码下载页: https://sourceforge.net/projects/openblt/files/ 关于STM32的IAP、ISP、BootLoader相关的内容见往期笔记: 《STM32串口IAP分享》 《STM32的ISP下载的原理是什么呢?》 OpenBLT实践 下载源码,得到: 我们拿个ARMCM0_STM32G0_Nu
[单片机]
<font color='red'>STM32</font> | OpenBLT Bootloader的使用分享
意法半导体推出新STM32微处理器,让先进物联网设备兼顾性能、功耗和成本
意法半导体推出新STM32微处理器,让先进物联网设备兼顾性能、功耗和成本 STM32MP13 MPU面向传统嵌入式微控制器难以胜任的应用场景 在新的注重成本的单核微处理器内整合更高性能、更多安全功能与更优的能效 2023年3月16日,中国 – 服务多重电子应用领域、全球排名前列的半导体公司意法半导体(STMicroelectronics,简称ST;)推出最新的STM32微处理器(MPU),赋能下一代智能设备,创造更安全、低碳绿色的生活。 节能降耗、降低运营成本、提高安全性、改进用户体验是智能建筑、工厂自动化和智慧城市的主要发展趋势。工业自动化、通信网关、支付终端、家电和控制面板等满足这些需求趋势的最新应用对处理器
[单片机]
意法半导体推出新<font color='red'>STM32</font>微处理器,让先进物联网设备兼顾性能、功耗和成本
大容量串行e-Flash的FPGA配置方案
引 言 现场可编程门阵列FPGA(Field Programmable Gate Array)是一种集通用性强、设计灵活、集成度高和编程方便等诸多优点于一身的现场可编程ASIC。自1985年美国的Xilinx公司推出FPGA产品并取得成功以后,FPGA发展迅猛,门数不断提升,达到数百万门的规模;产品种类日益丰富,性能不断完善,在军事、通信、医疗、消费类电子等各领域发挥了巨大的作用。 Xilinx公司的FPGA具有很高的性价比,其集成开发环境ISE和Webpack效率高、界面友好,因此在业界有着广泛的应用。通常对Xilinx公司的FPGA配置采用专用的配置芯片,速度较快,其价格也正逐步降低。笔者为配合某电力测量仪表的开发,对X
[应用]
STM32 485 调试
1、最近由于项目的需要,搞了下485通信。首先是单片机如何控制485收发数据。发数据就是通过串口发送数据(说白了就是串口发送),但是要注意的是485的控制引脚要拉高设置为发送模式: //通过485发送数据 void RS485_Send_Data(u8 *buf,u8 len) { u8 t; RS485_TX_EN=1; //设置控制引脚,来设置成发送模式 for(t=0;t len;t++) { while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); USART_SendData(USART2,buf ); } while(USART_GetFlagSt
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved