<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > C8051Fxxx程序丟失問(wèn)題及預防措施分析

C8051Fxxx程序丟失問(wèn)題及預防措施分析

作者: 時(shí)間:2012-07-29 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/171115.htm

③ 將Flash寫(xiě)/擦除指針指向data或idata區。
 ?、?減少將PSWE置1的指令操作。理想的情況是只有兩個(gè)操作將PSWE置1,即寫(xiě)1個(gè)Flash字節和擦除1個(gè)Flash字節。
 ?、?在Flash寫(xiě)/擦除函數中,使能VDD監視并設置復位源。使能和設置操作必須在實(shí)際的寫(xiě)操作發(fā)生之前,置PSWE=1之后完成。
 ?、?代碼中所有的對RSTSRC的寫(xiě)操作均用直接賦值方式完成(如RSTSRC = 0x02),不能用讀/寫(xiě)指令(如ORL或ANL)來(lái)完成。例如,代碼“RSTSRC |= 0x02”是非法的。
 ?、?對于能用PORSF位來(lái)設置VDD為復位源的器件,保證在寫(xiě)RSTSRC時(shí)置PORSF=1,即先使能VDD為復位源,再使能其他復位源的操作,如時(shí)鐘監測(missing clock detector)、比較單元和軟件復位。

4 一個(gè)實(shí)際應用方案

  在有的應用場(chǎng)合,由于需要較快的執行速度,不能使用單片機的內部時(shí)鐘作系統時(shí)鐘源,所以使用外部晶振來(lái)提供時(shí)鐘。在這種情況下,首先要在硬件上確保系統工作參數正常。

  在軟件上,由于最常見(jiàn)的Flash原因是,所以可以在代碼中用多種方法來(lái)預防Flash數據。首先,在初始化單片機時(shí),使能VDD檢測,并設置VDD和時(shí)鐘丟失為復位源。如果中有寫(xiě)/擦除Flash的代碼,則在寫(xiě)/擦除操作前切換系統時(shí)鐘,將系統時(shí)鐘切到內部時(shí)鐘或對外部時(shí)鐘2分頻;寫(xiě)/擦除操作完成之后,再恢復系統時(shí)鐘,通過(guò)增加Flash修改操作時(shí)的時(shí)間開(kāi)銷(xiāo)來(lái)實(shí)現系統的穩定[2]。以下以C8051F126為例,給出了系統時(shí)鐘切換的清單:

  void SYSCLKAdjust(unsigned char select) {
    EA_Save=EA;
    SFRPAGE=0x0f;
    switch(select) {
      case 0x01:
        OSCICN_Save = OSCICN;
        CLKSEL_Save = CLKSEL;
        OSCICN = 0xc3;//內部時(shí)鐘,不分頻
        CLKSEL = 0x00;
        break;
      case 0x02:
        OSCXCN_Save = OSCXCN;
        OSCXCN |= 0x70;//外部時(shí)鐘2分頻
        break;
      default://選擇內部時(shí)鐘
        OSCICN_Save = OSCICN;
        CLKSEL_Save = CLKSEL;
        OSCICN = 0xc3;
        CLKSEL = 0x00;
        break;
    }
  }

  要恢復系統時(shí)鐘到Flash操作前的狀態(tài),只需將CLKSEL_Save、OSCICN_Save、OSCXCN_Save重新寫(xiě)回到CLKSEL、OSCIN、OSCXCN。

  C8051F126的系統時(shí)鐘(SYSCLK)可以在內部時(shí)鐘和外部時(shí)鐘之間自由切換,切換時(shí)的操作要求如下:

 ?、?在切換過(guò)程中,先設置所選時(shí)鐘的屬性,再用CLKSEL將其設置為SYSCLK。
 ?、?在還原過(guò)程中,先用CLKSEL選擇時(shí)鐘源,再設置其屬性。
 ?、?如果切換過(guò)程中關(guān)閉外部晶振,要再恢復外部時(shí)鐘,啟動(dòng)后至少要等1 ms,再去讀XTLVLD(OSCXCN.7)來(lái)判斷晶振時(shí)鐘是否穩定。否則,可能讀到錯誤值。
 ?、?在外部時(shí)鐘穩定運行后,再對其分頻,不必插入等待周期。
 ?、?在切換過(guò)程中,可以保持外部時(shí)鐘繼續運行,這樣在還原過(guò)程中就不必等待外部時(shí)鐘穩定,從而節省時(shí)間開(kāi)銷(xiāo),代價(jià)是系統功耗有所增加。

5 總結

  程序丟失會(huì )帶來(lái)各種不良的后果,最嚴重時(shí)致使程序無(wú)法正常運行,從而造成整個(gè)系統崩潰,給產(chǎn)品的應用帶來(lái)麻煩。在系統的硬件設計和代碼編寫(xiě)過(guò)程中,通過(guò)對以上的注意,可以有效地防止程序丟失的出現。另外,由于系統時(shí)鐘的切換只發(fā)生在Flash的寫(xiě)/擦除過(guò)程中,操作結束后又恢復成原來(lái)的設置,因而對系統運行速度的影響很小,從而保證了系統其他功能的實(shí)現。


上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>