微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > MCU和DSP > C8051Fxxx程序丢失问题的分析

C8051Fxxx程序丢失问题的分析

时间:11-20 来源:作者: 湖南大学 胡益 苏娟 周海燕 点击:

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的写/擦除过程中,操作结束后又恢复成原来的设置,因而对系统运行速度的影响很小,从而保证了系统其他功能的实现。

参考文献

[1] Silicon Laboratories Co Ltd. C8051F120/1/2/3/4/5/6/7 Mixed Signal ISP Flash MCU Family,2004.
[2] 潘琢金,施国君.C8051Fxxx高速SOC单片机原理及应用[M].北京:北京航空航天大学出版社,2002:154-157.

胡益(硕士研究生),主要研究方向为UHF RFID读写器;
苏娟(副教授),主要研究方向为嵌入式系统、语音识别等;
周海燕(硕士研究生),主要研究方向为嵌入式系统及应用。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top