引言 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內部有復位寄存器,通過使能該寄存器,可以實現軟件復位。 RSTSRC=0x10;//實現軟件復位 Jmpmain(); 對RSTSRC的寫操作均用直接賦值方式完成(如RSTSRC = 0x02),不能用讀/寫指令(如ORL或ANL)來完成。例如,代碼“RSTSRC |= 0x02”就是非法的。為保證完美的復位,在設置了復位寄存器后筆者還添加了匯編復位程序,以做到萬無一失。 Jmpmain: LJMP 0000H RET 這樣通過一條長跳轉指令跳到程序區最開始的位置。在C中調用匯編程序的方法請參考其他文檔。 2 引導區的編譯 作為程序引導區的程序,平時不參與主程序的執行。而主程序主要用于和用戶操作界面PC 機部分進行握手,當接收到PC 機部分要進行軟件升級的命令時,程序跳至引導程序區,執行如下流程: 發送準備升級字節到PC 機→刪除Flash 程序區→發送開始下載命令到PC 機→接收且放到相應地址。 圖1 主程序流程 主程序流程如圖1所示。引導區的程序要固定在一個位置,并單獨編譯,由 JTAG下載到MCU中。引導區的程序不能編譯分配Flash地址。筆者使用的Keil編譯器是一個很簡單、易用的編譯器。在Keil中,定位升級程序位置的實現方法非常簡單,通過修改其Project菜單下的Options for target一項就可以了。 在本程序中,引導區的程序定義在62 KB之后的位置。 編者注: 硬件接口和主從機程序見本刊網站www.mesnet.com.cn。 3 注意的問題 ① 使用內部振蕩器,這樣能提高系統時鐘的抗干擾能力。 ② 使用Flash時會限制執行寫操作的速度。完成1個字節的操作最長需要40 μs ,所以最好選用9 600的波特率。 ③ 減少將PSWE置1的指令操作。理想的情況是只有2個操作會將PSWE置1,即寫1個Flash字節和擦除1個Flash字節。 ④ 將Flash寫/擦除指針指向data或idata區。 ⑤ 引導區的程序應該以512字節為邊界。 ⑥ 升級用的HEX程序必須由PC機上的軟件轉化為BIN文件。 ⑦ C8051F120 MCU程序的操作最大特點是:在配置寄存器時能切換到該寄存器所在的頁。 ⑧ 引導區的程序在擦除或者寫時,不可以開中斷,且要關掉所有中斷。 結語 本文中的軟硬件模塊已被嵌入到相關的應用系統之中,提高了系統的性價比。該方案解決了升級過程中的一些關鍵技術問題,節約了資源,將會在一些高端控制中得到更為廣泛的應用。軟件IAP 技術不但適用于C8051F單片機,而且對使用其他單片機的產品設計也具有重要的參考價值。 參考文獻 [1] 姜曉梅,李祥和.基于ARM的IAP在線及遠程升級技術[J].計算機應用,2008(2):519521. [2] 周立功,張華.深入淺出ARM7[M].北京:北京航空航天大學出版社, 2005: 426438. [3] 劉憶輝,魏銀庫,等.片外Flash存儲器IAP的一種方案[J].單片機與嵌入式系統應用, 2006(2). [4] 王颯.用C8051F020的SPI接口擴展大容量數據存儲器[J].微計算機信息, 2006(22). [5] 李光飛,陽富民,樓然苗.基于K9F2808UOC的FAT16文件系統[J].浙江海洋學院學報:自然科學版,2006(6). [6] K9F2808UOC datasheets[OL]. http: //www. samsung. com /Prod?ucts/datasheets. htm. 作者:廣東技術師范學院 向丹 楊永 來源:單片機與嵌入式系統應用 2009 (3) |