新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > C8051F單片機的軟件IAP技術

        C8051F單片機的軟件IAP技術

        作者: 時間:2016-12-02 來源:網絡 收藏
        引言

        C8051Fxxx系列高速SoC單片機是由美國Cygnal公司開發的完全集成的混合信號系統級芯片,具有與8051兼容的微處理器內核。C8051Fxxx單片機有大容量的Flash存儲器,用于存儲程序代碼和非易失性數據,可在應用編程。以 C8051F120為例,C8051F120x 和C8051F13x 系列MCU內部有128 KB(C8051F12x 和C8051F130/1)或64 KB(C8051F132/3)的在應用可編程Flash 存儲器,用于程序代碼和非易失性數據存儲;另外還有256字節的Flash頁,可以用于數據存儲??梢酝ㄟ^JTAG接口對Flash存儲器進行在應用編程,或由應用軟件使用MOVX 指令編程。用C8051F120 MCU做成的產品到了用戶處之后,用軟件通過串口就可以為產品進行Flash程序的更新。筆者通過實驗,在用戶操作界面的PC機及C8051F120的單片機控制系統之間,通過串行口進行C8051F120 單片機控制程序的自動升級及程序加密。用戶只要從互聯網上下載控制程序,即可實現單片機程序的自動升級。該方案解決了升級過程意外中斷、遠程升級傳輸誤碼等關鍵技術問題,避免了傳統固件升級需要更換主機、主板或芯片等問題,節約了人力和資金等資源,已在實際系統中應用并受到用戶好評。以下以64 KB Flash為例,簡要介紹單片機目標程序的準備及自動升級的制作過程。

        1自動升級的實現方法

        C8051Fxxx系列單片機將Flash程序區按512字節為一頁(page)來組織。在刪除控制程序區時,首先屏蔽所有中斷,使能程序刪除位 PSEE(PSCTL.1),同時使能PSWE(PSCTL=0x03, 即PSWE = 1, PSEE = 1,頁擦除模式) ,用C51語言的一個指針指向Falsh程序區。如:

          char xdata * data address=0x0000;

        每擦除一頁地址指針加512,依此操作可刪除所有的程序頁。刪除部分程序如下:

          while(address<0x0F800) {//0xF800=62KB
            *address = 0x00; //向扇區空寫,啟動擦除操作
            for (i=0;i<10;i++);
            address =address +512;
          }

        這樣就把62 KB的Flash的舊程序刪除了。實際上就是應用匯編語言中MOVX指令在每一頁的任一地址寫0FFH,就可以將該頁的所有字節都置為0FFH,從而實現了該頁的刪除。

        擦除掉所選的區域后要關掉對Flash的寫操作,否則可因其他環境造成程序的丟失:

          PSCTL &= ~0x03;// PSWE = 0; PSEE = 0
          FLSCL&=~0x01;//關閉Flash寫/擦除

        1.1更新程序的方法

        在接收新程序部分,寫入一握手程序塊,以保證程序的可靠性。握手的協議可自己定義,其中包括一些需要知道的信息,如長度、頭部、尾部等。

        同樣,“char xdata *data address=0x0000;”指向要寫的區域。

           FLSCL |= 0x01;//使能Flash寫/擦除
          PSCTL |= 0x01; // PSWE = 1

        然后通過串口用查詢的方法獲得新的程序代碼。

          while(len--) {
            *address++= Get_COM_Code();
          }
          PSCTL=00; // PSWE = 0; PSEE = 0
          FLSCL =00;

        1.2運行新程序

        在更新完程序后,有兩種方法可以重新運行程序;斷電再上電和軟件復位。 C8051F120內部有復位寄存器,通過使能該寄存器,可以實現軟件復位。

        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 塔城市| 双柏县| 高尔夫| 会理县| 武陟县| 萨迦县| 河间市| 昌乐县| 昭平县| 江津市| 望谟县| 长沙县| 翁源县| 水富县| 唐海县| 陵水| 丰镇市| 平山县| 都兰县| 井研县| 蒙城县| 邳州市| 类乌齐县| 深圳市| 黔东| 广宁县| 佛坪县| 乐安县| 郴州市| 长子县| 邓州市| 广安市| 延庆县| 丰城市| 邵阳县| 六枝特区| 康保县| 新巴尔虎左旗| 三原县| 榆中县| 丰都县|