我采用一款FALSH MCU设计了一个电池供电的消费类产品.
生产的批量已经达到50多万.可是好景不长,发出的产品在前几个月有少量的不良品返回,其中有一些产品不工作,将MCU拆下后重新烧写程序后就工作正常,看来是程序被搽除了或者是部分搽除了.随着时间的推移,返修的不良品越来越多,比率也越来越大.我的客户开始着急了,让我停止供货和整顿.经过检查,发现FALSH MCU更换后就工作正常的产品比率居然达到了5%以上.现在,每天还在不断地退货,
着急啊.
请教各位大侠,这主要是FALSH MCU本身的质量问题引起,还是程序的抗干扰措施不到位引起. 需要说明的两点是,一点是:我的程序中有对FALSH ROM进行写的指令,而且这个FALSH MCU 允许写的地址是FALSH MCU的任意地址.FALSH MCU本身无自我程序代码的保护功能.还有一点是:该FALSH MCU内部无低压复位功能,如果外部无低压复位电路的话,产品很容易死机.
自我分析:由于MCU本身无自我代码保护功能,所以,当程序乱飞的情况下,只要飞到写指令上,就有可能将程序代码搽除---写到了不该写的地址.
是否有可能:烧写IC时,静电引起IC部分损坏.但是,奇怪的是,如果是烧写时静电局部损害IC,过了几个月才坏的话,那么IC拆下后重新烧录后99.9%以上的MCU都可以再重新工作.也就是说,程序丢失或错误的问题是主要的.
请各位有经验的大侠指点,本人有偿请教,只要能帮我解决问题的,本人一定重金感谢.
回复:请教FLASH MCU工作一段时间后失常的原因
请讲一下是用的何种型号……
1:硬件原理图请帖出来,使用环境是怎么样的?
2:最好能给出除代码外所有的资料,如果可能,可以大致描述一下上电后MCU将要执行的一些代码。
3:写EE或者FLASH是需要做一些特别工作防止误动作的。
4:请问你是否是原始设计人员?
5:根据俺的估计,你的这个不良率将会随着时间不断的上升
回复:请教FLASH MCU工作一段时间后失常的原因
我的程序中有对FALSH ROM进行写的指令,而且这个FALSH MCU 允许写的地址是FALSH MCU的任意地址.FALSH MCU本身无自我程序代码的保护功能.还有一点是:该FALSH MCU内部无低压复位功能,如果外部无低压复位电路的话,产品很容易死机.
这个是致命的弱点,可能在电压低落的时候产生一些抖动脉冲而导致FLASH出错,记得关于EEPROM的写保护和数据丢失问题有很多的讨论,是否考虑增加电压低落保护电路,或者更换更加可靠的MCU
原则上程序ROM尽量保证不被修改,宁可增加一个外置的EEPROM,
回复:请教FLASH MCU工作一段时间后失常的原因
回复2楼:
1,IC型号暂时不便公开,如你能解决问题,或者给予好的建议,我可以在邮件里告诉你,也包括其他你想知道的资料.
2,电路图很简单,MCU,晶振和下拉电容,按键,输出电路,低压复位电路,就这么多.
采用电池供电,2节1.5V电池.电池正极直接接MCU的VCC.
3,MCU上电,初始化程序,自检程序,然后进入待机状态,等待按键.
自检程序耗电20MA,时间1秒多.现在已经改为:上电初始化后直接待机,上电后MCU不耗电.待机电流3-5UA.
4,程序中写FALSH的指令前已经做了很多设置条件.如不符合,则不会执行写FALSH的指令.我认为,程序PC乱飞,如果飞到判断条件前,这些动作是有用的,如果直接就飞到了写的这条指令,再怎么做处理也没有用啊?!
5,我不是原始设计人员,但是这个程序的流程我都清楚.如需要原始设计人员参与交流,没有任何问题.
6,你的估计是对的,事实也证明了这点.之所以会这样,是因为早期的产品基本上都是没有加低压复位电路的.退回的产品加了低压复位电路的产品再发出的退还比较少.之所以还有,我认为和自检程序耗电有很大关系.现在自检程序也去掉了,但是改好发出去的产品还未得到反馈.现在发出的新产品都加了低压复位电路,并且去掉了自检程序.
自检程序的影响是:当电池用了几个月之后,电池能量不足了,产品工作时,耗电加大,电池电压瞬间下降,引起复位,还有如不足于供电的话,就会使得MCU程序乱飞而软件复位.复位后又自检耗电,再次使得MCU复位,如此一来,大大增加了MCU电压不稳和程序乱飞的次数和几率.这也就是,产品用了一段时间之后才容易出现问题的程序原因.
现在把自检程序去掉了,这样的几率是小了,但是,如果客户不及时更换电池,产品使用频繁的话,导致程序乱飞的几率加大,程序丢失或被误搽除的几率也还是有的.但是,肯定是比以前的产品要少多了.
现在,我是想请教各位,是否还有软件措施,可以进一步减小程序被误搽除的办法.
谢谢!
回复3楼:
产品已经设计好了,退回的产品,不可能再增加EEPROM这么多引脚的器件.当然了,实在没有办法的话,这位老兄的建议也是不错的.但是EEPROM被误写的可能还是有的.
谢谢!
回复:请教FLASH MCU工作一段时间后失常的原因
连IC型号都不公开,都不信任我们,就是知道都不想告?你...
算了,可以肯定的说100%是程序问题...
回复:请教FLASH MCU工作一段时间后失常的原因
自检程序也能去掉?
呵呵,奇怪的产品……
自检20MA?这是MCU全速运行时的功耗把?
FLASH写之前需要先擦除,这个就是保护FLASH的关键点。
如果系统不带BOD的话,那么上电和RST的顺序就很关键,再没有FLASH保护措施的话,那就是GAME OVER……
回复:请教FLASH MCU工作一段时间后失常的原因
对程序空间的写操作一定要小心行事
1。一般来说程序Flash的写次数是有限的,所以最好不要频繁执行写操作。
2。将写Flash的操作放到一个循环中,可以降低程序跑飞时写Flash的风险
while( 1 )
{
检查地址是否正确,否则break;
再次检查地址是否正确,否则break;
使能Flash写
再次检查地址是否正确,否则break;
写Flash(注意不要写成子函数,在这里必须是写Flash的全部代码,否则程序跑飞时有可能就到你的子程序中了)
保护Flash写
检查写的数据是否正确,否则返回错误,由其它部分判断是否需要重写
break;
}
3。选择CPU时,要心量选择有FLASH保护位的,必须设置为可写状态才能写入
4。系统没有自检有能会出错,减少自检步骤才是真理
回复:请教FLASH MCU工作一段时间后失常的原因
可否这样考虑?增加一个电压检测,如果电压低于某值,不执行写入FLASH操作,减少写入FLASH的时间,或者在写入的时候关闭其他的功率器件,至于不想公布MCU型号我可以理解,产品比较敏感,如果公布型号正好被人发现该产品有这么大的问题可能会被对手弄得很惨,呵呵。
回复:请教FLASH MCU工作一段时间后失常的原因
我有些项目也利用FLASH当EEPROM,从来没有任何问题...还是多分析程序吧...
回复:请教FLASH MCU工作一段时间后失常的原因
谢谢各位的捧场和回复.
如想知道MCU的型号,可以发邮件到
czlyw@163.com.
dai_weis说的对,产品比较敏感.
公开MCU型号后可能不良影响是:对MCU原厂品牌的影响,我的竞争对手知道后借此事情打击我,我的潜在客户对我的抵触等等.
还望各位理解.
我说的自检程序的内容是:检测MCU外围电路的线路的功能是否正常.譬如是否有漏焊,虚焊,搭丝等生产工艺引起功能不正常.
所以,自检工作时功耗会比较大,注意:电池供电的产品功耗一般几十MA属于正常,大于100MA的话,电池的寿命会大大降低.
MCU内部的自检程序当然不能省略.这部分程序的工作的耗电量只有3MA.
FALSH 写之前是先进行ERASE操作了.
MCU有一寄存器是CHIP,SECTOR和BYTE写的使能/禁止的功能.
谢谢6楼......
谢谢7楼......
谢谢8楼......
不管怎么改程序,最后的问题是如何验证改好的程序是否有效. 我做实验想设法能发现误搽除的现象出现,可是怎么做也试验不出来,这样的话,改了程序就无法验证效果.
再次请教,如何试验结果?
谢谢!!!!
回复:请教FLASH MCU工作一段时间后失常的原因
逻辑锁已经加了.
就是在写FALSH前设置了几个条件,如果条件符合才去执行FALSH的操作.
回复:请教FLASH MCU工作一段时间后失常的原因
采用7楼的方法,不论是FLASH还是EEPROM,都是非常有效的。软件设置“写使能”标记,虽然软件冗余,但可以排除绝大多数的错误写,包括程序跑非引起的异常写。
有一点我不完全同意7楼:如果程序有多出写操作的程序,不用子程序把写操作的程序精简,跑飞后错写的概率同样会增加。我写的子程序流程是:
“写使能标记”是否正确,错误则返回;
正常写操作;
取消“写使能标记”;
返回。
注意:
1、“写使能标记”尽量不要使用“1位”数据,可以使用字节来做标记,标记是一个特定的数据值,不要使用位排列有规律的数据,如0x00、0xFF、0x55、0xAA等。
2、尽量在程序中不同的地方(不要在中断中)增加“取消‘写使能标记’”的指令,这样可以保证跑飞后也很难有写操作的条件。
提醒一点:检查低压复位电路是否满足电池的特性和要求?电池多少V可以复位?MCU低到多少V还可以工作?
回复:请教FLASH MCU工作一段时间后失常的原因
程序的问题可能性比较大!检查写flash的语句或者联系flash芯片厂家,问问他们的技术支持人员,看是否flash的设计缺陷(可能性很小。。)
主要就是针对操作flash的语句进行排查。。另一个思路是:换种写法试试?
回复:请教FLASH MCU工作一段时间后失常的原因
别加密一批产品,分析不良产品的程序。或者,破解程序,比较与源程序的不同。