资料源码:https://gitee.com/yang456/OpenProgrammingModuleForMCU.git

点击加入群聊【单片机,物联网,上位机】:

说明1:知识从未如此性感。 烂程序员关心的是代码,好程序员关心的是数据结构和它们之间的关系!

说明2:学的是思想,而非程序!此代码思路适用于所有的单片机。

说明3:学会以后,下面的代码可能会跟你一辈子!

说明4:这一系列文章是为大幅度裁剪本人博客文章!使博客文章更有条理。便于推其它教程!

说明

此套方案是刚刚给别人做的项目的一个存储方案,因为很实用,几乎大家都用的到,所以分享给大家使用!

制作原因:

我项目上使用的STM32的Flash存储的数据,STM32的Flash可以反复擦写1万次左右,

由于项目上需要反复的操作Flash,一个小时就需要操作一次,如果每次都擦写,

这样算下来一年就擦写了 8760次,也就可以用 10000/8760 = 1.1年左右就坏掉了.

解决方案思想

1.首先大家需要知道,凡是数据是0xFF的地址,不需要再次擦除就可以写入.

假设一页1024字节,先全部擦除了

由于上面说的特性,可以这样做,

第一次写一个数据到Flash的0地址

第二次写一个数据到Flash的1地址

第三次写一个数据到Flash的2地址

每次写的时候就不需要擦除!

2.其实如果想真正的应用其实是下面这样子

准备好几页Flash,准备一个固定大小的数组,把数据放到数组里面

然后把数组里面的数据拷贝进第一页的最前面,然后再更新数组里面的数据

再把数组的数据拷贝到第一页后面没有使用的地方,然后就是循环

如果第一页不能拷贝了,就把数据拷贝到第二页,然后擦除第一页

如果第二页不能使用了,就把数据拷贝到第三页,然后擦除第二页

如果第三页不能使用了,就把数据拷贝到第四页,然后擦除第三页

如果第四页不能使用了,就把数据拷贝到第一页,然后擦除第四页

然后就是循环

假设数组是20个数据,Flash的每一页最大存储是510个数据

那么每页Flash擦除一次以后可以使用 510/20 = 25次

如果Flash的擦写次数是10000次,那么当前的方式可以使用

25*4*10000 = 100万次

当然如果还嫌小,可以多加几页,如果用10页

25*10*10000 = 250万次

也可以减小数组大小,如果只存2个数据

510/2*4*10000 = 1020万次

源码使用

1.需要这两个文件

用户把以下两个文件移植到自己的工程即可使用!

2.存储数据

1.请用户自行修改Flash的大小和存储数据的页地址

2.默认最大存储20个数据(u16型),第一个和最后一个不可用,最大存储18个数据

请用户根据自己的需求修改!

3.把数据存储到Flash

4.关于存储的数据

用户把数据放到了数组  flash_helper_struct.FlashHelperData[XXX]  里面, XXX范围1-18.

然后调用一下刷新函数,数组里面的数据就存储到了flash里面;

用户获取先前存入的数据实际上只需要从 flash_helper_struct.FlashHelperData[XXX]  数组里面获取.

因为数据就是缓存在数组里面的.

如果用户需要知道Flash是不是存储成功了,用户需要在调用完刷新以后紧接着调用

FlashHelperGetIndex(XXX);//XXX是索引,要和上面数组的下标保持一致.

3.设备重启以后获取先前存入的数据

1.在初始化存储函数后面直接用索引获取即可!

简要概括

1.实际上存数据就是把数据写到

flash_helper_struct.FlashHelperData 数组

然后调用  FlashHelperUpdate();函数刷新一下即可!

注意:

flash_helper_struct.FlashHelperData[0] //第一位

和 flash_helper_struct.FlashHelperData[19]  //最后一位

我作为了数据开头和结尾标识,用户不能使用

用户可以用 FlashHelperGetIndex函数获取刚刚写入的数据

用来判断是不是写入成功.

如果写入不成功可以再次调用 FlashHelperUpdate();函数

然后再调用 FlashHelperGetIndex函数获取刚刚写入的数据

扩展(掉电存储)

代码是先写入再判断擦除,一是保证确实写进去,二是为了下面的问题.

假设写入数据的时候突然断电了

用户可以在断电中断函数里面重新设置一下数组的值

然后调用一下刷新函数!

注意:单片机的vbt引脚需要接备用电池!

测试程序是在掉电瞬间把数组FlashHelperData[1]的值改为30后存储到flash

用户可以测试一下给单片机断电上电,然后看下存储的数据.

源码执行效率

1.好的代码,一是稳定性,二是执行效率

其实操作Flash要想执行效率高,就不要频繁的擦除!

当前程序是存储25次数据,擦除一次Flash.

结语

该缓存适合经常操作数据的场合,

不经常操作的数据请用户存到别的地方!!!

不要把所有的数据都用这个方案缓存,因为没有意义!

17-1-数据处理思想和程序架构: 单片机stm32的flash保存数据优化方案(让擦写次数达到上百万至上千万次)相关推荐

  1. STM32 烧录程序后无法在内部FLASH保存数据问题解决

    STM32 烧录程序后无法在内部FLASH保存数据问题解决 新接手一套代码,要求在Flash特定区域保存数据.硬件为STM32F030C6,有32k Flash. 原代码中已经将数据打包成一个结构体, ...

  2. 【小程序】实现页面跳转和数据传递方案

    文章目录 页面跳转和数据传递 wx的API跳转 navigator组件(了解) 页面跳转和数据传递 界面的跳转有两种方式:通过navigator组件 和 通过wx的API跳转 这里我们先以wx的API ...

  3. 04-1-数据处理思想和程序架构: 关于环形队列

    资料源码:https://gitee.com/yang456/OpenProgrammingModuleForMCU.git 点击加入群聊[单片机,物联网,上位机]: 说明1:知识从未如此性感. 烂程 ...

  4. 51单片机按键计数器程序_51单片机是如何存储程序和数据的

    在学校很少用到外扩ROM/RAM的情况,都是用C语言编程,不差空间,代码太大了,买个大ROM的芯片就行了.现在工作了,单位是做SoC的,采用了51的IP核,才算对51的代码/数据空间有了清晰的认识. ...

  5. 程序架构探讨—001 多段select语句的方案

    有时候,我们需要做多条件查询,多个条件为"或"的关系,分类查询等,一般会用到多段select语句,然后用union或者union all进行连接,进而查出需要的结果. 例如, se ...

  6. tinyFlash:一种超轻量级的嵌入式单片机flash KV 数据存储方案

    tinyFlash 一种超轻量级的flash KV数据存储方案 Github 地址:https://github.com/ospanic/tinyFlash 设计原理 本方案采用两个扇区轮流使用的方法 ...

  7. 51单片机雾化片自动扫频程序_单片机简介

    单片机简介 数字电路简介 在一个控制系统中, 单片机是电路的一部分, 单片机中的程序是针对其所在的电路编写 的.因此,要对单片机编程并实现一定的功能,必须了解整个系统的电路图.单片机编程是 针对某个特 ...

  8. 利用4位led显示本机秒表时间的单片机c语言程序,基于单片机的一个2位的led数码显示作为_秒表_设计.doc...

    基于单片机的一个2位的led数码显示作为_秒表_设计 PAGE 1 PAGE 29 工程技术学院 课程设计 题 目:用单片机AT89C51设计一个2位的LED数码显示作为"秒表" ...

  9. [硬件]单片机小制作----Flash存储图片句子,彩屏显示

    前言:这么多天在家做了一个小玩意,里面存储了几十张我和对象的照片,还存了将近五十多句话,有一个"每日一乐"模式,就是随机显示一张照片,然后再随机显示一句情话,(女票总让我说句好听的 ...

最新文章

  1. 专访郭霖:成长无止境
  2. orcal 数据库 maven架构 ssh框架 的全xml环境模版 及常见异常解决
  3. clientdataset 过滤 in_天心大风量亚高效过滤器
  4. Dubbo服务引用原理
  5. 使用pandas时遇到ValueError: numpy.dtype has the wrong size, try recompiling
  6. 探讨【IGE】的源代码【三】。
  7. 如何做一场B格满满的技术大会演讲
  8. C语言-函数(一):函数的定义和调用
  9. BZOJ1050 旅行comf(kruskal)
  10. 将整型数字转化成大写格式
  11. android查询火车票接口,火车票查询信息接口
  12. 【大数据AI人工智能】图数据库的发展脉络与技术演进
  13. python写cdr插件_(如何(用Python)写一个(Lisp)解释器(下))
  14. wireshark过滤器
  15. [ Bootstrap ] 可视化布局
  16. Matlab三维折线图绘制–surf 函数的使用
  17. windows7性能优化
  18. php 支付打印发票,支付后开电子发票
  19. 工作为了生活,却远远不止于生活
  20. 求解数独的所有解法,java编程实现

热门文章

  1. 服务器系统壁纸,云服务器壁纸
  2. nn.KLDivLoss
  3. 织梦dedecms 采集笔记
  4. Django:将项目移动到新环境
  5. 三国志战略版:Daniel_S8军争地利_刘张开荒实录三-至开七
  6. 精品英文字体:20款免费的的圣诞节艺术字体
  7. 隐秘而伟大,探访鹏博士大数据双十一背后那些真英雄
  8. 手机软件升级文件如何恢复
  9. TensorRT 推理时提示This container was built for NVIDIA Driver Release 470.42 or later 解决方法
  10. 阿里云“无影”云电脑,究竟是不是桌面云?!