如何使用Flash模拟EEPROM

目录

1、FLASH与EEPROM简介

2、FLASH模拟EEPROM原理

2.1、EERPOM数据结构

2.2、EERPOM物理结构


在讲解这篇博文前,首先要明白为什么使用Flash存储来模拟EEPROM?

主要有以下几个原因:

  • 成本效益:许多微控制器(MCU)和系统芯片(SoC)内置有Flash存储,但没有专门的EEPROM。使用已有的Flash存储模拟EEPROM可以减少额外硬件成本。
  • 更大的存储容量:通常,Flash存储提供比EEPROM更大的存储容量。这使得在没有牺牲太多物理空间的情况下可以存储更多数据。
  • 灵活性和可扩展性:通过软件,可以灵活地设计和调整EEPROM模拟的大小和结构,以适应不同的应用需求。这种方法比使用固定大小的物理EEPROM更具可扩展性。
  • 数据持久性:尽管Flash存储的写入次数有限,但它仍然能够提供足够的耐用性来满足大多数应用的需要。通过适当的数据管理和穿戴均衡策略,可以最大限度地延长Flash存储的寿命。
  • 数据保护和安全性:许多现代微控制器提供了Flash存储的安全功能,如写入保护、加密等,这有助于保护存储在Flash中的数据不被未经授权访问。
  • 易于编程和集成:使用Flash存储来模拟EEPROM可以充分利用现有的Flash编程工具和技术,同时也简化了硬件设计。

在使用Arduino开发时,有个内置库可以使用Flash模拟EEPROM,极大的方便了嵌入式数据存储的开发。

如果使用库函数,只是知道调用API,很难理解Flash模拟EEPROM的原理和方法,本篇博文将以AT32F413(flash:256KB)这款MCU为例,详细介绍如何使用Flash模拟EEPROM

1、FLASH与EEPROM简介

FLASH和EEPROM都为非易失性存储器,在断电后数据仍然可以长期保存,这为FLASH模拟 EEPROM提供了条件,FLASH与EEPROM特点对比如下表所示:

FLASH模拟EEPROM优点:  

  • 低成本:可节约一颗EEPROM芯片;  
  • 存储、读取速度快:通讯速度快于使用I2C或者SPI通讯的EEPROM元件;  
  • 抗干扰能力强:由于FLASH在单片机内部,不会存在通讯总线被外部干扰的问题;  
  • 容量可调:可根据实际使用,灵活调整存储空间大小。

2、FLASH模拟EEPROM原理

2.1、EERPOM数据结构

由于FLASH在写入数据前,需要将FLASH数据先擦除为0xFF,而FLASH擦除时通常为扇区擦除,例如AT32F403A的扇区大小为2K字节,这个特性决定了不能简单的将旧数据擦除然后写新数 据,因为这样会导致存储在这个扇区内的其他数据也被擦除,并且也会导致FLASH频繁擦除而降低 其使用寿命。  

所以FLASH模拟EEPROM的思路是:

  • 新数据存储不影响旧数据; 
  • 尽量减少FLASH擦除次数,延长FLASH使用寿命。  

基于以上的考虑,我们设计了以下存储结构:

EERPOM结构  

EEPROM由两个页组成:页0和页1,在使用的时候,1个页处于有效状态,另外一个页处于擦除 状态,读取或者写入数据都在有效状态的页进行。  

数据格式  

存储的数据格式为数据 + 数据地址,地址和数据都是16位方式存储,每一次存储占用32位也就是 4个字节。图中data列为数据,data address列为数据地址,flash address列为数据存储的实际 flash地址偏移量。例如上图中页0的flash address=12处,数据为0x3003,数据地址为0x0002。  

页状态标志  

在第一个数据存储区,存储页状态标志status,页状态标志有3种:  

  • 有效状态:EE_PAGE_VALID,status = 0x0000,读取和写数据在此页进行;  
  • 数据转移状态:EE_PAGE_TRANSFER,status = 0xCCCC,另外一页满了,正在传输有效数 据到本页;  
  • 擦除状态:EE_PAGE_ERASED,status = 0xFFFF。  数据写入  每一次写入数据前,都会从页起始地址开始寻找第一个未存储数据的区域(值为0xFFFFFFFF),然后将待写入的数据和数据地址写到未存储数据的区域。例如上图中页0的flash address = 20处,值 为0xFFFFFFFF,就是第一个未存储数据的区域。  

当知道了页的大小后,就可以算出最大的变量存储个数:页容量/4-1。例如当页大小为1K时,最大 可存储的变量数量为1024/4-1=255。需要注意的是,在实际使用中,应该尽量留出较多的空闲容 量,这样可以减小FLASH擦除次数,提高FLASH寿命。  

另外数据地址不可以超过最大能存储的变量数量,例如当页大小为1K时,最大可存储的变量数量为 1024/4-1=255,那么数据地址data address不可以大于255。

数据读取  

每一次读取数据都会从页结束地址开始向前寻找最后一个存储的有效数据,例如现在要读取地址为 0x0000的数据。从上图中看到flash address = 4和flash address = 16都是地址为0x0000的数 据,因为最后一次存储的数据为flash address = 16处的数据,所以此时读取地址0x0000的数据为 0x1234。  

数据转移  

当一页数据存满了之后,会将数据传输到空闲页,将会执行以下操作(以页0满,页1空为例):  

  • 将页1状态标记为数据传输状态(EE_PAGE_TRANSFER);  
  • 将所有有效数据复制到页1;  
  • 擦除页0;  
  • 将页1状态标记为有效状态(EE_PAGE_VALID)。

EEPROM写入流程如下所示:

2.2、EERPOM物理结构

实现的EEPROM结构如下图所示,一个页可以由1个或者多个扇区组成,可以根据实际应 用灵活的选择扇区数量,扇区数量越多,可以存储的数据量就越多。通常EEPROM存储区定义在整 个FLASH末尾,这样程序的烧录、执行和EEPROM区域互不影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/618858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

统计学-R语言-4.2

文章目录 前言单变量数据的描述分析分类型数据频数表条形图饼图 数值型数据数值型数据数据的集中趋势--均值数据的集中趋势--众数 离散程度离散程度--极差离散程度--四分位数极差离散程度--方差离散程度--加权方差离散程度--标准差离散程度--变异系数 数据的形状数据的形状--偏…

高级分布式系统-第7讲 分布式系统的时钟同步

顺序的分类 在分布式系统中, 顺序关系主要分为以下三类:时间顺序: 事件在时间轴上发生的先后关系。 无限时刻集组成有向时间轴, 时间顺序是通过时刻的顺序体现的。 因果顺序: 如果事件e1是事件e2发生的原因&#xf…

数据分析概述2(详细介绍机器学习

目录 1.名词解释:1.1算法和模型1.2参数和超参数 2.基础算法:3.高级算法:4.数据准备5.常用python包小结: 1.名词解释: 1.1算法和模型 算法:用于训练模型的方法,分为有监督学习、无监督学习、半…

Logstash:迁移数据到 Elasticsearch

在生产环境中,不使用 Apache Kafka 等流平台进行数据迁移并不是一个好的做法。 在这篇文章中,我们将详细探讨 Apache Kafka 和 Logstash 的关系。 但首先让我们简单了解一下 Apache Kafka 的含义。 Apache Kafka 是分布式流平台,擅长实时数据…

anaconda创建虚拟环境启动jupyter notebook

1.进入虚拟环境 (以环境名为py37_pytorch1.9为例) 创建虚拟环境: conda create -n py37_pytorch1.9 python3.7 查看已经创建的虚拟环境: ​​​​​​​conda env list 切换/进入环境: conda activate py37_pytorch1.9 删除环…

C语言宏定义小技巧

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、定义一年多少秒(除闰年)举例运行结果出现的问题原因 二、定义整型数据要避免的坑举例运行结果原因解决方法 三 、未完待续 前言 提…

Fiddler怎么抓请求做接口

第一步:安装fiddler 可以在官网下载最新版本 VIP小伙伴可以在课前准备下载,如果已经安装,请忽略 打开fiddler开始抓取测试对象的请求,以教管系统登录为例 打开fiddler,准备开始抓取,清空会话,开启抓取状态,因为fiddler默认抓取http协议,所以这里不需要设置什么。 打开系统登…

通过 CMake 制作库文件 静态库 和 动态库

hehedalinux:~/Linux/loveDBTeacher-v2$ tree . ├── CMakeLists.txt ├── include │ └── head.h ├── main.c └── src├── add.c├── div.c├── mult.c└── sub.c CMake Calc 项目 在这里有add.c,div.c,mult.c,sub.c,main.c,head.h 二、生成静态库 …

【数据结构】二叉树问题总结

目录 1.二叉树前序遍历,中序遍历和后序的实现 2.层序遍历 3.求二叉树中的节点个数 4.求二叉树中的叶子节点个数 5.求二叉树的高度 6.求二叉树第k层节点个数 7.二叉树查找值为x的节点 8.单值二叉树 9.二叉树最大深度 10.翻转二叉树 11. 检查两颗树是否相同…

NetDevOps:华三交换机通过Netmiko或者Nornir获取接口信息通过TextFSM解析报错问题

python代码:实现功能获取交换机接口信息并通过TextFSM进行解析。 from netmiko import Netmiko import textfsm show_intf_cmd_mapping {hp_comware: display interface, }def ssh_device_2_get_intfs(device_type, host, username, password, port):dev_info {d…

【2023年度回顾】让我们在新的一年继续努力前行

每当我们在努力的时候都会想:为什么我要努力?躺着不舒服吗? 大家好!我是命运之光,一名普普通通的计算机科学与技术专业的大三学生。 📕回顾一下整个2023年 因为我有每天发朋友圈的习惯,所以这一…

chromedriver 114以后版本下载地址

谷歌浏览器版本经常会升级,chromedriver 也得下载匹配的版本 chromedriver 114以前版本下载地址https://registry.npmmirror.com/binary.html?pathchromedriver/ 找到匹配浏览器版本 查看自己浏览器版本号v120.0 v120.0版本chromedriver下载地址https://google…

Ubuntu 22.04 安装prometheus

服务器监控和报警软件有很多,为什么我们会选择Prometheus而不是其他软件呢? 因为它有以下优点: 自带简易web监控页面,用户可以很方便地查看监控数据和使用仪表盘。能实时收集数据并根据自定义警报规则推送告警;具有丰…

Java SPI在数据库驱动、SpringBoot自动装配中的应用

文章目录 1. 初识SPI1.1 SPI的作用1.2 SPI的工作原理1.3 SPI的三个组件:Service、Service Provider、ServiceLoader1.4 SPI使用场景1.5 具体的SPI 源码分析(SPI的核心就是ServiceLoader.load()方法)1.6 SPI 的优缺点 2. API、SPI、JNDI释义3.…

uniapp滑动页面切换和下拉刷新,触底加载更多(swiper + scroll-view)

因为官方文档乱七八糟的,所以自己来总结下 需求: 常见的上方tag标签切换,下方是页面,上面点击切换,下面页面也切换,下方列表有下拉刷新,触底加载更多 因为这两个组件都是固定高度的,…

6.2 声音编辑工具GoldWave5简介(6)

3.选择【选项】|【控制器属性】命名或单击“控制器”面板上的“设置控制器属性”按钮,打开“控制器属性”对话框,将“音量”选项卡中的“麦克风”选项打上勾,使GoldWave只能录制来自麦克风的声音。如果要录制电脑内部的声音&#…

聊天机器人之接收实时信息实现(二)

准备工作 如果没有准备好环境的请看 前期环境准备 这里默认已经注入成功并且已经登录好了账号。 具体实现 实现原理 通过本地搭建一个web服务,来接收一个POST请求,这个请求中就会涵盖实时的数据,包括昵称、消息内容、消息类型之类的。 p…

Head First Design Patterns -工厂模式

什么是工厂模式 工厂方法模式定义了一个创建对象的接口,但由子类来决定要实例化那个类。工厂方法让类把实例化推迟到了子类。 为什么要有工厂模式 书中以pizza店制作pizza为例子,假设不用工厂模式,在制作pizza阶段我们需要这样去实例化类&am…

回声状态网络(Echo State Networks,ESN)详细原理讲解及Python代码实现

回声状态网络(Echo State Networks,ESN)详细讲解及Python代码实现 1 基本概念 回声状态网络是一种循环神经网络。ESN 训练方式与传统 RNN 不同。网络结构如下图: (1)储层(Reservoir)&#x…

vue中使用js-doc

安装依赖 安装vue-template-compiler npm install ​vue-template-compiler​npm install ​vue-template-compiler​ 安装minami npm install minami 安装js-doc npm install js-doc 根目录下创建 .jsdoc.conf.json 内容: {"tags": {"all…