OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 21233|回复: 40

W25Q128频繁存贮数据的问题??坛友,原子哥帮忙啊

[复制链接]

15

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2013-7-12
在线时间
64 小时
发表于 2013-12-10 18:28:59 | 显示全部楼层 |阅读模式
大家好,我现在的项目,使用一片16M 的 SPI Flash W25Q128,来存贮我得到的传感器数据,我每次写16个字节,但现在遇见一个问题,就是一旦掉电,系统重新启动时,我必须要知道已经写到哪个位置了,该从哪里写了..

我是这样想的:
所以我必须建立一个计数变量cnt,来记录写了多少次了,下次就写cnt*16, 这个变量要是存到Flash的一个扇区的一个地址的话,就要擦写16*1024*1024/16 = 1024*1024 = 1048576次,那么Flash这个地址肯定爆了,如果要存到不同的地址,还要开辟一个32位的变量,因为毕竟要存1048576 = 0x100000次,而且每存一次还要写入32位4个字节,那么我存1048576 次,就需要1048576 *4=4194304字节的空间,我汗,1024个扇区啊,严重浪费,并且即使这样的话,开机还要遍历着找这个记录变量,耗费好多时间,不知有什么好办法???


大家有谁做过吗,帮想想办法,呵呵,谢谢了
提供工业物联网整体解决方案!
https://shop469761648.taobao.com/?spm=2013.1.0.0.3e0568ccstLyMK
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2013-6-27
在线时间
0 小时
发表于 2013-12-12 17:05:31 | 显示全部楼层
我想LZ是想做一個類似USB storage的東西.
由於Flash (不管NAND or Nor)寫入都是有Life time的問題.
所以不能對同一個Block頻繁做寫入的動作,必須順序寫入不同的Block,以延長產品的壽命.
所以必須記住現在寫在哪個位置,就算中途斷電,等下次上電的時候繼續在新的位置做寫入動作.
不知這是不是LZ的問題?

*PS:我不知到有效的解決方法,所以對不起LZ了.
回复 支持 1 反对 0

使用道具 举报

4

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2012-6-18
在线时间
0 小时
发表于 2013-12-12 09:13:58 | 显示全部楼层
将要写的地址保存到备份寄存器不就好了
回复 支持 1 反对 0

使用道具 举报

28

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2012-11-28
在线时间
0 小时
发表于 2013-12-10 21:43:33 | 显示全部楼层
回复【楼主位】zxcmcu:
---------------------------------
我没看懂为什么要擦写这么多次,我也用128来存储传感器的数据,直接覆盖就可以了。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2013-12-10 23:07:35 | 显示全部楼层
回复【楼主位】zxcmcu:
---------------------------------
如果不能提前判断断电,用铁电存储器是你的唯一选择。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-12-11 08:42:11 | 显示全部楼层
回复【楼主位】zxcmcu:
---------------------------------
直接覆盖,你是用波动开关来控制MCU电源的?还是通过软件来关机的,如果你是通过MCU检测一个轻触按键关机的话,就可以提前知道关电,可以在这个时候保存数据
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

15

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2013-7-12
在线时间
64 小时
 楼主| 发表于 2013-12-11 12:22:23 | 显示全部楼层
回复【4楼】Badu_Space:
---------------------------------
那么如果是外部突然断电呢?
提供工业物联网整体解决方案!
https://shop469761648.taobao.com/?spm=2013.1.0.0.3e0568ccstLyMK
回复 支持 反对

使用道具 举报

15

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2013-7-12
在线时间
64 小时
 楼主| 发表于 2013-12-11 12:23:40 | 显示全部楼层
回复【2楼】总在怀远:
---------------------------------
系统掉电再上电的话,你不判断将要写的地址吗?
提供工业物联网整体解决方案!
https://shop469761648.taobao.com/?spm=2013.1.0.0.3e0568ccstLyMK
回复 支持 反对

使用道具 举报

15

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2013-7-12
在线时间
64 小时
 楼主| 发表于 2013-12-11 12:24:12 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
铁电 怎么实现?原子哥帮忙
提供工业物联网整体解决方案!
https://shop469761648.taobao.com/?spm=2013.1.0.0.3e0568ccstLyMK
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-12-11 12:28:17 | 显示全部楼层
回复【6楼】zxcmcu:
---------------------------------
你上电不是读取数据么?
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-12-11 12:29:04 | 显示全部楼层
回复【5楼】zxcmcu:
---------------------------------
这个你得考虑了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

28

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2012-11-28
在线时间
0 小时
发表于 2013-12-12 10:38:56 | 显示全部楼层
回复【6楼】zxcmcu:
---------------------------------
我每次把页数写到flash开头地址
回复 支持 反对

使用道具 举报

15

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2013-7-12
在线时间
64 小时
 楼主| 发表于 2013-12-12 10:39:18 | 显示全部楼层
什么时间保存?请说详细点,谢谢
提供工业物联网整体解决方案!
https://shop469761648.taobao.com/?spm=2013.1.0.0.3e0568ccstLyMK
回复 支持 反对

使用道具 举报

15

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2013-7-12
在线时间
64 小时
 楼主| 发表于 2013-12-12 10:41:18 | 显示全部楼层
回复【11楼】总在怀远:
---------------------------------
你每次写多少数据?要是100次就写满了,那倒没问题?
提供工业物联网整体解决方案!
https://shop469761648.taobao.com/?spm=2013.1.0.0.3e0568ccstLyMK
回复 支持 反对

使用道具 举报

4

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2012-6-18
在线时间
0 小时
发表于 2013-12-12 17:32:41 | 显示全部楼层
因为有擦除寿命,避免频繁擦除就可以。
之前做过一个类似的,比如就说这保存16字节,可以在16字节前加上四字节地址。每二十字节为一组数据,每次写数据都带上地址,上电时每隔二十个字节读一下,看看写到哪个位置停止了,下次有数据就在这个位置接着写。
回复 支持 反对

使用道具 举报

8

主题

193

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2012-12-19
在线时间
16 小时
发表于 2013-12-12 21:42:34 | 显示全部楼层
你说的这个问题我也碰到了说一下我的想法吧。
我将第一页单独拿出来,用来存储写的数量,用4个字节存储一个计数器;
在每次上电的时候就读一下第一页里面的内容,后面的数肯定比前面的大,而且不是0x ff ff ff ff 那就是想要的数了。
当第一页写满后在写之前就将第一页整体擦除然后再写。
回复 支持 反对

使用道具 举报

8

主题

193

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2012-12-19
在线时间
16 小时
发表于 2013-12-12 21:44:08 | 显示全部楼层
如果你还可以加存储器的话,可以加个铁电存储器或者是EEPROM,这样就可以把计数器的值保存在一个固定位置了。
回复 支持 反对

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2013-9-29
在线时间
0 小时
发表于 2013-12-14 11:40:59 | 显示全部楼层
这个问题 比较简单啊 你把存入 FLASH里面的地址记录下来就可以了 ,每次保存都把地址保存在固定的位置,要保存时可以先读取一下
回复 支持 反对

使用道具 举报

7

主题

188

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2282
金钱
2282
注册时间
2013-12-16
在线时间
448 小时
发表于 2013-12-16 08:10:05 | 显示全部楼层
其实也不麻烦,你增加一个掉电检测功能,当判断出掉电之后立即将计数器保存到flash中,平时将计数器放在RAM中即可
回复 支持 反对

使用道具 举报

15

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2013-7-12
在线时间
64 小时
 楼主| 发表于 2013-12-17 09:03:19 | 显示全部楼层
回复【19楼】zdfwyh:
---------------------------------
不想更换Flash了,现在硬件电路没有设计掉电检测,所以 只有从软件入手了,要是有掉电检测就好办了,但这次板子已经焊接好了,没做这个电路。。。
提供工业物联网整体解决方案!
https://shop469761648.taobao.com/?spm=2013.1.0.0.3e0568ccstLyMK
回复 支持 反对

使用道具 举报

15

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2013-7-12
在线时间
64 小时
 楼主| 发表于 2013-12-17 09:06:28 | 显示全部楼层
回复【18楼】nilianghua:
---------------------------------
怎么个记录法,我的提问已经写的很清楚饿了,呵呵,这样记录的话,会把Flash的那块地址给写挂的。。
提供工业物联网整体解决方案!
https://shop469761648.taobao.com/?spm=2013.1.0.0.3e0568ccstLyMK
回复 支持 反对

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2013-9-29
在线时间
0 小时
发表于 2014-5-15 17:03:00 | 显示全部楼层
其实 也有一个方法,只要电池有电能供RTC时钟运行的话,你的RTC时钟有RAM区域,可以往那边写入你当前数据的位置,RAM写的话不会被写坏的
回复 支持 反对

使用道具 举报

头像被屏蔽

88

主题

231

帖子

2

精华

高级会员

Rank: 4

积分
844
金钱
844
注册时间
2013-4-11
在线时间
40 小时
发表于 2014-5-15 17:24:30 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

88

主题

231

帖子

2

精华

高级会员

Rank: 4

积分
844
金钱
844
注册时间
2013-4-11
在线时间
40 小时
发表于 2014-5-15 17:27:05 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

40

主题

68

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2014-3-4
在线时间
0 小时
发表于 2014-5-16 02:10:09 | 显示全部楼层
这个简单,用铁电就OK了,100亿次,可以用128年
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2015-6-1
在线时间
10 小时
发表于 2015-8-6 19:15:04 | 显示全部楼层
请教一下论坛里面大神,有什么方法能快速准确定位到spi flash空余空间初始地址呢?
回复 支持 反对

使用道具 举报

10

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2016-5-11
在线时间
16 小时
发表于 2016-11-8 09:54:30 | 显示全部楼层
加个文件系统,然后把每次写过的文件名记录下来不就行了?
回复 支持 反对

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2016-11-8 10:08:46 | 显示全部楼层
我在想一个问题,为什么不可以在成本控制的范围内加一块电池,保证电池的供电可以存储写入的位置~当然做一个标志的数据结构也是可以的,最好同时加入校验~
回复 支持 反对

使用道具 举报

4

主题

290

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1130
金钱
1130
注册时间
2015-8-4
在线时间
107 小时
发表于 2016-11-8 13:49:32 | 显示全部楼层
1.你的电路板加一个大电容,检测到掉电后,立马执行保存操作。
2.将BLOCK0的16个扇区作为固定的系统参数保存区,每次上电都去读这里面的参数,比如你写到了什么地址,写了多少次。每次写完扇区加一,扇区写满后擦除BLOCK0。
活到老,学到老。
回复 支持 反对

使用道具 举报

10

主题

147

帖子

0

精华

高级会员

Rank: 4

积分
602
金钱
602
注册时间
2015-7-11
在线时间
94 小时
发表于 2017-4-23 14:13:25 | 显示全部楼层
收藏学习
回复 支持 反对

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2016-7-1
在线时间
9 小时
发表于 2017-10-26 11:36:58 | 显示全部楼层
我觉得最好的办法:建立一个计数变量cnt,来记录写了多少次了,下次就写cnt*16, 这个变量存到备份域寄存器,因为备份域有电池供电,并且不怕写。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2018-10-19
在线时间
2 小时
发表于 2018-10-23 11:00:03 | 显示全部楼层
楼主,我和你相同的问题啊
回复 支持 反对

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
发表于 2018-10-23 13:11:04 | 显示全部楼层
楼主可以用到STM32的供电监控功能,相当于一个掉电触发中断(PVD),比如说,当你的电压降到3.0V的时候,进入该中断,将你的偏移地址信息写入flash,上电再读取就行了,关于楼上说的BKP寄存器是不行的,BKP寄存器不具有掉电保持功能,只是系统复位数据不会丢失而已,掉电依旧会清零。然后值的注意的就是,用到PVD的话,需要你存储数据的时间小于STM32停止工作的时间,比如3.0V降低到2.0V的时间需要你想办法去延长到你写一个数据到flash的时间,可以外加稍大电容到3.3V和GND上,这些都是我测试过的,完全没问题,我是把当前的RTC时间存入Flash。至于掉电时间可以用示波器测一下。
回复 支持 反对

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
发表于 2018-10-23 13:12:14 | 显示全部楼层
YouMe 发表于 2018-10-23 11:00
楼主,我和你相同的问题啊

看楼下
回复 支持 反对

使用道具 举报

2

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1472
金钱
1472
注册时间
2014-4-8
在线时间
172 小时
发表于 2018-10-23 15:39:13 | 显示全部楼层
本帖最后由 jackielau 于 2018-10-23 15:40 编辑

首先,既然是会出现掉电,那么就要允许丢数据(数量可能不会太多)。
在这个前提下可以,说说我的项目用的方法。
写一个简单的小文件系统,每天保存一个文件。刚开始保存时,写入存储时间等参数(但是不写文件长度),然后不断的写数据,一天结束时,保存文件长度,这样一个文件就是完整的。
如果中间断电了,可以对这个文件进行恢复,补上文件长度(可能会丢失少量的数据,但可以接受)。恢复的方法就是从头看哪里是连续的0xFF,就说明不是又要数据了。
需要注意的是如果数据存在正负,0xFFFF=-1,可能会把-1当成未写入的位置,这就需要通过其他方式回避了
回复 支持 反对

使用道具 举报

2

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1472
金钱
1472
注册时间
2014-4-8
在线时间
172 小时
发表于 2018-10-23 15:43:17 | 显示全部楼层
如果你只是想实现记录cnt,可以参考汽车里程表的方法
回复 支持 反对

使用道具 举报

1

主题

232

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3397
金钱
3397
注册时间
2015-4-19
在线时间
371 小时
发表于 2021-1-5 15:13:20 | 显示全部楼层
楼主的问题解决了没有,我最近尝试在w25q128中每1秒钟存储128字节的数据,前每组数据的前4字节表示当前是第几组128字节数据,断电或复位后需要知道,从上次停下来的地方接着写,写满后从头开始覆盖,尝试好多次总是失败,断电后再开取出来的地址值,和上次停下来的位置,对不上,很是苦恼
回复 支持 反对

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1814
金钱
1814
注册时间
2011-10-9
在线时间
230 小时
发表于 2021-1-5 15:29:39 | 显示全部楼层
我就不明白你们怎么想到用 这个25Q128来存储参数 数据的  。这玩意只适合存放图片 字库之类的。 写入慢 读出快。而且擦除次数很少。
铁电不香么  32K的铁电就几块钱  再不行用个EPROM也行啊   
回复 支持 反对

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2021-1-5 18:14:54 | 显示全部楼层
本帖最后由 edmund1234 于 2021-1-5 18:18 编辑

真佩服楼主的耐心, 你问东边怎么走, 回你的都是问你为啥要去东边呢, 南边不好玩么? 呵呵

一, 了解一下扇区擦除后读出来是什么数值, 它会是0xFF
二, 用两个扇区充当环型缓冲, 当写A扇区到一半时擦除扇区B, 相反, 当写到B扇区扇区到一半时擦除扇区A,
三, 上电后就一组一组读出, 只要前一组数据非0xFF, 而后一组数据全为0xFF, 则前一组数据为最后的一组数据


如果说你需要的保存尽量多的数据, 会有N个扇区, 当写到n扇区的一半时, 就把n+1扇区擦除了
回复 支持 反对

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2021-1-6 19:41:48 | 显示全部楼层
本帖最后由 ufbycd 于 2021-1-6 19:44 编辑

挖坆           
回复 支持 反对

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2021-1-6 19:50:00 | 显示全部楼层
可以尝试检测电源是不是掉电了..掉电时,才在一个固定的位置 写下当前位置..掉电的次数不会超过10万次吧.
还有一个办法 就是上电时,搜索一下开始的位置.应该是一个连续 16 个字节 0XFF的 位置..并且这个地址除以16的余数可以为 0 ..
楼主看可行不?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-15 06:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表