背景

没有电池的嵌入式设备,很容易发生随机掉电。因此要让产品可靠稳定,就必须保证各种场景下的掉电安全。
例如系统更新过程随机掉电,不能导致系统无法启动。例如正常读写flash过程中掉电,最多正在传输的数据丢掉,但不能导致flash其他数据出错,否则轻则丢数据,重则直接变砖无法启动。本文主要分析flash数据出错的情况。

问题:flash掉电数据出错

为什么掉电会导致flash数据出错呢?因为在产品掉电时,对用户来说拔下插头是一瞬间,但对于板子上的各个器件来说,却是存在一个掉电过程,即电压从正常值掉到0的过程,这个不是瞬间的。而掉电时机是随机的无法预测的,也就是开始掉电的时候,主控可能正在读flash,写flash,擦除flash,SPI总线上还有很多波形在欢快地传输着。而各个器件也各自有一个工作电压的范围,因此当电压开始掉落时,各个器件还会继续做自己的事情,直到电压掉到实际工作电压之下,才停止工作。

flash的规格书上会标注工作电压,例如标称3.6V-2.7V,那么在电压从正常的3.3V一路掉到2.7V的过程中,我们可以知道flash都还能正常工作,可以正常接收命令进行读写擦等,但从2.7V再往下掉就开始超出flash正常的工作电压,flash就不保证继续正常工作了。那是不是到了2.7V flash就不工作了呢,抱歉,也不是,flash要到某个更低的电压才会彻底歇菜停止运转,我们假设为2.3V吧。

那么问题来了,电压跌落到2.7V-2.3V之间呢,这个时候flash是怎么样的? 答案是flash是处于不稳定态,可能还在工作,但不保证正常工作。
不保证正常工作的意思是,我也许还能工作,但不保证工作的结果是对的。例如此时收到一条擦除A地址的数据的命令,实际可能把表示A地址的波形解析成B地址,然后就把B地址的数据擦了。或者收到写A地址的命令,却写到了B地址。

解决方式

硬件解法

既然知道flash在掉电时,会存在一段电压区间,工作不稳定。那么硬件解法就是设法避免这种场景。

例如加快掉电速度,那这段危险区间的时间就变短了,出错的概率就降低了。如果能很快把flash的电掉下来,则flash就没有时间可以出错了。

例如设法在电压掉到2.7V之前,先把主控的电断了或者把SPI的通信阻断掉,这样flash就不会收到波形,也就不会解析错了。

硬件上的解决方式,规避方式,降低概率方式应该还是蛮多的,但硬件解法有个问题,就是需要增加成本,这个对于有些追求可靠性的产品来说,可靠稳定最重要,增加点成本问题不大。但对于有些价格敏感竞争激烈的产品来说,就是大问题了。

软件解法

软件上其实没有特别好的解决方式,只能通过降低flash的擦写频率,启用写保护等手段,最终达到把概率降到足够低的目的。

降低flash擦写频率,这个很好理解,写得越多,在掉电时撞上正在操作flash的概率就越大,那么出错的概率就越大。但是否写flash,写多少这个是跟应用相关的。下主面要介绍下nor flash写保护,这个是可以在驱动层面做的。

nor写保护

写保护是nor提供的功能,即可以通过配置一些寄存器,将某些区域保护起来。如果没有解除保护,那对这个区域的写入和擦除,都会被直接忽略掉。

例如在不稳定状态下,写A的命令被理解为写B了,此时如果B是处于写保护区域,那这个命令会被忽略掉,不会造成实质性的破坏性的影响。

BP保护

大多数nor flash支持使用BP位来配置写保护,这种保护的特点是其保护的数据是成片的,一般是从flash头部开始的一片数据,或者从flash尾部开始的一片数据。

例如 winbond的这款flash就标注了

从规格书可很容易看出,保护的范围是BP bit再结合其他的一些bit 一起决定的,可以保护1/2, 3/4, 7/8 等多种范围。
这些bit的位置,设置方式,规格书中都有描述,按照规定在驱动中操作对应的寄存器即可。

不同厂家的保护bit设置都不太一样,涉及到BP bit,SEC bit, CMP bit等,每适配一款新的nor,都得重新查下规格书才行。

特别要注意的是,区分好具体的设置是持久化的还是掉电丢失的,具体的bit是否有OTP的特性,即one time program,只能写入一次,无法逆转。

独立块保护

除了普遍支持的BP写保护,也就是分片保护之外,有些flash还提供了更细粒度的写保护,即独立块保护(individual block protect)。

还是以winbond为例,当WPS(write protect selection) bit被设置,则写保护切换到独立块保护。

在这种模式下,BP的设置就无效了,每次上电默认处于完全写保护的状态。

主控可以针对每个block(64KB)进行独立的解锁和上锁。对于首尾两个block,还可以细致到sector(4KB)进行保护。

两种写保护的比较

相对而言,独立块保护的出错概率肯定是比BP保护的概率低的,因为写入A或擦除A时,必须先对A进行解保护。

对于BP保护来说,为了解开A的写保护,必须解开一片区域。假如A处于flash的中间位置,那么解保护的范围会接近1/2 flash的范围。此时发生解析错误,把A解析成B,那么B落在这片未保护的区域的概率还是比较高的。

对于独立块保护来说,为了解开A的写保护,需要解开的区域仅为1个block甚至1个sector,那么出错后的B刚好落在这个范围的概率自然就大大降低了。

当然,具有独立块保护功能的flash,其成本肯定要高些,售价一般也会高一些吧。

小结

flash掉电会有误擦误写的风险,写保护只是降低误擦误写的概率,并不能完全解决。只要有写入和擦除,就可能会撞上掉电。

硬件解决增加成本,软件使用写保护则只能降低概率。部分flash支持独立块保护机制,理论上出错概率会远小于BP保护机制。

nor flash之写保护相关推荐

  1. MDK KEIL 烧录STM32下载错误:Flash Timeout.Reset the Target and try it again.解决办法(芯片解锁 解除读报护)

    使用keil开发STM32点下载时出现下面的报错: 点确定后: 出现如上情况很可能是该芯片锁死,即设置了读写保护. 解决方法是想办法解锁芯片,可以使用ST-Link配合stlink utility软件 ...

  2. STM32 Flash详解

    本文将根据ST官方Flashprogramming manual,文档编号:PM0059,讲解STM32F207内部Flash编程. 01.概述 这里的flash是指STM32F207内部集成的Fla ...

  3. 【单片机笔记】基于STM32F103C8的 USB 外部flash虚拟U盘

    学习stm32已经很长时间了,但是一直没有过多的学习stm32的USB部分,因为实际工作还是用的比较少.说起USB那就有的说了,因为USB的功能很强大,这里主要重点记录一下STM32的USB部分,这个 ...

  4. CC2530(SPI)驱动FLASH芯片W25Qxx

    由于之前用的存储芯片价格涨得离谱,需要寻找新的存储芯片,综合考虑找到了W25Qxx来测试替代的可行性.不用DMA的具体代码经过测试可用,但DMA收发测试不成功,仍在测试修改阶段. 所用芯片:cc253 ...

  5. STM32CubeMX学习笔记(48)——USB接口使用(MSC基于外部Flash模拟U盘)

    一.USB简介 USB(Universal Serial BUS)通用串行总线,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯.是应用在 PC 领域的接口技术.USB 接口支持设备的即插即用和 ...

  6. C语言获取norflash大小,NOR Flash 编程

    NOR Flash 编程1//************************************************************************************* ...

  7. 2017年5月问题记录与总结——powerpc p1020 spi flash驱动

    1.SPI基础 SPI是串行外围接口的意思,一般用来接一些低速的外围设备,比如eeprom,flash,ad传感器,rtc等.硬件上,SPI有四根线,SDI/SDO/CS/SCLK,具体的协议可以参看 ...

  8. STM32芯片写保护/解除写保护的方法

    一. 写保护 1. 目的   将Flash设置为写保护的目的,是为了防止其他人通过J-Link,ULINK2等仿真器,将Flash中的程序读取出来(设想一下,你辛辛苦苦研发的产品,别人通过仿真器将程序 ...

  9. 学习日记——ESP8266读写外部Flash(2020.5.26)

    一.Falsh布局 ⽬前 ESP8266EX 模组采⽤的 demo Flash 为 SPI Flash,ROM[硬盘,用来存储和保存数据] ⼤⼩:2 MB,封装为SOP8 (208 mil). (SP ...

最新文章

  1. Linux System Programming --Chapter Three
  2. Batch Normalization 与Dropout 的冲突
  3. 代码重构----使用java有限状态机来消除太多的if else判断
  4. 刘邦韩信java_刘邦为啥非要杀韩信,800多年后李世民给出了答案,原来如此
  5. http服务器网站打不开,网站打不开_ostonkin8743的博客__杭州19楼
  6. javascript - dom
  7. C++设计模式-Prototype原型模式
  8. scala 方法重载_Scala中的方法重载
  9. Python操作MSSQL
  10. matlab畸变程度计算,matlab 畸变校正代码
  11. ubuntu 卸载NVIDIA 驱动
  12. xxx.pbtxt标签文件解析(tensorflow modles zoo)
  13. 数据挖掘模型中的IV和WOE详解
  14. 华为钱包扫码云闪付_Huawei Pay开通与使用银联云闪付教程
  15. 极课大数据完成C轮融资,投资方为好未来
  16. uniapp 总结篇 (小程序)
  17. 电脑上怎么查看邮件服务器,教您如何查看电子邮件头 -电脑资料
  18. html水平线段hr标记详解,HTML标记【水平分隔线hr标记的使用】!
  19. java word模版填充_Java 数据填充到word模板中
  20. 打印 上一主题 下一主题 简单讲解UEFI及MBR,及UEFI系统安装引导修复

热门文章

  1. 超长距离超大容量波分传输应用
  2. 芝麻开门c语言答案,《芝麻开门》阅读答案 阅读测试题
  3. 不懂的代码要先背下来吗?
  4. JavaSwing图片绘制,实现简单的图片查看器
  5. 工作日志(2005.03)
  6. 通过一个平面几何题来梳理解题模型
  7. 学习别人身上的优点真的太难了!
  8. 蓝牙音频双剑客(二)--高质量音频分布协议(A2DP) SDP以及cod介绍
  9. AI智能剪辑,仅需2秒一键提取精彩片段
  10. c语言经典100例c13 条件运算符