Flash数据读取和保存

  • 实现方法

Flash数据读取和保存的目的是在单片机的程序存储区开辟一块空间专门用来保存系统需要记忆的参数和数据,从而完全取代EEROM,达到降低成本和数据保密的目的。该实现方法主要分为四个部分:

    1. FLASH数据的读取
    2. FLASH数据的设定
    3. FLASH数据的保存
    4. FLASH空间的擦除

其中,数据的读取和保存方法需要根据数据的配置格式来确定,这里我们是这样定义的:

  1. 数据格式的定义
    1. 数据长度:8BIT/16BIT/32BIT
    2. 起始标志:0xAB/其他
    3. 数据长度:8/16/32/64/128/256…
    4. 数据区
    5. 校验码:不同的方法校验码不同

2.举例

    1. 数据长度:8BIT
    2. 起始标志:0xAB
    3. 数据长度:32
    4. 数据区
    5. 校验码:数据和为0Xff
    6. 数据存储表如下:

总共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里开辟一块区域专门用来存放这段代码,还有一种方法是用堆栈来实现,这是最好的方法。因此这里的重点就是:

  1. 数据保存的程序
  2. 将数据保存的程序拷贝到RAM的代码
  3. 擦除FLASH空间的代码
  4. 向FLASH空间写数据的代码
  5. RAM地址的重新分配以及变量的定义
  6. 相关的逻辑
  • 数据的保存逻辑

按照上面的例子,所选取的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”。

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值