背景

没有电池的嵌入式设备,很容易发生随机掉电。因此要让产品可靠稳定,就必须保证各种场景下的掉电安全。
例如系统更新过程随机掉电,不能导致系统无法启动。例如正常读写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保护机制。

本文地址:https://www.cnblogs.com/zqb-all/p/12182920.html

nor flash之写保护的更多相关文章

  1. STM32 使用st-link调试遇到写保护 Flash Timeout 问题的解决思路

    本文介绍了如何解决STM32芯片Flash写保护导致无法下载程序,无法在线调试的问题:如果您遇到相同的问题,希望本文可以带来一些帮助: 如果本文帮到了您,请帮忙点个赞

  2. FLASH 存储学习-串行SPI NOR FLASH

    1.1 SST25VF080B简介1.1.1 主要特性 关键点:容量.速度(时钟速度.读写速度).功耗. l 容量:8MBit: l 最高SPI时钟频率:50MHz: l 低功耗模式下电流消耗:5uA ...

  3. FLASH 存储学习-串行SPI nor

    1.1 SST25VF080B简介 1.1.1 主要特性 关键点:容量.速度(时钟速度.读写速度).功耗. 容量:8MBit: 最高SPI时钟频率:50MHz: 低功耗模式下电流消耗:5uA,正常读模 ...

  4. Nor Flash芯片特性分析

    Nor Flash是Intel在1988年推出的非易失闪存芯片,可随机读取,擦写时间长,可以擦写1~100W次,支持XIP(eXecute In Place). 本文以JS28F512M29EWH为例 ...

  5. stm32 flash 存储

    转载自: http://bbs.elecfans.com/jishu_388272_1_1.html 说到STM32的FLSAH,我们的第一反应是用来装程序的,实际上,STM32的片内FLASH不仅用 ...

  6. nor flash之4字节地址模式

    背景 容量低于 16M bytes 的 nor,一般使用 3 字节地址模式,即命令格式是 cmd + addr[2] + addr[1] + addr[0] + ... 使用超过 16M bytes ...

  7. STM32用JLINK 烧写程序时出现NO Cortex-m device found in JTAG chain现象和解决方案

    现象 CPU: STM32107VC 用JLINK 烧写程序时出现NO Cortex-m device found in JTAG chain 如图无法查找到硬件就是CPU 提示1:NO Cortex ...

  8. uboot命令及内核启动参数

        修改:mw [内存地址] [值] [长度] 例如:mw 0x02000000 0 128 表示修改地址为0x02000000~0x02000000+128的内存值为0. 显示:md [内存地址 ...

  9. 转载 uboot 命令

    1.bootm bootm [addr [arg ...]] - boot application image stored in memory passing arguments 'arg ...' ...

随机推荐

  1. NLP --- 条件随机场CRF详解 重点 特征函数 转移矩阵

    上一节我们介绍了CRF的背景,本节开始进入CRF的正式的定义,简单来说条件随机场就是定义在隐马尔科夫过程的无向图模型,外加可观测符号X,这个X是整个可观测向量.而我们前面学习的HMM算法,默认可观测符 ...

  2. js点击按钮为元素随机字体颜色和背景色

    文章地址 https://www.cnblogs.com/sandraryan/ 写两个button和一个div,点击按钮分别改变背景色和前景色(字体颜色).产生的是一个随机颜色. <!DOCT ...

  3. [C++] 烦人的error LNK2019和error LNK2001

    常见原因: 没有正确的设置引用的lib,新手常犯这个错误,这是最容易解决的问题. extern "C"的问题.如果C++写的dll要给C程序用,那么就要注意extern " ...

  4. H3C 单区域OSPF配置示例一(续)

  5. MAMP "403 Forbidden You don't have permission to access / on this server."

    2015年01月22日 17:27:31 阅读数:3488 用MAMP搭建本地服务器的时候,设置好ip和端口等属性之后,浏览器访问,报 403错误: Forbidden You don't have ...

  6. 【js】vue 2.5.1 源码学习 (十) $mount 挂载函数的实现

    大体思路(九) 本节内容: 1. $mount 挂载函数的实现. // 将Vue.prototype.$mount 缓存下来 ==>mountComponet(this,el) { // 组建挂 ...

  7. SpringBoot项目改变图片临时文件的存储路径

    springboot项目,部署到服务器后,运行一段时间后,处理文件上传的接口时,后报异常. Could not parse multipart servlet request; nested exce ...

  8. linux进程简单睡眠

    当一个进程睡眠, 它这样做以期望某些条件在以后会成真. 如我们之前注意到的, 任何睡 眠的进程必须在它再次醒来时检查来确保它在等待的条件真正为真. Linux 内核中睡眠的 最简单方式是一个宏定义, ...

  9. Linux 内核 NuBus 总线

    另一个有趣的, 但是几乎被忘记的, 接口总线是 NuBus. 它被发现于老的 Mac 计算机(那 些有 M68K CPU 家族的). 所有的这个总线是内存映射的(象 M68K 的所有东西), 并且设备 ...

  10. Linux 内核即插即用规范

    一些新 ISA 设备板遵循特殊的设计规范并且需要一个特别的初始化顺序, 对增加接口板 的简单安装和配置的扩展. 这些板的设计规范称为即插即用, 由一个麻烦的规则集组成, 来建立和配置无跳线的 ISA ...