2007年12月专题讨论----单片机程序丢失的原因与抑制方法
现象:单片机不工作或者出现混乱的工作,重新烧写程序就恢复正常。
从表面上看是程序丢失,重新烧写程序就可以恢复。 从更深的层次看,是什么原因造成程序丢失?如何抑制?请大家把自己遇到的现象和经验都拿出来交流一下。
1楼:程序丢失最有可能发生在上电和掉电的时候。那时候电源不足,单片机最容易出现混乱。
2楼:有IAP功能的单片机容易出现这种现象。一般是程序的问题,我公司用C8051的有的工程师也有这种情况,而且他们并没有把FLASH当EE用,而我的程序从来没有出现过这种情况,而且我有用FLASH当EE用,应该还是程序问题。
3楼:问题很好,但是环境影响因素太多,很难找出毛病啊,大部分是上电瞬间,或者是由于智能电闸的开关原理(反复尝试短路与否)导致的吧,也是我们目前遇到的问题,用的是C8051系列的单片机。
4楼:几乎常见的单片机都有这样的问题。 并不是某种单片机的问题。也不是所有的情况都出问题,只有在产量很大或者在工作环境恶劣才出。但是如果是无人值守的重要设备就要小心了。我的分析:
1、上电下电的时候,电源不稳时。有可能产生问题。
2、带有ISP、BOOT等自编程接口容易出问题。
3、软件中有写FLASH的程序,容易出问题。
这是我的个人分析,请各位大侠指点,并从软件和硬件两个方面谈谈解决经验。
5楼:软件中有写FLASH是很不安全的 写的时候突然掉电. FLASH当EE用的单片机不敢用,干吗不弄个真EE呢? 程序中不要随意写flash 我一般是在关机前写一次,开机后读一次。
6楼:如果写入数据不可丢失,才需要后备电源 但这种要求不多。 一般的数据和参数,只要增加完整性检查就可以了。如果是软件升级时掉电,用更底层的方法,或者双版本备份。
7楼:主要是单片机设计上的问题 越是新出的单片机,越是安全,不容易出错,就说明了这一点 。
8楼:个人觉得这种现象不代表一般性 程序丢失这种现象是不是所有带程序存储器的微控制的通病? 若只是个别厂家的问题,那就是设计的问题。
9楼:我觉得程序丢失和低电压工作有很大关系。
10楼:Flash的位翻转可能也是造成程序不能运行的原因。还有我遇到过产品去做静电实验,回来发现Flash中存储的参数都被清空的现象。
11楼:C8051F120在65-70环境下面,丢失程序的概率35%,并且都是都是flash里面的第一个字节变为0x00 这个问题很是奇怪。。。。。复位电路加了,电压监控也加了,单片机根本就没有写FLASH的代码,但是它还是会出现这样的问题,有遇到过这样问题的吗???
48楼: 我仔细研究过这个问题 我发现Flash/EEP存储器的本质机理其实是一个电容储存电荷(在MOS的浮栅中).其实从原理上说这种结构不是可靠的.
1.如果外电场很强,强于浮栅电容的场强,数据就错了.
2.如果存储的时候,给Flash充电时间不够,保存期并不长.这是最常见的问题,我遇到过多次.我用430单片机,如果Flash时钟配置的太快,导致充电时间不够,可能在数分钟到数月之内丢失Flash数据(发现这个问题是TI的Flash代码范例有误!!它忘了判忙延迟等待,造成Flash充电时序严重不够,当时是没问题的,一个月之内100%丢失!).由此推论,某些标称高速的Flsah烧写设备,要慎用,因为他很可能卡在或少于芯片标称极限时间,造成数据保持时间到达不了手册给出的10-100年
3.Flash供电电压不足经常造成数据不可靠.例如430单片机标称工作电压1.8-3.7,但Flash写入必须2.7V以上.我试验过2.3V仍能写入,但电压越低,数据越维持时间越短.2V以下断电重起两三次就没了. 所以,需要可靠的场合尽量低速写入(Flsah写入时序中,电荷注入时间那一段加长,并不一定是编成设备的接口速度),把工作加到芯片上限 (一搬5V芯片用5.5V,3V芯片到3.6V),能明显提高数据可靠性.
50楼: 48楼的发言真是知音啊…… ~~,基本上讲到正题上了啊…… 严重赞同啊…… 还有一个问题就是厂家的FLASH工艺不过关,电荷自漏的速度太快,就如同家的自来水龙头卡不死老是在那‘跑、冒、滴’……, 你想这样的FLASH能长时间工作吗? 还有一些FLASH的温度特性不好,在常温下自漏的速度还是比较慢的,但温度高了,自漏的速度大大加快,可能是厂家测试不完整,只做了常规温度测试,没做极限温度测试的原因,所以,有很多FLASH在高温环境下里面的内容丢失了. ::以上内容仅代表本人个人观点,是否不妥,请自行判断予以采纳……
C8051Fxxx单片机程序丢失问题的出现和原因2008-10-31 17:051 C8051Fxxx单片机简单介绍和Flash结构
C8051Fxxx系列器件是Silicon Labs推出的一个高速单片机系列。这款单片机是完全集成的混合信号片上系统型MCU 芯片,具有高速、流水线结构的8051 兼容的CIP51内核;70%的指令的执行时间为1个或2个系统时钟周期;片上有丰富的片内外设,根据型号的不同,包括ADC、DAC、UART、捕捉/比较模块的可编程计数器/定时器阵列、SPI、SMBus等。
C8051Fxxx单片机有大容量的Flash存储器,用于程序代码和非易失性数据存储,可在系统编程。Flash的结构是以扇区为单位组织的(128 KB系列以1 024字节为1个扇区,64 KB系列以512字节为1个扇区)。非易失性Flash可以用来存储系统的参数,如软件版本、生产日期等。Flash可以使用编程器擦写,也可以在程序中使用MOVX指令来修改,从而使Flash 存储器具有在系统重新编程能力,允许现场更新8051 固件程序。Flash的写和擦除操作由硬件自动定时,以保证操作正确通过。C8051Fxxx的Flash保存下载的程序,在系统上电后,单片机从Flash读出代码数据到RAM,之后程序开始运行。
2 程序丢失问题的出现和原因
在一些实际应用中,系统重新上电后会出现程序不能正常运行的问题,常表现为“程序丢失”。通常是由于程序代码被损坏或被修改造成的。
造成程序丢失问题的原因很多,可以归结到一个基本原因,即对Flash的访问失败而造成Flash保存的代码出现错误。对于所有包含有Flash写/擦除子程序的系统,当CPU工作在规定的VDD、温度、系统时钟频率范围之外时,对Flash进行写/擦除操作,都有可能出现Flash数据错误的现象。
2.1 Flash数据错误的硬件原因
C8051Fxxx单片机的Flash操作由硬件控制,所以硬件上的不稳定可能造成Flash操作错误。硬件原因主要是能影响CPU正常运行的因素,以及能影响Flash操作环境的因素。这些因素包括操作电压、温度以及外部干扰脉冲等,具体如下:
① 能影响CPU运行可靠性的参数有系统时钟源。如果系统时钟由外部晶振提供,外部的电磁干扰引起尖脉冲,并耦合到系统时钟上,则会导致不可预知的操作。
② 系统在单片机的工作电压没有稳定(VDD上升时间低于规定的1 ms)时就已经完成复位,由于系统复位时需要从Flash读出代码数据,Flash电压不稳定会出现不可预测的错误。
③ 在对Flash的操作过程中,如果温度、电压不稳定,也可能造成Flash数据错误。
2.2 Flash数据错误的软件原因
代码设计的缺陷是程序丢失的主要原因,因为单片机的Flash是由硬件来控制的,不能由软件来控制操作的细节,所以程序的不完善可能造成Flash的访问出错,从而使Flash数据出现错误。 这些操作包括: 在PSWE位(PSCTL.0)置1时CPU执行中断服务程序中的MOVX写操作,该中断服务程序要使用xdata 或pdata 的易失性存储区单元,这样可能导致向xdata 或pdata存储区写的数据写到Flash中了,从而出现问题。另外,如果使用外部晶振作系统时钟,在时钟没有稳定时就对Flash进行写操作,也可能造成程序丢失。
3 程序丢失问题的解决方法
针对以上可能的原因,可以从软硬件两个方面来解决程序丢失问题。在硬件方面,主要是给系统提供稳定的工作环境,并避免外部干扰对CPU运行环境的影响;在软件方面,主要是规范对Flash的操作。
3.1 从硬件方面预防程序丢失
注意,以下的方法不是对所有的器件都适用,要根据具体的硬件情况选择相应的方法:
① 在RST引脚安装VDD监测电路,并将VDD监视设置为一个复位源(置RSTSRC.1为1)。这样如果系统电压不稳定,系统将自动复位,从而避免在电压不稳时访问Flash。
② 对外部晶振时钟2分频,更好的方法是使用内部振荡器,这样能提高系统时钟的抗干扰能力。
③ 如果使用外部晶振提供系统时钟,信号线应尽量靠近单片机的输入端,同时晶振外壳接地。
④ 对于使用外部晶振作时钟源的系统,应尽量增强晶振的驱动能力,这样也能在一定程度上预防程序丢失。
3.2 从软件方面预防程序丢失
程序丢失的主要原因是程序设计的缺陷,所以合理的程序代码设计能极大地预防该问题的出现。在代码中可以用多种方法来预防Flash数据丢失:
① 在PSWE=1下禁止中断,使得程序中的MOVX写指令是对Flash而不是对XRAM。
② 在PSWE=1下尽可能少地访问变量。在PSWE=0下执行地址译码操作,并用间接寻址方式执行MOVX写操作。例如,向Flash写多个字节,间接寻址和写PSWE过程如下:
unsigned ch ar xdata * idata pwrite;//使用idata指针指向Flash
unsigned ch ar *source;
unsigned ch ar mydata;
for (addr = 0; addr <100; addr++) {
//PSWE =0时获取要写入的数据
mydata = *source++;
//PSWE =0时修改写入数据的目标地址
pwrite = (unsigned ch ar xdata *) addr;
PSCTL = 0x01;//PSWE=1
//赋值方式写入数据,此时不执行目标地址的修改操作
*pwrite = mydata;
PSCTL = 0x00;//PSWE=0
}
以上代码中,当PSWE = 1时只执行写Flash操作(*pwrite = mydata);其他操作,如修改addr的值、获取源数据和目的地址,都是在PSWE = 0时执行的。
③ 将Flash写/擦除指针指向data或idata区。
④ 减少将PSWE置1的指令操作。理想的情况是只有两个操作将PSWE置1,即写1个Flash字节和擦除1个Flash字节。
⑤ 在Flash写/擦除函数中,使能VDD监视并设置复位源。使能和设置操作必须在实际的写操作发生之前,置PSWE=1之后完成。
⑥ 代码中所有的对RSTSRC的写操作均用直接赋值方式完成(如RSTSRC = 0x02),不能用读/写指令(如ORL或ANL)来完成。例如,代码“RSTSRC |= 0x02”是非法的。
⑦ 对于能用PORSF位来设置VDD为复位源的器件,保证在写RSTSRC时置PORSF=1,即先使能VDD为复位源,再使能其他复位源的操作,如时钟丢失监测(missing clock detector)、比较单元和软件复位。
4 一个实际应用方案
在有的应用场合,由于需要较快的执行速度,不能使用单片机的内部时钟作系统时钟源,所以使用外部晶振来提供时钟。在这种情况下,首先要在硬件上确保系统工作参数正常。
在软件上,由于最常见的Flash丢失原因是程序问题,所以可以在代码中用多种方法来预防Flash数据丢失。首先,在初始化单片机时,使能VDD检测,并设置VDD和时钟丢失为复位源。如果程序中有写/擦除Flash的代码,则在写/擦除操作前切换系统时钟,将系统时钟切到内部时钟或对外部时钟2分频;写/擦除操作完成之后,再恢复系统时钟,通过增加Flash修改操作时的时间开销来实现系统的稳定[2]。以下以C8051F126为例,给出了系统时钟切换的程序清单:
void SYSCLKAdjust(unsigned ch ar select) {
EA_Save=EA;
SFRPAGE=0x0f;
switch(select) {
case 0x01:
OSCICN_Save = OSCICN;
CLKSEL_Save = CLKSEL;
OSCICN = 0xc3;//内部时钟,不分频
CLKSEL = 0x00;
break;
case 0x02:
OSCXCN_Save = OSCXCN;
OSCXCN |= 0x70;//外部时钟2分频
break;
default://选择内部时钟
OSCICN_Save = OSCICN;
CLKSEL_Save = CLKSEL;
OSCICN = 0xc3;
CLKSEL = 0x00;
break;
}
}
要恢复系统时钟到Flash操作前的状态,只需将CLKSEL_Save、OSCICN_Save、OSCXCN_Save重新写回到CLKSEL、OSCIN、OSCXCN。
C8051F126的系统时钟(SYSCLK)可以在内部时钟和外部时钟之间自由切换,切换时的操作要求如下:
① 在切换过程中,先设置所选时钟的属性,再用CLKSEL将其设置为SYSCLK。
② 在还原过程中,先用CLKSEL选择时钟源,再设置其属性。
③ 如果切换过程中关闭外部晶振,要再恢复外部时钟,启动后至少要等1 ms,再去读XTLVLD(OSCXCN.7)来判断晶振时钟是否稳定。否则,可能读到错误值。
④ 在外部时钟稳定运行后,再对其分频,不必插入等待周期。
⑤ 在切换过程中,可以保持外部时钟继续运行,这样在还原过程中就不必等待外部时钟稳定,从而节省时间开销,代价是系统功耗有所增加。
5 总结
程序丢失会带来各种不良的后果,最严重时致使程序无法正常运行,从而造成整个系统崩溃,给产品的应用带来麻烦。在系统的硬件设计和代码编写过程中,通过对以上问题的注意,可以有效地防止程序丢失问题的出现。另外,由于系统时钟的切换只发生在Flash的写/擦除过程中,操作结束后又恢复成原来的设置,因而对系统运行速度的影响很小,从而保证了系统其他功能的实现。
浅谈Silabs 的Flash 单片机丢失程序的原因及对策
世强电讯肖建云
引言
在8 位MCU 市场,尽管OTP MCU 以其低廉的价格成为市场的主流,但其存在致命的弱点
— — 只能一次编程,这使得研发工程师承担了太多的研发风险,一旦程序有缺陷,就无法补救,生产
出来的产品只能报废。另外,市场瞬息万变,要求产品也能跟上市场的变化步伐,不断地推陈出新,
迎合市场的需求。对产品进行软件升级,根据市场需求增加新的产品特性,从而延长产品的使用寿命,
就显得很重要了。很显然OTP MCU 无法胜任这类产品的要求。目前,随着价格日渐接近OTP MCU
产品,Flash MCU 以其上万次的擦写能力,和强大的在线升级功能,越来越受到众多研发工程师的青
睐,逐渐取代OTPMCU 成为8 位MCU 市场的主流。
在目前种类繁多的Flash MCU 中,有很多Flash MCU 具有可自编程性(Self-Programmability),
和在单片机程序运行过程中,可以将Flash 当作EEPROM 使用,来实时存储程序运行产生的一些数
据。所谓Flash 的可自编程性,是指用Flash 存储器中的驻留软件或程序对Flash 存储器进行擦除/
编程,但是,要求运行程序代码的存储区与待编程的存储区不在同一模块中。具有这种功能的Flash
MCU 可以实现远程在线自动升级自己的Firmware;可以灵活的使用Flash 来存储数据。这是这种类
型Flash MCU 的一个优点,但是如果整个单片机系统设计不好的话,这也会带来Flash 中的程序丢
失等一些问题。
Silicon Laboratories(美国芯科实验室,以下简称Silabs)的Flash MCU 就是具有可自编程性的改
良型高速C8051F 单片机。它完全兼容传统的8051 单片机,由于采用流水结构处理指令,70%~
80%的指令只需1~2个系统周期,指令运行的峰值达到MIPS 级别,同时还有许多比传统805
1更强的功能。下面就以Silabs 的Flash MCU 为例,谈谈Flash 中程序丢失的原因及不同情况下该
采取的对策。其他公司类似的Flash 单片机也可以根据自己的特点进行参考。在谈这个问题之前,让
我们先了解一下Flash 存储器的基本存储单元电路及其工作原理。
一、Flash 存储器的基本存储单元电路及其工作原理
目前较为通用的Flash 存储器体系结构有三种:NOR 结构、ETOX 结构和NAND 结构。这里就
以ETOX 结构为例介绍。Flash 存储器的结构原理。
www.secomtel.com Hotline: 400-887-3266 Email: sales@secomtel.com
这种结构的基本存储单元由一个MOS 管构成,该管的模式结构如图1所示。
写入时,在控制栅上加足够高的正电压VPP(12 V),在漏极上施加比VPP 稍低的电压(7 v),源极
接地,则源区的电子在沟道电场的加速作用下向漏区运动,部分电子的动能将变得很大,成为热电子,
其中有一些在控制栅电压所感应的纵向电场作用下,越过氧化层势垒进入浮置栅。当浮置栅获得足够
多的自由电子后,就在源、漏极间造成一个导电沟道。
擦除时,在控制栅上加负的高电压,在源极上接正的低电压,而漏极浮空。由于控制栅和浮置栅的
电容效应,使浮置栅感应为正电势,因此在浮置栅与源区之间形成强电场,在其作用下浮置栅上的电
子穿过氧化层势垒进入源区。这样,源和漏极之间无法形成导电沟道。
由于Flash 存储器所有单元的源极是连接在一起的,因此,不能按字节擦除,只能进行全片擦除
或扇区擦除,这也是Flash 存储器的一个缺点。
我们了解了Flash 存储器的基本存储单元电路及其工作原理后,对下面的描述就比较容易理解。
二、Silabs 的Flash MCU 丢失程序的原因分析及对策
Flash MCU 的供电电压范围一般为1.8V ~ 5.5V,从前面的描述中,我们知道这个电压显然不满
足对Flash 进行编程的要求。为了实现Flash MCU 的可自编程性和把Flash 当作EEPROM 使用来
存储数据,就必需在Flash 内内置编程电压发生器。一般来说,这种Flash 存储器由以下几部分组成:
控制逻辑— — 控制Flash 擦除和编程时的机器状态和时序发生器;
Flash 保护逻辑— — 避免意外的Flash 擦除和编程操作;
编程电压发生器— — 提供Flash 擦除和编程所需全部电压的集成电荷泵;
控制寄存器— — 控制Flash 模块的全部操作;
存储器本身。
从上面的描述中我们知道了这种Flash 存储器的内部结构,这也同时向我们揭示了这种Flash
MCU 丢失程序的问题需要从硬件和软件两方面入手去分析和解决。
1、软件引起的程序丢失或被改写
由软件引起的丢失程序问题,有以下几个方面:
(1) VDD Monitor 没有使能或VDD Monitor 使能,但没有被设置成MCU 的复位源
www.secomtel.com Hotline: 400-887-3266 Email: sales@secomtel.com
VDD Monitor 的功能是在单片机运行的过程中,实时监测单片机的供电电压是否正常。如果不正
常,将在相应的寄存器中设置相关的标志位,以便程序做出相应的处理。如果同时使能了VDD Monitor
作为复位源的选项,当单片机的供电电压低于VRST ( MCU 复位电压)时,产生复位信号,使整个单
片机系统处在复位状态,以避免不期望的情况出现,一直到供电电压恢复正常,重新开始工作。
我们知道,如果单片机的供电电压处在正常工作电压的临界值附近时,很容易引起单片机内部电
路的逻辑信号紊乱。如果这时有对Flash 的读写操作或出现了不期望的Flash 读写操作,很容易导致
Flash 中的程序遭到破坏,我们从外面观察到单片机系统不工作,好像里面没有灌程序进去一样。
要避免这种情况的出现,我们要使能VDD Monitor,并且使能VDD Monitor 作为MCU 复位源的
功能。对于Silabs 的不同系列的MCU,使能VDD Monitor 的方式不同:有的是通过拉高外部I/O
“MONEN”来实现;有的是设置寄存器VDM0CN 中的VDMEN 位来实现。注意:对RSTSRC 的操
作不能使用“读-修改-写”指令,例如:ANL、ORL 和XRL 等(汇编语言);“|”和“&”等(C
语言);而要使用直接写入指令,例如:MOV(汇编语言)和“=”(C 语言)。
(2) 擦除加密了的包含LockByte 页引起的整个Flash 存储器被擦除
Silabs 的MCU 高保密性体现在Flash 中设置了保密字节——LockByte。将保密字节LockBye 中
的位清零,可以加密相应的一页或多页,同时包含LockByte 的页也被默认加密了。如果试图通过JTAG
或C2 接口擦除LockByte(解-密),将导致整个Flash 存储器被擦除。如果用户代码(Firmware)试图
擦除包含LockByte 的页,将会产生擦写错误复位,并有可能导致整个Flash 存储器被擦除。
因此,当Flash 存储器被加密后,不要通过JTAG 或C2 接口去擦写LockByte,也不要使用用户代
码去擦除包含LockByte 的页。
(3) 用户代码(Firmware)对Flash 的写操作不当引起程序丢失或被错误改写
当需要将Flash 当作EEPROM 使用来存储数据时,如果用户程序处理不当,很容易导致Flash 存
储器被擦除或程序被破坏。这有下面几种情况:
1) 当PSWE(Flash 写使能位)=1(和PSEE(Flash 擦除使能位)=1)时,用户程序用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 之间的指令;
www.secomtel.com Hotline: 400-887-3266 Email: sales@secomtel.com
6) 在一个程序中只使能一次PSWE 和使能一次PSEE(可以设计两个函数,一个用于Flash 写,
另外一个用于Flash 擦除)。
(4) PC 指针跑飞引起Flash 存储器被擦除或程序被改写
我们知道,一个产品设计出来销售到使用者手中,实际的使用环境千差万别。产品的可靠性就显
得很重要。这种可靠性需要硬件和软件两方面来保证。如果单片机系统硬件设计不好,很容易受到外
部干扰,这时软件上又没有相应的处理措施,那么很容易出现我们所不期望的结果。
例如,单片机系统受到的干扰超出了它所能承受的能力,可以导致MCU 内部寄存器被改写,PC
指针跑飞。如果这时PSCTL 的PSWE 位被意外置1,PC 又恰好访问到XRAM 空间,Flash 存储器就
会被擦除或者程序遭到改写。
针对这种情况,可以在程序上设置多个允许写操作的变量,当需要执行写操作时,对这几个变量
进行效验,只有这些条件全部满足时,才执行写操作。这种方法可以在一定程度上避免误操作。这种
方法在单片机系统的软件抗干扰设计中经常使用,用来保护一些重要的数据和操作。
另外,关于单片机系统软件抗干扰设计市面上有很多书籍,网上也有很多资料,大家可以参考。
2、硬件引起的程序丢失或被改写
硬件设计可以说是单片机系统设计中至关重要的部分。我们在产品研发中遇到的有关产品可靠性
问题大部分来自硬件方面。从这点来说,软件抗干扰只是对硬件起着一个补充作用,处在辅助地位。
从某种程度上来说,硬件做好了,软件设计几乎不用考虑抗干扰的问题。下面我们就硬件方面来分析
一下引起Silabs MCU 的Flash 存储器被擦除或程序被改写的原因。
当用户程序中有对Flash 写入或者擦除操作的子程序时,电源失效、过慢的VDD 爬升时间、时
钟线上的毛刺、超高/低温都可能会引起Flash 存储器被擦除或程序被改写。
(1) 电源失效
在这里是指电源电压会引起单片机系统工作异常的现象,都称作电源失效。电源就好比是人的心
脏,它也是单片机系统的心脏,为单片机系统工作提供动力。心脏有问题了,其他部分就无法正常工
作。如果电源工作不正常,例如:输出电压小于单片机系统正常工作所需的最小电压;输出电压不干
净,噪音严重。这些都会给单片机系统带来严重的损害。
针对输出电压小于单片机系统正常工作所需的最小电压情况,就必需使能MCU 的VDD Monitor
功能,并且使能VDD Monitor 作为MCU 复位源的功能。当电源电压低于单片机系统正常工作所需的
最小电压时,强制单片机系统复位,避免不期望的事情出现。
针对输出电压噪音严重的情况,可以加强电源部分的滤波,将噪音的影响尽量降低。
(2) 时钟毛刺引起Flash 存储器被擦除或程序被改写
如果振荡器提供的时钟毛刺现象严重,将使MCU 得不到可靠的工作时序信号,容易使内部电路
逻辑紊乱,出现不期望的事情。解决时钟方面的问题,可以参考下面的一些方法:
1) 如果系统需要精确度高的时基并且工作在高噪声的环境,时钟源建议使用CMOS 时钟而不
采用晶体振荡器来减少时钟毛刺;
2) 在MCU 内部将外接时钟源二分频后作为系统时钟,减少时钟毛刺的影响;
3) 外部时钟电路优化:时钟电路尽量靠近MCU 时钟管脚;时钟电路被地包围;时钟线尽量短;
时钟线上加RC 滤波电路。
4) 精度允许的情况下尽量采用内部时钟作为系统时钟;
5) 如果系统是外接时钟源,在进行Flash 操作时切换到内部时钟,操作完毕切换到外部时钟。
www.secomtel.com Hotline: 400-887-3266 Email: sales@secomtel.com
(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 等。
结束
上面我们从硬件和软件设计两方面分析了Silabs 的Flash MCU 丢失程序的原因,以及提出了一
些对策。这些分析和对策,并不是十全十美的,只是给大家提供一个考虑这方面问题的思路。当然,
出现Flash 存储器丢失程序也还有其他方面的原因有待我们去发现、解决。
参考文章:
Silabs 单片机Flash 失效分析—— 牟方锐
www.secomtel.com Hotline: 400-887-3266 Email: sales@secomtel.com
我的几点看法:
1、首先检查你的程序,是不是在程序中有写入EEPROM的动作,如果有,这可能就是罪魁祸首!
2、设备附近是否存在导电的或者潮湿的或者其他粉尘或铁屑,进入PLC内部短路导致程序丢失。或者PLC上面的线槽里面有很多铁屑?掉入PLC内部导致?
3、检查通风散热,PLC内部温度是否太高?
4、PLC本身质量问题的可能性不大。因为是固定那几个PLC,而且你还更换过。
5、电源问题不大。电源问题会烧PLC。况且你还加了UPS。
6、是否人为?设备所在单位,你是否得罪了某些基层人员?要干掉你程序易如反掌,用铜丝在最大的IC或者在存储器IC上扫几下可能就搞定。
7、电柜内是否震动厉害,导致PLC设备内部出现问题?
8、暂时就想到这几个问题了,其他的想到再说。。。。。。