Flash数据读取和保存
- 实现方法
Flash数据读取和保存的目的是在单片机的程序存储区开辟一块空间专门用来保存系统需要记忆的参数和数据,从而完全取代EEROM,达到降低成本和数据保密的目的。该实现方法主要分为四个部分:
- FLASH数据的读取
- FLASH数据的设定
- FLASH数据的保存
- FLASH空间的擦除
其中,数据的读取和保存方法需要根据数据的配置格式来确定,这里我们是这样定义的:
- 数据格式的定义
- 数据长度:8BIT/16BIT/32BIT
- 起始标志:0xAB/其他
- 数据长度:8/16/32/64/128/256…
- 数据区
- 校验码:不同的方法校验码不同
2.举例
- 数据长度:8BIT
- 起始标志:0xAB
- 数据长度:32
- 数据区
- 校验码:数据和为0Xff
- 数据存储表如下:
总共32个bytes,其中0xAB为数据的起始标志,checksum=0xFF-(INT8U)(0xAB+Data0+…Data29)
使用32个bytes,主要是根据flash中页的大小决定的,一般来说,flash中页的大小可以为64bytes/128 bytes/256 bytes/512 bytes/1024 bytes等,是32的整数倍,便于数据的操作
当然数据的格式可以根据系统的需求由程序员自己定义
- FLASH数据的读取
数据的读取程序在系统运行的任何时候都可以执行,只要知道数据在flash的具体地址就行。不会影响可执行代码,程序员可根据系统的实际需要进行设计
- FLASH数据的保存和擦除
数据的保存需要对flash进行擦除和编程,在进行擦除和写数据的时候,系统程序一般是不能正常运行的,因此FLASH数据的保存需要特殊处理,一般情况下是在系统关机的时候进行操作,操作结束后,可以选择关闭系统电源或者系统重新启动。
由于执行flash擦除和编程的时候,是对flash进行操作,中央处理器不能从flash直接运行程序代码,解决这个问题的方法是,将执行flash擦除和编程的这段代码搬运到RAM里面执行,这就好像电脑从硬盘先将软件拷贝到内存,然后在内存里面运行该程序。由于需要将执行flash擦除和编程的这段代码搬运到RAM里面,从而可能破坏RAM的原始数据,这也是该功能尽量在系统关机的时候进行操作的原因之一。当然程序员也可以在RAM里开辟一块区域专门用来存放这段代码,还有一种方法是用堆栈来实现,这是最好的方法。因此这里的重点就是:
- 数据保存的程序
- 将数据保存的程序拷贝到RAM的代码
- 擦除FLASH空间的代码
- 向FLASH空间写数据的代码
- RAM地址的重新分配以及变量的定义
- 相关的逻辑
- 数据的保存逻辑
按照上面的例子,所选取的MCU内部的FLASH的页大小为512Bytes,也就是说擦除一次,可以保存512/32=16次,因此,保存数据之前,要先确定所要保存的数据、保存数据的地址;保存的数据很好确定,只要分配一个32bytes的buffer就好了。要确定保存数据的地址,就要知道已经写了多少bytes的空间,根据数据的格式,采用查询的方法,因为0xAB是起始标志,因此我们只要从该空间的首地址0xXXXX保存的数据开始查询,如果是0xAB,则查询地址0xXXXX+32对应的数据是否是0xAB,依次类推;如果不是0xAB,说明该地址是这次需要保存数据的起始地址。这样就可以编写程序进行数据写入了!
同时,由于在系统初始化的时候,需要把flash的数据取出来使用,我们采用同样的数据判断逻辑,将最后一次保存的数据区域找出来,因此实际上,在系统初始化读取数据的时候,也就确定了下一次保存数据的flash地址,只要把该地址保存好,系统关机的时候,直接根据该地址保存数据就好了。
需要注意的地方是:当flash为空白或者数据已满的情况下,如何读取和判断数据是关键。
- flash擦除和编程
带有flash的单片机,一般都有flash的擦除指令和编程指令,有些甚至提供了功能丰富的擦除代码和编程代码,程序员可以根据单片机厂商提供的芯片资料选择合适的实现方法
FLASH存储器怎样写入数据
FLASH存储器写入数据时,每一位只能由“1”变成“0”,不能由“0”变成“1“,因此,当我们有数据要保存到FLASH存储器时,要先对目标段进行整段擦除操作,擦除操作使的对应段FLASH存储器变成全“1”。
Flash数据读取和保存相关推荐
- pandas 数据读取与保存
pandas 数据读取与保存 一:读取表格数据 例:在一个text.xlsx文件中,有text1,text2,text3三张表格 sheetname 切换sheet表格 可以传入整形,表示从0开始的索 ...
- sparksql 保存点_Spark(十二)【SparkSql中数据读取和保存】
一. 读取和保存说明 SparkSQL提供了通用的保存数据和数据加载的方式,还提供了专用的方式 读取:通用和专用 保存 保存有四种模式: 默认: error : 输出目录存在就报错 append: 向 ...
- TDMS数据 读取/转换/保存 为MATLAB/Python 可读取的通用数据格式的的方法
TDMS格式是NI主推的高速测试测量采集系统中的一种二进制数据存储类型,适合存储海量才几级数据,兼有高速.方便和易存取等多种优点.做过实际测量项目的筒子们在NI的相关平台例如:CompactRIO/L ...
- Spark学习笔记:数据读取和保存
spark所支持的文件格式 1.文本文件 在 Spark 中读写文本文件很容易. 当我们将一个文本文件读取为 RDD 时,输入的每一行 都会成为 RDD 的 一个元素. 也可以将多个完整的文本文件一次 ...
- python 对json数据读取及保存与读取,对dump,dumps,load,loads的理解
一.对json文件的读取 data1={"programmers":[{ "firstName": "Brett", "lastN ...
- CGAL 点云数据读取与保存
文章目录 一.简介 二.XYZ格式 三.LAS格式 四.OFF格式 五.PLY格式 参考资料 一.简介 点云中的点通常以纯文本格式存储(表示为"XYZ"格式),其中每个点由换行符分 ...
- STM32F103基于片内flash的数据读取与音乐播放
目录 一.前言 二.题目要求 三.什么是片内flash 四.闪存的编程和擦除 五.基于flash的数据读取 1.工程创建 2.修改代码 3.烧录 4.调试 六.基于flash的提示音播放 1.生成正弦 ...
- Nand Flash数据存储单元的整体架构
http://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html 简单说就是, ...
- STM32利用flash读取音频数据读取与DAC播放
目录 一.博客内容 二.Flash地址空间的读取 2.1 Flash原理 2.2 软.硬件准备 2.3 利用CubeMX建立工程 2.4 工程代码 2.5 ST-Link的使用 2.6 仿真调试 三 ...
最新文章
- CPU与内存的那些事
- 自定义Annotation
- 类中定义自身类的对象
- python中封装一个枚举_JavaScript可扩展枚举封装
- linux md5sum命令
- Delphi编译后的程序图标无法修改一例
- UVZ转成PDF并添加目录
- dcmtk编译 android,Win10编译Android可用的DCMTK-SO库
- python 高斯过程_【Scikit-Learn 中文文档】高斯过程 - 监督学习 - 用户指南 | ApacheCN...
- DCDC电源负载瞬态响应分析
- 场内场外交易成本_场内基金与场外基金交易手续费是多少?怎么算?
- html 手机语音聊天,好用的手机语音聊天软件推荐
- Kubernetes权威指南(下)
- candidate expects 1 argument, 0 provided 错误解决
- 上海出差之行--领略外滩美景、RT-Thread总部之旅、嵌友面基、返程记录
- 推荐机制 协同过滤和基于内容推荐的区别
- java节假日算法_基于Java代码实现判断春节、端午节、中秋节等法定节假日的方法...
- APA轨迹规划常见算法
- 各家邮箱容量是多少?哪家邮箱容量最大?
- 制作emwin个性化控件