8031+PSD813實現(xiàn)在線編程
引言
“在應(yīng)用可再編程”(In-Application reProgrammable,簡稱IAP)通常稱為“在線編程”,已經(jīng)不是陌生的概念了。要實現(xiàn)嵌入式微控制器/處理器系統(tǒng)的IAP功能,就意味著可以用主機(PC機或服務(wù)器)通過通信通道把固件(程序代碼)下載到應(yīng)用系統(tǒng)的存儲器中去。具有了IAP功能的電子產(chǎn)品有諸多益處:縮短開發(fā)進程,搶先占領(lǐng)市場;在裝配線上即可編程和測試;現(xiàn)場甚至是遠(yuǎn)程升級程序代碼,降低維護/升級成本。IAP技術(shù)對于通信、電力領(lǐng)域非常重要,如IC卡電話、分時計費電表等產(chǎn)品,通過遠(yuǎn)程更新代碼能大大降低后期服務(wù)費用。
目前最常用的微控制器仍是MCS-51系列,其有限的存儲空間、運行時不能更改程序代碼、程序/數(shù)據(jù)空間必須分開等條件限制了IAP功能的實現(xiàn),其中要解決的關(guān)鍵問題有以下幾個方面:
?。?) 存儲器可在線再編程。
?。?) 增加第二個存儲器陣列,用于IAP期間MCU的運行。
?。?) 實現(xiàn)對程序存儲器的寫入。
?。?) 地址譯碼自動生成。
Waferscale(WSI)公司推出的Easy FlashTM系列可編程外圍芯片產(chǎn)品PSD8XX是針對實現(xiàn)IAP問題而設(shè)計的,片內(nèi)提供了IAP所必需的兩塊獨立的存儲器陣列和自動地址譯碼電路,與 80C51構(gòu)成兩芯片的IAP完整解決方案。我們用到的PSD813F1芯片內(nèi)部有:1MB Flash主存儲器、第二塊256KB EEPROM存儲器、16KB SRAM、復(fù)雜的可編程邏輯陣列CPLD,擴展I/O口及JTAG接口等功能模塊。
一、 方案說明
在介紹方案之前,首先介紹將用到的PSD的兩個內(nèi)部寄存器:頁寄存器(page)和VM寄存器。在PSD內(nèi)部有一組控制寄存器用來對PSD進行設(shè)置,如I/O口方式、JTAG配置等。它們的地址是基址CSIOP加偏移地址。CSIOP地址可以在Able語言(見附錄)中設(shè)定。頁寄存器的偏移地址是E0H,VM寄存器的是E2H。當(dāng)CSIOP被定義為0900H時,它們的訪問地址就是(0900+E0)H和(0900+E2)H。8位的頁寄存器可使MCU的尋址空間擴大256倍,它的內(nèi)容可以由MCU來讀出和寫入。頁寄存器直接參與PSD內(nèi)部存儲器的地址選擇。在作為頁尋址時寫入要訪問的頁地址, PSD內(nèi)部地址譯碼邏輯就立刻選中目標(biāo)存儲器空間。頁寄存器是可以按位使用的,在不用來作頁面選擇時,還可以作一般邏輯使用,如本方案中用到的swap、 enabledatahalf就是用頁尋址未用到的位來實現(xiàn)的。VM寄存器用來分開程序空間(PSEN信號使能)和數(shù)據(jù)空間(RD信號使能), PSD813F1中Flash和EEPROM、SRAM可設(shè)置在不同空間。VM寄存器內(nèi)容定義如表1所列。
如果VM=12H,則設(shè)置Flash和SRAM位于數(shù)據(jù)空間,EEPROM位于程序空間。
使用頁寄存器實現(xiàn)分頁存儲時,應(yīng)該設(shè)置一個公共存儲器區(qū),即程序在任何位置執(zhí)行時都能夠訪問到的空間(或者說是頁不相關(guān)的地址空間)。本方案中公共存儲器區(qū)占去了每一頁的低一半的存儲空間(如圖1~圖4所示),用于放置初始化程序、中斷服務(wù)程序、頁切換程序以及物理設(shè)備驅(qū)動程序等重要子程序。同樣,重要數(shù)據(jù)也應(yīng)當(dāng)在任何頁都可以訪問,如PSD控制寄存器、I/O、用于保存堆棧和全局變量的系統(tǒng)RAM等。
表1 VM寄存器
圖1 上電時(啟動/引導(dǎo)狀態(tài))系統(tǒng)存儲器映射(VM=12H)
圖2 寫06H到VM,將Flash“移”到程序空間后系統(tǒng)存儲器映射
圖3 “swap”位寫1,“切換”Flash和EEPROM后系統(tǒng)存儲器映射
本方案充分利用了PSD813F1中存儲器的獨特功能,突破了80C51MCU的最大64KB訪問空間的限制,PSD內(nèi)部所有Flash存儲器可以由80C51使用。 IAP實現(xiàn)的基本原理是:系統(tǒng)從PSD的EEPROM啟動,執(zhí)行引導(dǎo)/下載程序,如果需要的話從PC機或其他主機中通過UART下載固件(程序)到PSD 的Flash存儲器。然后,程序從EEPROM轉(zhuǎn)跳到Flash,再通過PSD中的一個特殊寄存器VM將原引導(dǎo)區(qū)(地址0000H)的EEPROM用 Flash替代,實現(xiàn)了通過UART對PSD中Flash存儲器的在線編程。
二、 系統(tǒng)存儲器映射
系統(tǒng)啟動過程中存儲器的映射變換如圖1~圖4所示,其中FSx、EESx是PSD813F1內(nèi)部存儲器塊。FSx對應(yīng)8個Flash塊,每塊16KB;EESx對應(yīng)4個EEPROM塊,每塊8KB。
圖4 寫0CH到VM,將EEPROM“移”到數(shù)據(jù)空間后系統(tǒng)存儲器映射
MCU的運行有兩個基本模式:一個是引導(dǎo)/下載模式;另一個是正常運行模式。圖1~圖4顯示了上電啟動后從引導(dǎo)/下載模式到正常運行模式轉(zhuǎn)換過程中系統(tǒng)存儲器的變化。
圖1顯示了上電時系統(tǒng)存儲器的映射情況。系統(tǒng)從EEPROM開始,檢查是否要通過80C51的UART對Flash中的程序進行升級。此時, PSD中全部Flash存儲器都處于80C51的數(shù)據(jù)空間,而EEPROM則處于80C51的程序空間。這是在WSI的PSDSOFT開發(fā)系統(tǒng)第二個步驟的“PSD Configuration”中設(shè)置的。在“Set VM Register Configuration at Power Up”框內(nèi),設(shè)置Flash為“Data Space”,EEPROM為“Program Space”。此時,VM寄存器在上電時自動被設(shè)置為12H。PSD813F1允許在程序執(zhí)行中改變VM寄存器的內(nèi)容,這對于實現(xiàn)IAP也是非常重要的。
在完成對Flash中程序升級或不需要升級時,寫VM寄存器為06H,將Flash從80C51的數(shù)據(jù)空間“移”到程序空間(此時系統(tǒng)仍在EEPROM中運行)。圖2顯示了Flash被移到程序空間后的情況,這是在VM寄存器被寫后立刻產(chǎn)生的。
下一步,80C51運行程序從PSD EEPROM中“跳”到Flash。在程序?qū)?到“swap”位(上電時“swap”的值是0)進行地址“切換”,程序就進入Flash中運行了。注意:如果在EEPROM中運行時對“swap”寫1,結(jié)果會立刻發(fā)生(就好像抽掉了你正坐的椅子一樣)。所以,在此之前最好將程序轉(zhuǎn)跳到“切換”影響不到的段(即公共訪問區(qū),如FS1)?,F(xiàn)在,供MCU上電時引導(dǎo)(地址0000H)的EEPROM被Flash替代,如圖3所示。
最后一步,程序已經(jīng)在PSD的Flash中運行,寫0CH到VM寄存器,把EEPROM從80C51的程序空間“移”到數(shù)據(jù)空間。并且,MCU 跳轉(zhuǎn)到在PSD的FLSAH FS0塊中的復(fù)位入口0000H,用戶的程序開始真正執(zhí)行。此時,系統(tǒng)存儲器映射如圖4所示(正常工作模式)。所有PSD的128KB Flash都在程序空間,其中32KB是公共訪問區(qū),96KB采用分頁訪問。同時,EEPROM全部位于數(shù)據(jù)空間,且可在任何頁進行訪問。請注意: EES2和EES3(地址是C000H至FFFFH)可以被用戶當(dāng)作一般數(shù)據(jù)存儲器使用,而EES0和EES1則保留為系統(tǒng)引導(dǎo)代碼區(qū)(地址是8000H 至BFFFH)。
這一方案還可以實現(xiàn)對PSD中EEPROM的引導(dǎo)程序進行升級,此時程序在PSD的Flash中運行。這對于使用EPROM作為引導(dǎo)的IAP系統(tǒng)是不可能實現(xiàn)的。
為了避免處于程序空間EES0、EES1中的引導(dǎo)代碼被意外更改,還可以通過未用到的頁寄存器位實現(xiàn)另外一個功能,對引導(dǎo)代碼進行保護。定義 “enabledatahalf”位,將它寫為1,一方面保護ESS0、ESS1,另一方面把EES2、EES3作為一般數(shù)據(jù)存儲器使用。如果要升級引導(dǎo)代碼,則須先將“enabledatahalf”置為0,下載新的引導(dǎo)代碼到EES0、EES1,然后再將“enabledatahalf”置為1。必須保護好引導(dǎo)代碼,因為引導(dǎo)程序一旦被破壞,系統(tǒng)就徹底崩潰;如果僅僅是用戶程序被破壞,還可以通過UART重新下載。
三、 軟件設(shè)計
通過上面的介紹可知,實現(xiàn)IAP的軟件要包括系統(tǒng)啟動和用戶系統(tǒng)的載入兩個部分。其中的關(guān)鍵是程序在Flash與EEPROM之間的切換。
系統(tǒng)啟動的引導(dǎo)程序是放在EEPROM中的;用戶程序則放到Flash中。如果用戶僅希望實現(xiàn)對Flash中的用戶程序的IAP功能,而不要對 EEPROM中引導(dǎo)程序的升級,那么用戶程序可以像一般80C51程序一樣,不用作任何修改,直接放入Flash。如果用戶還要對引導(dǎo)程序進行升級,還要在用戶程序模塊中嵌入一個啟動模塊(詳見第四節(jié))。
引導(dǎo)程序(boot)和用戶程序啟動模塊(startup)的流程圖如圖5和圖6所示。
圖5 EEPROM引導(dǎo)程序(boot)
圖6 Flash引導(dǎo)程序(startup)
與之配合使用的PC機程序是RS-232接口通信程序,可參考相關(guān)例程,或直接使用Windows中的“超級終端”工具。
四、 系統(tǒng)實現(xiàn)
第一步,設(shè)計用戶程序。
如果不需要對引導(dǎo)程序升級則不作修改,直接將程序代碼下載到Flash中;反之,則要在用戶程序模塊中加入一個啟動(startup)模塊。方法是用L51(Franklin公司產(chǎn)品)將用戶模塊和startup模塊鏈接在一起。方法如下:
L51 用戶OBJ文件>, startup.obj
第二步,使用PSDsoft開發(fā)系統(tǒng)進行設(shè)計。
在PSDsoft開發(fā)系統(tǒng)中建立一個新項目,將PSD器件選定為PSD813F1。在流程圖設(shè)計“degin entry”中增加新Abel模塊,進行硬件描述設(shè)計,除用戶的自定義功能外還應(yīng)包括IAP部分(參見附錄)。并且,在“device config”中設(shè)置MCU總線方式、JTAG、用戶碼等選項。特別注意的是在MCU總線中,設(shè)控制信號為“WR,RD,PSEN”,F(xiàn)lash為數(shù)據(jù)存儲器,EEPROM為程序存儲器。然后,對以上部分進行編譯和裝配。
第三步,把編譯好的模塊和MCU程序模塊合并成一個文件。這里重要的是EEPROM中的引導(dǎo)程序。Flash中的程序可以同時裝入,也可以在應(yīng)用中通過UART裝入。
最后一步,用DK800開發(fā)工具的Flash Link電纜或芯片編程工具(PSDpro)對PSD813進行編程。
將按上述方法編程好的PSD813芯片裝到用戶電路板(包含RS-232接口通信電路)上,用串行電纜與PC機串口相連,在PC機上運行 PSDload程序或Windows通信附件“超級終端”。加電復(fù)位用戶板,IAP系統(tǒng)啟動,與PC機連接成功后,就能通過PC機下載或升級PSD中的用戶程序。如果沒有PC連接或沒有下載要求時,系統(tǒng)會自動進入用戶程序運行。
PSD813中主Flash存儲器和第二個存儲器陣列EEPROM在物理上是獨立的,不存在任何邏輯上的區(qū)別。也就是說,可以用Flash存放用戶系統(tǒng),也可以用EEPROM。如果用戶程序很?。‥EPROM的空間就夠用),而用到的數(shù)據(jù)空間又很大,可以把上述方案中的Flash和EEPROM 交換使用。并且,我們舉出的Flash、EEPROM、SRAM的地址映射也僅是PSD813F1的多種地址映射方案中的一個,使用頁寄存器可以靈活設(shè)計用戶自己的地址映射方案。
這里用的是UART通信,用戶同樣可以選擇其他通信方式,如IR、RF、CAN、LAN、WAN,甚至是Internet。從一般性考慮,本方案同樣可適用于其他單片機系統(tǒng)中,只要通過簡單修改提供的程序即可使用。另外,本方案中的PSD813F1可以用WSI公司其他PSD8XX產(chǎn)品或最新的 PSD9XX系列產(chǎn)品替換,僅需要在附錄文件中稍加修改。
附錄 Abel硬件描述語言文件
//定義‘swap’位至頁寄存器位pgr7,
//定義‘enabledatahalf’位至頁寄存器位pgr7:
swap node 117; (pgr7)
enable_data_half node 116; (pgr6)
//Flash片選方程如下:
fs0=((address>=^h8000) (address=^hBFFF) (page==3) !swap ) #((address>=^h0000) (address=^h3FFF) (page==X) swap );
fs1=(address>=^h4000) (address=^h7FFF) (page==X);
fs2=(address>=^h8000) (address=^hBFFF) (page==0);
fs3=(address>=^hC000) (address=^hFFFF) (page==0);
fs4=(address>=^h8000) (address=^hBFFF) (page==1);
fs5=(address>=^hC000) (address=^hFFFF) (page==1);
fs6=(address>=^h8000) (address=^hBFFF) (page==2);
fs7=(address>=^hC000) (address=^hFFFF) (page==2);
//EEPROM片選方程如下:
ees0=((address>=^h0000) (address=^h1FFF) (page==X) !swap) #((address>=^h8000) (address=^h9FFF) (page==X) swap !enabledatahalf);
ees1=((address>=^h2000) (address=^h3FFF) (page==X) !swap) #((address>=^hA000) (address=^hBFFF) (page==X) swap !enabledatahalf);
ees2=(address>=^hC000) (address=^hDFFF) (page==X) enabledatahalf;
ees3=(address>=^hE000) (address=^hFFFF) (page==X) enabledatahalf;
//定義SRAM片選 rs0=(address>=^h0100) (address=^08FF) (page==X); //定義PSD控制寄存器CSIOP地址
csiop=(address>=^h0900) (address=^09FF) (page==X);
參考資料
1 PSD8XXF系列數(shù)據(jù)手冊及應(yīng)用筆記.武漢力源,1998(8)
2 PSDsoft User Manual. 美國WSI公司,1998
存儲器相關(guān)文章:存儲器原理
電能表相關(guān)文章:電能表原理
評論