【经验】C8051单片机Flash失效分析

2017-07-27 世强 黑夜的眼睛

最近,有客户反馈在使用Silicon Labs C8051Fxxx单片机过程中,Flash有出现程序丢失或者代码被改写的现象,出现这种情况只能重新下载代码到Flash中,系统才能恢复工作。在这里我们统称为Flash失效,这种情况如果在产品中出现后果很严重。Flash失效有软件操作上的原因,也有可能是硬件的问题。软件操作上的问题比较容易解决,如果硬件上的问题解决起来难度大些。下面就Flash失效的问题进行根因分析以及提出解决办法。


一、软件引起的失效

1、访问包含LockByte页引起的失效

C8051Fxxx系列高保密性体现在,Flash中有LockByte的设置来保护某一页或多页的内容不可被非法访问。当在LockByte中设置其他任一页被保护,那么包含LockByte的这一页默认是被保护的。如果用户代码试图擦除包含LockByte的这一页,可能引起整个Flash空间的代码被擦除。


规避措施:

访问包含LockByte的页时要谨慎,不要在用户代码中试图去擦除包含LockByte的页面。


2、Firmware对Flash写入操作不当引起的失效。

在Firmware中可能会出现对Flash的操作,比如将程序运行过程中得到一些数据写入Flash进行保存。那么这个时候,如果程序处理流程不当可能会引起Flash中的其他代码被改写。


1)当PSWE(Flash写使能位)=1(和PSEE(Flash擦除使能位)=1)时,Firmware用MOVX指令向意料之外的XRAM空间写入了数据,则会造成Flash空间代码被修改或擦除。

2)如果在Flash写入过程中,有中断产生并且中断服务向XRAM空间写入了数据,这时Flash会被错误的修改。

3)当PSWE=1并且Flash写指针处于XRAM空间时,Flash写指针错误的指向则会造成Flash被修改。


规避措施:

1)在设置PSWE=1之前禁止任何中断。

2)当PSWE=1时不要更新Flash写指针或者其他变量。

3)减少PSWE=1和PSWE=0之间的指令数目。

4)将Flash写指针定位在idata或者data空间(不要定义在xdata或者pdata空间,谨慎使用存储器Large模式和Compact模式)。

5)用反汇编窗口观察PSWE=1和PSWE=0之间的指令。

6)在一个程序中只使能一次PSWE和使能一次PSEE(可以设计两个函数,一个用于Flash写,另外一个用于Flash擦除)。


3、PC指针跑飞引起的Flash失效

在某项目中使用C8051F04x中出现这种现象:在做可靠性测试时,MCU内部寄存器被改写,PC指针跑飞。如果这时PSCTL的PSWE位被意外置1,PC又恰好访问到XRAM空间,Flash就会被错误改写或者擦除。


规避措施:

在Flash操作子程序外面设置一个状态变量FlashWriteOK,只有当FlashWriteOK=0xA5时,才允许调用Flash操作子程序,可以在一定程度上避免对Flash的误操作。


4、VDD Monitor处理不当引起的Flash失效

C8051Fxxx单片机内部有VDD监视电路,在Flash写入过程中,如果VDD出现异常(低于2.7V),而这时又没有将VDD异常作为复位源,则Flash操作可能会出现异常而导致失败。


规避措施:

在进行Flash写入之前使能VDD Monitor(有些MCU是通过外部管脚置高,没有硬件使能的MCU可以通过寄存器设置),同时,要将VDD Monitor作为复位源(在RSTSRC中直接将PORSF位置高,注意:对RSTSRC的操作不能用“|”或“&”的方式操作,而应直接写入,比如:RSTSRC=0x02而不要RSTSRC&=0x02)。


5、另外,在调用Flash操作子程序之前加一定的延迟也可以防止Flash误操作。


二、硬件引起的Flash失效

当程序中包含有Flash写入或者擦除操作程序时,电源失效、过慢的VDD爬升时间、时钟线上的毛刺、超高/低温都可能会引起Flash失效。


1、电源失效

电源失效可能会引起Flash失效。


规避措施:

1)使能VDD Monitor,并将VDD Monitor作为复位源。

对于没有MONEN管脚的器件:

在STARTUP.A51中,使能VDDMON和将VDDMON作为复位源;

在执行写或者擦除Flash操作前使能VDDMON和将VDDMON作为复位源。


2)确定在写RSTSRC寄存器时是显示的将PORSF写为“1”。

只用RSTSRC=xx的方式,而不要使用RSTSRC |=xx或者RSTSRC &=xx的方式。


2、时钟毛刺引起的失效

MCU的Flash对时钟毛刺敏感,可能会引起Flash失效。


规避措施:

1)如果系统需要精确度高的时基并且工作在高噪声的环境,时钟源建议使用CMOS时钟而不采用晶体振荡器来减少时钟毛刺。

2)在MCU内部将外接时钟源二分频后作为系统时钟,减少时钟毛刺的影响。

3)外部时钟电路优化:时钟电路尽量靠近MCU时钟管脚;时钟电路被地包围;时钟线尽量短;时钟线上加RC滤波电路。

4)精度允许的情况下尽量采用内部时钟作为系统时钟。

5)如果系统是外接时钟源,在进行Flash操作时切换到内部时钟,操作完毕切换到外部时钟。


3、VDD爬升时间过长引起的Flash失效

如果有MONEN管脚并在硬件上拉高,在VDD上升过程中,MCU会一直处于复位状态。而对于某些器件,VDD Monitor是靠内部寄存器使能的,并在初始化时是Disable状态(如F300,F310,F330等器件),在VDD上升过程中,系统复位是靠外部复位信号起作用。这时,如果VDD上升时间大于外部复位信号有效时间,则系统复位不完全,内部寄存器可能存在不确定状态,系统程序可能会进行错误的Flash操作。


规避措施:

1)检查电源质量,要求VDD上升时间满足芯片规定的值。比如,对于F300、F310和F330等器件,其允许的VDD最大上升时间是1ms。

2)在芯片/RST管脚上接RC上电复位电路:100欧电阻上拉到VDD,0.1uf~1uf电容接到GND;直接将/RST管脚上拉到VDD的做法是不可取的。

3)直接在/RST管脚上接一个电源监视电路:如MAX6464、MAX706等。


以上措施都经过严格反复实验,经过如上措施规避,Flash程序丢失或者改写的现象没有再发生。


相关技术文档:

Silicon Labs 高速、低功耗、超高性价比MCU选型指南 详情>>>


  • +1 赞(0)
  • 收藏

评论

登录   |    立即注册

提交评论

最新评论

  • luose Lv3 . 高级工程师 2017-10-14
    学习学习哈
  • Qin Lv4 . 资深工程师 2017-09-19
    不错的文章
  • Tristan Tsai Lv3 . 高级工程师 2017-07-31
    再看一遍,还是超赞的
  • yxf Lv3 . 高级工程师 2017-07-29
    总结的不错,收藏了
  • Tristan Tsai Lv3 . 高级工程师 2017-07-27
    这个文章很不错,flash问题比较普遍
没有更多评论了

世强元件电商为您提供以下服务:

  • 新元件/新技术/新方案
  • 超十万份权威资料
  • 资深专家在线解答
  • 小量现货快速购买
  • 价格交期实时查询

搞研发 找元件
上世强元件电商

我的资料
我的消息
我的