C8051Fxxx程序丢失问题及预防措施分析
以上代码中,当PSWE = 1时只执行写Flash操作(*pwrite = mydata);其他操作,如修改addr的值、获取源数据和目的地址,都是在PSWE = 0时执行的。 ③ 将Flash写/擦除指针指向data或idata区。 4 一个实际应用方案 在有的应用场合,由于需要较快的执行速度,不能使用单片机的内部时钟作系统时钟源,所以使用外部晶振来提供时钟。在这种情况下,首先要在硬件上确保系统工作参数正常。 在软件上,由于最常见的Flash丢失原因是程序问题,所以可以在代码中用多种方法来预防Flash数据丢失。首先,在初始化单片机时,使能VDD检测,并设置VDD和时钟丢失为复位源。如果程序中有写/擦除Flash的代码,则在写/擦除操作前切换系统时钟,将系统时钟切到内部时钟或对外部时钟2分频;写/擦除操作完成之后,再恢复系统时钟,通过增加Flash修改操作时的时间开销来实现系统的稳定[2]。以下以C8051F126为例,给出了系统时钟切换的程序清单: void SYSCLKAdjust(unsigned char select) { 要恢复系统时钟到Flash操作前的状态,只需将CLKSEL_Save、OSCICN_Save、OSCXCN_Save重新写回到CLKSEL、OSCIN、OSCXCN。 C8051F126的系统时钟(SYSCLK)可以在内部时钟和外部时钟之间自由切换,切换时的操作要求如下: ① 在切换过程中,先设置所选时钟的属性,再用CLKSEL将其设置为SYSCLK。 5 总结 程序丢失会带来各种不良的后果,最严重时致使程序无法正常运行,从而造成整个系统崩溃,给产品的应用带来麻烦。在系统的硬件设计和代码编写过程中,通过对以上问题的注意,可以有效地防止程序丢失问题的出现。另外,由于系统时钟的切换只发生在Flash的写/擦除过程中,操作结束后又恢复成原来的设置,因而对系统运行速度的影响很小,从而保证了系统其他功能的实现。
④ 减少将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)、比较单元和软件复位。
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;
}
}
② 在还原过程中,先用CLKSEL选择时钟源,再设置其属性。
③ 如果切换过程中关闭外部晶振,要再恢复外部时钟,启动后至少要等1 ms,再去读XTLVLD(OSCXCN.7)来判断晶振时钟是否稳定。否则,可能读到错误值。
④ 在外部时钟稳定运行后,再对其分频,不必插入等待周期。
⑤ 在切换过程中,可以保持外部时钟继续运行,这样在还原过程中就不必等待外部时钟稳定,从而节省时间开销,代价是系统功耗有所增加。
预防措施 分析 问题 丢失 程序 C8051Fxxx 相关文章:
- 基于赛灵思Spartan-3A DSP的安全视频分析(02-17)
- 关于Linux操作系统的NTFS和内核分析(05-19)
- Linux 2.4.x内核软中断机制(04-06)
- 基于DSP的人脸识别系统设计(04-26)
- 3D图形芯片的算法原理分析(07-16)
- 解析:视频图像智能分析处理技术(08-08)