打印

[请教]单片机C8051F020程序易丢失,请分析可能的原因

[复制链接]
11566|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
古道热肠|  楼主 | 2010-11-20 17:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有个朋友用F020做主控,做的MP3播放机,F020芯片中的程序很容易出现导常,导致开机白屏无显示,重新刷F020的固件后,又能开机了,请用过此芯片的网友多出点主意,那些原因易导致Flash异常。
此类故障率还较高,调好的20台,放置一星期,重检有时有2台以上出现此现象。

相关帖子

沙发
apple| | 2010-11-20 20:11 | 只看该作者
FLASH单片机都可以有这种现象,只是比例不懂,原因不明.

使用特权

评论回复
板凳
月下狂想曲| | 2010-11-20 20:24 | 只看该作者
电源,读写flash时,关闭所有中断,相办法防止写flash出错

使用特权

评论回复
地板
chunyang| | 2010-11-20 20:43 | 只看该作者
开机上电时序的问题,误进入编程态了,仔细分析上电暂态,避免就是。

使用特权

评论回复
5
古道热肠|  楼主 | 2010-11-21 10:20 | 只看该作者
程序本身没有写flash的操作,电源按常规设计,用的是1117-3.3v稳压给芯片供电,由于芯片内带上电电压监测模块,外部复位引脚只用了简单的RC复位来实现。

使用特权

评论回复
6
mytempid| | 2010-11-21 14:41 | 只看该作者
前两天刚有人问,再转
网上找的,转贴

---------------------------------
C8051Fxxx程序丢失问题的分析

2009-05-23 16:01:45 作者:xn123 来源:《单片机与嵌入式系统》2007.12期 浏览次数:0 网友评论 0 条
作者:湖南大学    胡益   苏娟   周海燕
1 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 char xdata * idata pwrite;//使用idata指针指向flash
  unsigned char *source;
  unsigned char mydata;
  for (addr = 0; addr <100; addr++) {
  //pswe =0时获取要写入的数据
  mydata = *source++;
  //pswe =0时修改写入数据的目标地址
  pwrite = (unsigned char 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 char 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的写/擦除过程中,操作结束后又恢复成原来的 设置,因而对系统运行速度的影响很小,从而保证了系统其他功能的实现。

使用特权

评论回复
7
pa2792| | 2010-11-21 14:54 | 只看该作者
C8051F020 C8051F020抗干扰问题

我采用C8051F020设计产品,供电是采用电池和开关电源后稳压,市电插头是两芯的,没有接地线。样板在稳定性测试时发现老是不定时重启或死机(复位都没有作用)。只要用长点的导线(导体)或底线碰电路板的“地”就很容易产生复位。碰任何IO口更容易产生复位。不知是什么原因造成?请高手援助!

答 1:

是不是你的电源有问题啊

答 2:

你是用外部晶体吗?C8051系列复位时候的时钟切换要延时. 看门狗打开没有?

答 3:

暂时没遇到从我以前调试ADUCA812的板子来看,是你的电源有问题,主要是接地的问题。

答 4:

更详细情况如果把电路板的地和大地连接,则碰地也极难使其产生复位,但碰IO口则还会产生复位,只不过没有那么容易。

我用泰克100MHz示波器测量VDD电源和Reset脚,观测产生复位时的波形。发现系统复位时VDD和Reset波形非常平滑,没有脉冲毛刺。Reset脚没有低电平复位脉冲信号。我加大了MCU的电源滤波电容(由22uF变为470uF),抗干扰能力有提高,但还是会在运行期间莫名其妙地系统复位。PCB板的布地也是很难看出什么不妥,都是大面积铺铜和模拟地和数字地分开走线。布线方面我确实花了不少功夫降低电磁干扰,但还是没有避开。

以前用其它单片机时,布线和电源信号都不比现在这板好,但从来没有出现类似情况。

自动复位我还有办法软件恢复,最讨厌的是,居然有时会死机!即在干扰下,晶振停振,硬件复位也不行!!

现在公司试产了100多个产品,这个问题不解决难以向老板交代,请问大家有无遇到类似情况?有什么办法?

答 5:

原理图看门狗关闭也是一样。关键是在复位期间,示波器没有测量到干扰波形。

MCU的SCH图。

我也重点怀疑电源和接地,但现在的布线和示波器测量的波形来看,没有脉冲干扰到单片机啊。而且我在单片机的每个VDD管脚旁均有0.1uF的电容,reset脚也试过系统复位运行后接到VDD,但还是一样在运行期间不定时自动复位或死机。

难道C8051f020的稳定性不是很好?或对电源要求很高?

答 6:

你没有把图贴全,不知道你的实际功耗是多少100mA是最大输出电流,但也是在一定功率条件限制下的,你的压降不小,加上瞬间高脉冲干扰等,应为电源的原因造成MCU死锁不奇怪,示波器有时很难看到造成死锁的脉冲,这个脉冲可能幅度很大,但是持续长度很短,要仔细调节触发条件才能发现。

对于存在一定干扰的环境下,你这样处理电源基本行不通,L2电感也太小,10uH干不了啥事的,一般来说正负电源都要加电感隔离。正负分别加一只三条腿的EMI电感,之后经过一个差分隔离电感近电源,效果会好很多。

答 7:

多谢“一级菜鸟”那个10uH是datasheet推荐值,是供应单片机模拟电路的。问题是我就算使用可充电池供电也是一样的,只不过稍微没有那么容易使单片机复位。估计不是您所分析的原因。

希望各位多提点,谢谢!

答 8:

最新情况我把电路除CPU和供电部分外其他器件全部不焊接,同样会复位。而且还发现更加奇怪的现象:IO平时设为0,我用镊子碰IO口时,经常由原输出0V变为0.8V,而且这是CPU电流由原理18mA变成40~70mA(有时不定),而且有些IO由原来的1变成0,硬件复位也没有用,要断电才可以恢复正常!!

C8051F020难道抗干扰能力很差?存在巨大硬件缺陷?!

救命~~~

答 9:

倒在血泊中!用F020碰到死机、复位、IO死锁问题,传说中最狠毒的招数全中了,真黑

答 10:

p

答 11:

c8051f系列抗干扰性确实不太好用过c8051f040,开始的时候做了一个双面板,连2级emc都没过;后面费了好大劲改造才过了4级;感觉主要在于电源部分,可试着采用如下措施(仅供参考):1、板子入口处的直流电源加共模扼流圈,供cpu的最好用好一点的dc-dc芯片;2、进cpu的电源串10欧与470p电容的并联网络;3、复位引脚就近接10u与104电容;4、晶振外壳接地;5、下载程序后jtag口按它说明处理;6、i/o如能光隔最好隔离,特别是做控制用的。

答 12:

我也用C8051F020,感觉很好啊。我是四层板。

答 13:

重新做板了我安排另一有经验的同事重新布板。所有可能引起干扰的都进行了处理,好好布局,若这芯片不能用前面几个月的辛苦就白费了!

建议慎用C8051F020,因为代理商的工程师也底气不足,承认有IO死锁现象,并且没有给到解决方法。

答 14:

我在使用中也发现同样的现象,希望可以讨论一下! 我和楼主的遇到的情况有些相同,也一起提出来,希望能够讨论一下!

我是用于工业控制系统中的,使用两路隔离的电源。在测试中发现只要用导线接触于系统隔离的第二路电源地,系统就会复位;接触系统电源也有可能复位,但是稍微好一些。

通过检查内部复位寄存器发现复位原因为,外部复位,外部复位使用809S复位。询问厂家技术支持:建议使用另外一款日本的复位芯片,型号记不清楚了,抱歉! :) 追问之下答复说该芯片的复位脉冲比一般系统要窄。

仔细翻阅数据手册后发现,C8051F020的最小复位脉冲为10nS。(一般51系统的复位脉冲宽度都在1uS左右,最小也是200nS才能起到滤波和抗干扰作用)怀疑系统复位为接触静电放电导致干扰。考虑到芯片内部自代复位检测电路,把复位引脚线在离芯片最近的地方割断。用原来的办法测试复位现象已经很难出现。

最近去工业现场调试,发现系统容易死机。

工作环境比较恶劣,变频器,电机,接触器都在1m以内。和现场的布线等都有关系。

现在考虑重新做电路板,希望系统能够正常。各位大侠有什么好的建议!

答 15:

另外晶体也有问题! 另外晶体也比较难以振荡

答 16:

救命啊不是吧??? 现在我们也要用这个芯片c8051f022,我还是第一次用,而且还要1个多月内交货!!全部64个io口都用上了!这次怎么办呢?用来作为游戏机的cpu,各种干扰可不少啊!!

答 17:

难得很少人用C8051F020?我重新布板了,严重考虑了EMI问题,今天开始调试,发现第一次上电总是不能复位!!就是:在电路完全放完电(或用镊子短路电容放电)的情况下,上电肯定不能复位。但在第一次上电不能复位后,断电再上电,则肯定可以复位正常运行。抗干扰还没有来得及测试,希望有经验的朋友援助!

答 18:

感谢yking2008yking2008所说的确实让我的板子改善了不少,我把复位电容取消了,就没有那么容易复位了!非常感谢!!

新的PCB在EMI方面严重考虑了,采用尽量大面积铺铜和增加磁珠或EMI滤波器等措施,昨晚在同等干扰条件下确实改进了很多,用开关电源供电还偶尔出现干扰地线复位,但用电池供电就暂时没有发现复位。

同等条件我同步用AVR设计了产品,同样的干扰方法,AVR根本不会有复位和死机的现象出现。看来C8051系列在设计产品时EMI方面确实要非常谨慎考虑。

答 19:

在我的感觉,这个CPU有两个问题,端口一碰就出问题。

1/

晶振电路的抗干扰能力太差(这个问题可能换成外晶振)

使用特权

评论回复
8
ayb_ice| | 2010-11-22 08:26 | 只看该作者
FLASH NCU对高压非常敏感,电源设计非常重要,当然程序本身的问题也可能很大

使用特权

评论回复
9
yewuyi| | 2010-11-22 08:53 | 只看该作者
呵呵,已经有无数人倒在了C8051的这个问题上。


如4楼所说,上电问题。

ATMEL的MEGA系列容易丢EEPROM中的前几个字节,也是上电问题。
据说NXP的LPC以前也容易在上电时进入ISP状态。

听朋友们讲,刚开始用C8051的人,基本上都要经历一些‘血’的教训后才能比较稳定的使用C8051,这可能就是它的一种脾气吧。

不过从道理上讲,类似C8051这样无节制的提供MCU的主频并无由头的依靠降低晶圆的线径来进行市场竞争的行为,这是在是一种恐怖的行为,这对于做MCU设计的工程师来说,多少算是一种灾难。

使用特权

评论回复
10
救火车| | 2010-11-22 09:05 | 只看该作者
1、处理好电源纹波。
2、刷程序时电压要足
3、刷完程序要把CPU有关管脚,做一些保护。比如上拉、下拉什么的,使之不会受干扰产生电平跳变。
4、程序中不使用写FLASH的动作。关闭一些熔丝等等。

使用特权

评论回复
11
5880527| | 2010-11-22 09:17 | 只看该作者
没遇到过程序丢失,用了快五年了都很顺,每年几百套从没有损坏的,都是工业场合,光耦隔离后去控制变频器,步进,伺服,通讯无隔离去带触摸屏。在下载程序后如果下载电缆不拔掉,用一根电线去触碰电源地,MCU很容易死机是真的,但一拔掉了怎么碰都不会死了,也是RC复位。它的带载能力不错,所以喜欢它

使用特权

评论回复
12
ayb_ice| | 2010-11-22 10:17 | 只看该作者
我用C8051F 4~5年了,而且几乎所有产品都用内部FLASH当EEPROM用,从没有出现丢程序,但基本都是手持设备,电池供电,我公司其它工程师也用C8051F,也经常出现丢程序问题
感觉程序问题最可能
很多FLASH MCU都有类似问题,供电问题应该可能性较大

使用特权

评论回复
13
yewuyi| | 2010-11-22 10:22 | 只看该作者
我用C8051F 4~5年了,而且几乎所有产品都用内部FLASH当EEPROM用,从没有出现丢程序,但基本都是手持设备,电池供电,我公司其它工程师也用C8051F,也经常出现丢程序问题
感觉程序问题最可能
很多FLASH MCU都有类似问题,供 ...
ayb_ice 发表于 2010-11-22 10:17


呵呵,俺就从来没有听说MCHP的FLASH型MCU丢个代码!!!

这还是芯片设计的时候没有考虑到足够的忍耐度造成的,虽然通过严格的外部电路设计也能保持芯片正常使用,但第一有习惯问题,第二有认知问题,所以开始使用时,很多人都要吃亏上当后才学会怎么使用。

使用特权

评论回复
14
5880527| | 2010-11-22 10:26 | 只看该作者
以前这里讨论过STC丢程序,好像最终结论是它写得太快,那些用C8051F丢程序的不知道是不是也因为这个

使用特权

评论回复
15
ayb_ice| | 2010-11-22 10:27 | 只看该作者
PIC也用过,但用的不多
对PIC没有太多发言权
不过据说是不错的
但是感觉功能相对太弱

使用特权

评论回复
16
yewuyi| | 2010-11-22 10:50 | 只看该作者
PIC也用过,但用的不多
对PIC没有太多发言权
不过据说是不错的
但是感觉功能相对太弱
ayb_ice 发表于 2010-11-22 10:27


PIC24很好很强大。

使用特权

评论回复
17
月下狂想曲| | 2010-11-22 10:58 | 只看该作者
如果程序是一行一的写出来应不会出问题吧,移植的多点问题吧?

使用特权

评论回复
18
古道热肠|  楼主 | 2010-11-22 16:55 | 只看该作者
谢谢大家的建议,看来应该不全是芯片的问题。

使用特权

评论回复
19
tominator| | 2010-11-22 21:48 | 只看该作者
:funk:好高深啊,这到什么年月才能学懂呢

使用特权

评论回复
20
yhn1973| | 2010-11-22 23:49 | 只看该作者
有以下2点经验供参考
1、使用外置复位芯片809。C8051F内置复位电路自认为有两个缺点:(1)复位电压过低,最低2.4V,此电压下好些外围芯片还不能正常工作而CPU却已开始运行。(2)复位保持时间过短,小于0.3ms,不能有效地应付电源波动。我一直用STM809S,最低复位电压2.89V(所用的外围芯片最低工作电压都在2.7V),最小复位保持时间为140ms,足以应付电源波动。
2、不用的IO口一率设置为输出并置为低电平,输出端口用推挽输出模式,若用开路输出则外加强上拉电阻。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:以VS1003B和山景SOC芯片为背景,倾心研制数字化语音录放产品. 排忧邮箱:xg_2004_sy@126.com 得意之作是做了个AVR高压编程器,用起来爽歪歪, 串口MP3录放音模块,全面进入数字录放音时代

284

主题

6411

帖子

16

粉丝