OpenEdv-开源电子网

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

希望有人能提供一个完整的nand flash的坏块检查,坏块管理的程序!!

[复制链接]

13

主题

76

帖子

0

精华

高级会员

Rank: 4

积分
539
金钱
539
注册时间
2016-4-19
在线时间
139 小时
发表于 2016-5-4 13:56:56 | 显示全部楼层 |阅读模式
20金钱
希望有人能够提供一个基于stm32 nand flash的坏块检查和管理的完整程序。谢谢!

最佳答案

查看完整内容[请看2#楼]

在这里:http://www.openedv.com/thread-78042-1-2.html 下载阿波罗STM32F429开发板的资料,然后看NAND FLASH实验章节,有坏块管理+ecc的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-5-4 13:56:57 | 显示全部楼层
在这里:http://www.openedv.com/thread-78042-1-2.html
下载阿波罗STM32F429开发板的资料,然后看NAND FLASH实验章节,有坏块管理+ecc的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

13

主题

76

帖子

0

精华

高级会员

Rank: 4

积分
539
金钱
539
注册时间
2016-4-19
在线时间
139 小时
 楼主| 发表于 2016-5-4 13:57:43 | 显示全部楼层
恳请各位大神帮忙。
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
12544
金钱
12544
注册时间
2015-11-5
在线时间
2147 小时
发表于 2016-5-4 14:11:57 | 显示全部楼层
参考下uboot
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

13

主题

76

帖子

0

精华

高级会员

Rank: 4

积分
539
金钱
539
注册时间
2016-4-19
在线时间
139 小时
 楼主| 发表于 2016-5-4 14:22:20 | 显示全部楼层

新手一枚,不太了解uboot,我用的三星的K9F1G16U0M这款flsah,
检查坏块:我的方法是去读取每一块的第一页的扩展区的第一个字节,如果不是0xffff,则标记为坏块;
但知道那个块是坏块后不知道怎么去进行替换或者管理。
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13122
金钱
13122
注册时间
2012-11-26
在线时间
3813 小时
发表于 2016-5-4 14:48:32 | 显示全部楼层
arm是用ecc管理的,stm32没整过
回复

使用道具 举报

22

主题

180

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2015-6-29
在线时间
101 小时
发表于 2016-5-4 15:55:54 | 显示全部楼层
在网上看到的一个思路:
(以下文字出自圈圈的BLOG)

    由于NAND FLASH擦除时,只能按按块擦除,因此在写扇区时,首先要擦除一个块。在擦除块前,必须将块内其他数据复制出来,由于一个块比较大(128KB),无法在MCU内开辟如此大的缓冲区。只好借助该NAND FLASH内的页复制命令,将原来的块暂时复制到一个交换用的交换块中。但是如果仅用一个块作为交换的话,它就会被频繁擦写,因而寿命会大大降低。所以在该系统中,保留了10个块用来作为交换区,轮流使用。另外对扇区的连续写进行了优化,当连续写扇区时,就不必每次重复上面的操作,只有当地址跨块时,才需要重新擦除。连续写扇区的实现原理如下:当检测到扇区地址跨块时,就把原来的整块数据复制到交换块中,然后将该块内当前所写地址的前面部分页面复制到原来的块中,接着就从交换块中取出当前扇区地址所在页(使用页复制-随机写入命令),再把一个扇区的数据写入,并接着写入其他扇区,当扇区地址跨页时,就把该页写入到原来的块中,直到扇区被写完(当然如果写的过程中跨块了,还需要重复前面的块擦除以及复制过程)。接着把交换块中剩余的页再复制回原来的块中,这样一个连续写过程就完成了。



    因为NAND FLASH在生产和使用过程中,会产生坏块,所以必须增加坏块管理。在该系统中,保留了50个块用做坏块管理。当上述的擦、写过程中,如果发现坏块,那么就把该块的地址重新影射到一个保留的块中。以后每次对该坏块地址操作时,都被重新定位到新的块地址。使用一个二维数组来保存该影射关系。二维数组的前半部分为坏块地址,后半部分为重新影射过后的块地址。每当发现坏块时,就需要重建这张表(主要是增加新的影射并排序,方便地址重新影射的二分查表法),并将其三份一样的写入到专门为此而保留的三个块中。之所以使用三个备份保存,是考虑到这些数据的重要性,因为一旦这个影射关系被破坏,后果将会是灾难性的。在保存这个表格时,做了特殊处理,首先标志他们准备擦除,然后才依次擦除并写入数据,这样即使在操作过程中突然断电,也至少有两个块的备份数据是可以用的,在系统开机初始化时,可以将这些数据恢复。数据使用了特殊标志(0x0055AAFF)以及累加和校验来判断是否有效。对于新出厂的FALSH,在加载坏块表时,就会校验失败,程序就会假设没有坏块并初始化该数组后保存。每个备用块还由另外一个数组用来标志其状态(未用、已损坏、已用等)。当需要使用新的备用块时,就从该数组中查找未用的,并标志为已用。如果备用块本身是坏的,那么就标志它已损坏。该数组与坏块重影射表一并保存。此外还保存了当前坏块的数量。



    地址的重新影射过程:当对一个地址进行读写操作时,首先要对其进行重影射。首先判断是否有坏块,当坏块数量为0时,就直接返回原来的地址即可。当坏块数量不为0时,先判断最后一次访问和本次访问的地址是否属于同一页,如果属于,那么就直接影射到上一次影射过的块地址。如果不属于,那么就需要去查坏块影射表了。如果只有一个坏块,只要直接比较即可,不用查表。如果坏块数量大于2,那么就需要查表。由于表中地址是按从小到大的顺序排列的,所以可以先和第一个和最后一个判断,如果不在该范围内,那么也不用重新影射,返回原来的地址即可。如果在该范围内,就使用二

分查表法查表,搜索它是否在坏块表中。如果是的话,就重新影射地址,并将这个地址保存,以备下一次重影射时地址未跨块直接使用。最大支持50个坏块,在最坏的情况下,该二分查表法需要判断6次。
我是菜鸟
回复

使用道具 举报

13

主题

76

帖子

0

精华

高级会员

Rank: 4

积分
539
金钱
539
注册时间
2016-4-19
在线时间
139 小时
 楼主| 发表于 2016-5-5 16:12:30 | 显示全部楼层
负西弱 发表于 2016-5-4 15:55
在网上看到的一个思路:
(以下文字出自圈圈的BLOG)

能不能提供一个源码参考一下,谢谢!
回复

使用道具 举报

22

主题

180

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2015-6-29
在线时间
101 小时
发表于 2016-5-5 16:59:37 | 显示全部楼层
wanghy 发表于 2016-5-5 16:12
能不能提供一个源码参考一下,谢谢!

没有源码,我没做过这个,只是看到了这个思路
我是菜鸟
回复

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1814
金钱
1814
注册时间
2011-10-9
在线时间
230 小时
发表于 2016-5-5 17:47:22 | 显示全部楼层
比较简单的方法

板子出厂前 先扫描一次  也就是擦除  然后写入0xaa 然后再读回来

把校验不对的 块号 记录下来

然后做个对应查表就是了  这个最简单的方法
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2016-5-5
在线时间
2 小时
发表于 2016-5-5 18:22:19 | 显示全部楼层
https://github.com/Reggi3/210-nand-patch
看下这个,也是三星的flash。如果还不行。。我觉着应该可以行的。
回复

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2250
金钱
2250
注册时间
2010-12-16
在线时间
203 小时
发表于 2016-5-5 21:14:59 | 显示全部楼层
挂 YAFFS 罗 , 你要的都有了 .
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复

使用道具 举报

13

主题

76

帖子

0

精华

高级会员

Rank: 4

积分
539
金钱
539
注册时间
2016-4-19
在线时间
139 小时
 楼主| 发表于 2016-5-6 11:20:27 | 显示全部楼层
simms01 发表于 2016-5-5 17:47
比较简单的方法

板子出厂前 先扫描一次  也就是擦除  然后写入0xaa 然后再读回来

我觉得你这个方法来处理出厂时存在的坏块还行,如果在以后的擦除或者写的过程中出现坏块,该怎么管理呢?
回复

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1814
金钱
1814
注册时间
2011-10-9
在线时间
230 小时
发表于 2016-7-6 16:20:04 | 显示全部楼层
wanghy 发表于 2016-5-6 11:20
我觉得你这个方法来处理出厂时存在的坏块还行,如果在以后的擦除或者写的过程中出现坏块,该怎么管理呢?

一般来说 如果不是擦除非常频繁 出现新坏块的几率不大 当然 如果经常擦除的话 就要动态验证了
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-7-6 16:40:22 | 显示全部楼层
以前都是用ecc检验。有坏块自动屏蔽。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 06:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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