神舟IV板 W25X16 FLASH范例使用


使用该例子做移植时,出现了形形色色的问题,按我最原始的想法,是将W25X16分成几个区域, 如下图:


0x00000 ~ 0x00FFF (4K)  作为头信息,0x01000 ~ 0x01FFF (4K) 作为配置信息,0x02000 ~ 0x03FFFF (256K) 作为保留区域,从0x100000 ~ 0x1FFFFF (1M)作为数据区,以后还可以扩展成其他型号FLASH。


看似简单的问题,其实也确实挺简单,但因为对神舟IV所带的FLASH操作函数不熟悉,导致出现奇怪的问题。

W25X16 分为几个部分,1个块等于64K,包含16个扇区,每个扇区是4K。 一个扇区包含16个页,每个页是256个字节。  有三种擦除方式,第一是整个芯片擦除 (Chip Erase),W25X16差不多需要20几秒。 块擦除神舟库函数没有实现,扇区擦除是毫秒级别。

对于FLASH的操作,最重要的就是先擦除,否则写进去的数据是错误的。测试情况也是如此。

SPI_FLASH_SectorErase  这个函数用于擦除一个扇区(4K),参数我错误的认为是擦除第N个扇区,蹭这样使用 SPI_FLASH_SectorErase(1),这明显是擦除第一个扇区,这还引起了我迷惑了很久的一个问题,为什么每次写入CONF区后,HEADER的数据就不正确了。还出现过写入4K的数据,只有前面一部分是正常的,也是因为擦除的区域错误引起。

主要是它的参数其实还是一个地址。如,要操作CONF区域,就得先使用SPI_FLASH_SectorErase(0x1000),这里使用SPI_FLASH_SectorErase(0x1FFF)也是可以的,只要没有操过扇区的边界。如SPI_FLASH_SectorErase(0x2000)就不行了,很明显已经是擦除第二个扇区了,如果仍然是往0x1000地址区写入数据,读出来的可能就是错误数据。使用SPI_FLASH_BufferWrite函数,对于读取和写入的数据大小,可以比较随意,几个字节也是可以的。但如果是用于做数据存储,跟EEPROM就有很大区别,不能简单的通过移动指针来访问数据,它需要整块整块的来存储。

使用FLASH做数据存储,而且数据量比较大,考虑到FLASH本身擦些次数有限 100000次左右,暂不考虑页擦除方式,采用扇区方式,自然就得至少分配4K的缓冲来作为存储。初步想法是在收到信号后插入到缓冲,在主循环中调用函数监控数据,待到满足4K大小时,就写入到FLASH,这里不能简单这样写入,需要先读出来一次,并检测该扇区是否还存在空闲位置并做相应的处理。还提供一种方式,用于立即写入FLASH,少量数据时也写入到FLASH,这样防止数据因为数量问题丢失。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值