劉艷萍,趙騰,張進(jìn)東
(1.河北工業(yè)大學(xué) 信息工程學(xué)院,天津300400;2.北京泰德瑞普科技有限公司)
Altera公司為在系統(tǒng)編程(ISP)提供了軟件級標(biāo)準(zhǔn):Jam STAPL JEDEC標(biāo)準(zhǔn)JESD-71[2],它徹底改變了可編程邏輯器件(PLD)的編程和配置。該標(biāo)準(zhǔn)支持當(dāng)前所有使用JTAG進(jìn)行在系統(tǒng)編程的可編程邏輯器件。對于嵌入式系統(tǒng),該標(biāo)準(zhǔn)滿足所有的必要條件,例如:文件小、便于操作以及平臺獨(dú)立。
Jam STAPL(標(biāo)準(zhǔn)測試和編程語言)Byte-Code Player是一種讀取并執(zhí)行.jbc文件的解釋性程序。一個.jbc文件可包含多種功能,例如,對CPLD進(jìn)行編程、配置、驗(yàn)證、擦除以及空白檢查等[3]。Jam STAPL Byte-Code Player執(zhí)行軟件可以訪問用來執(zhí)行基于IEEE 1149.1標(biāo)準(zhǔn)的所有指令的IEEE 1149.1信號。執(zhí)行軟件也能夠處理.jbc文件中用戶定義的操作和程序。.jbc文件是二進(jìn)制文件,Jam STAPL Byte-Code Player執(zhí)行軟件解析.jbc文件描述信息后,將其翻譯成設(shè)置到目標(biāo)CPLD中的數(shù)據(jù)和算法。這個執(zhí)行軟件不針對某一供應(yīng)商或者器件體系結(jié)構(gòu)進(jìn)行編程,它只讀取并解釋Jam STAPL規(guī)范定義的語句[3]。
針對這種情況,設(shè)計(jì)了一種基于STM32的CPLD離線燒寫模塊。離線CPLD燒寫器是針對生產(chǎn)和現(xiàn)場調(diào)試等應(yīng)用場合而設(shè)計(jì)的一款燒寫設(shè)備,它的出現(xiàn)可以拋開PC機(jī)燒寫的固有模式,無需在線JTAG下載器甚至是電源,就可以輕松完成CPLD的燒寫功能,從而大大提高生產(chǎn)效率,降低了現(xiàn)場系統(tǒng)升級及調(diào)試時對設(shè)備和環(huán)境的苛刻需求。該模塊的成功實(shí)現(xiàn),極大地方便了用戶對CPLD的燒寫和更新。對廠家而言,生產(chǎn)線上就可以告別笨重的電腦和繁瑣的操作,修改和維護(hù)已銷售產(chǎn)品中的CPLD邏輯,再不需要技術(shù)人員背著沉重的筆記本和各種線纜出差,所以其意義非常重大。
CPLD的離線燒寫系統(tǒng)由兩部分組成:一部分是以嵌入式處理器STM32為核心的硬件平臺[4],另一部分是以Jam STAPL Byte-Code Player為核心的軟件系統(tǒng)。
本系統(tǒng)所使用的嵌入式處理器是ST公司的產(chǎn)品STM32F103ZET6——基于ARM架構(gòu)芯片來完成的嵌入式CPLD離線燒寫[4]。使用STM32F103ZET6是因?yàn)樵撔酒夹g(shù)相當(dāng)成熟,在新的平臺上移植非常方便,而且使用其自帶的固件庫,極大地方便了程序員項(xiàng)目的開發(fā),減少了一些不必要的麻煩。同時,其處理器的速度為72 MHz,足夠強(qiáng)大;MCU內(nèi)部集成的功能單元非常多,簡化了系統(tǒng)的設(shè)計(jì),增強(qiáng)了系統(tǒng)的穩(wěn)定性和可靠性[4-5]。
本系統(tǒng)使用的軟件開發(fā)環(huán)境為Keil u Vision4。Keil提供了包括C編譯器、宏匯編、鏈接器、庫管理和一個功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個集成開發(fā)環(huán)境(u Vision)將這些部分組合在一起。運(yùn)行Keil軟件需要 Win98、NT、Win2000、WinXP、Win7等操作系統(tǒng)[6]。
如果使用C語言編程,那么Keil幾乎就是不二之選,即使不使用C語言而僅用匯編語言編程,其方便易用的集成環(huán)境、強(qiáng)大的軟件仿真調(diào)試工具也會令你事半功倍。Keil u Vision4引入靈活的窗口管理系統(tǒng),使開發(fā)人員能夠使用多臺監(jiān)視器。新的用戶界面可以更好地利用屏幕空間,更有效地組織多個窗口,提供一個簡潔、高效的環(huán)境來開發(fā)應(yīng)用程序。新版本支持更多最新的ARM芯片,還添加了一些其他新功能。
系統(tǒng)的燒寫框圖如圖1所示。
圖1 系統(tǒng)燒寫框圖
由Quartus軟件產(chǎn)生.jbc文件,如果所產(chǎn)生的.jbc文件過大,則將文件放置于TF卡中,之后通過數(shù)據(jù)的讀取,將文件數(shù)據(jù)讀到片內(nèi)FLASH。在STM32F103ZET6主控芯片中已經(jīng)成功固化了Jam STAPL Byte-Code Player執(zhí)行軟件,Jam STAPL Byte-Code Player執(zhí)行軟件解析,并執(zhí)行.jbc文件包含的信息,經(jīng)過主控芯片模擬JTAG的時序,在系統(tǒng)時鐘的驅(qū)動下燒寫目標(biāo)板CPLD。
主控芯片選擇STM32F103ZET6,該芯片片上集成512 KB的FLASH存儲器,完全能夠容納本系統(tǒng)所需求的.jbc文件,不必再外接FLASH芯片。如果用戶所生成的用于燒寫CPLD的.jbc文件大小比芯片片內(nèi)FLASH存儲容量大,就需要外擴(kuò)FLASH芯片,以保證文件的完整性[7]。在生產(chǎn)上,為了適應(yīng)絕大部分的數(shù)據(jù)燒寫文件,可以把.jbc文件放到TF卡中。通過文件系統(tǒng),將數(shù)據(jù)一塊一塊地搬移到片內(nèi)FLASH中去,這樣一來,不管多大的數(shù)據(jù)文件,都不用擔(dān)心存儲空間不足的問題。
圖2為硬件系統(tǒng)結(jié)構(gòu)框圖。
圖2 硬件系統(tǒng)結(jié)構(gòu)框圖
硬件系統(tǒng)主要包括外部晶振電路、電源模塊、用于調(diào)試的20針JTAG調(diào)試接口、復(fù)位電路、串行接口USART、TF卡槽和用于燒寫的5針JTAG燒寫接口。硬件系統(tǒng)組成非常簡潔,JTAG調(diào)試口是上位機(jī)用來調(diào)試燒寫程序,并將燒寫程序固化到STM32芯片中;外部晶振選擇8 MHz;電源電壓值選擇3.3 V;SPI總線用來讀取TF卡中的文件數(shù)據(jù);JTAG燒寫接口是用來燒寫目標(biāo)板的JTAG接口;USART串行口會打印出目標(biāo)板的燒寫信息,顯示在PC機(jī)上。USART這一部分也可以省去,因?yàn)樵诔绦蛑幸呀?jīng)設(shè)定,目標(biāo)板的CPLD燒寫成功后,會有LED燈提示。
本系統(tǒng)的軟件設(shè)計(jì)主要采用Altera公司所提供的嵌入式處理器上使用Jam標(biāo)準(zhǔn)測試和編程語言(STAPL)進(jìn)行在系統(tǒng)編程時的配置方案。
Altera公司為ISP編程提供了軟件級標(biāo)準(zhǔn):Jam STAPL JEDEC標(biāo)準(zhǔn)JESD-71,它的出現(xiàn)徹底改變了可編程邏輯器件(PLD)的編程和配置。該標(biāo)準(zhǔn)支持當(dāng)前所有使用JTAG進(jìn)行在系統(tǒng)編程的可編程邏輯器件。對于嵌入式系統(tǒng),該標(biāo)準(zhǔn)滿足所有的必要條件,例如文件、便于操作以及平臺獨(dú)立。
系統(tǒng)用于燒寫CPLD的.jbc文件是由Altera公司提供的Quartus軟件生成的[9]。其步驟如下:
①在TOOLs菜單中,單擊Programmer。
②單擊Add File,為所選邏輯器件選擇編程文件。
③在File菜單上,指向Create/Update、單機(jī)Create Jam、SVF或者ISC File。
④在列出的File Format中,選擇.jbc文件格式。
⑤單擊OK按鈕。
系統(tǒng)所需要移植的源代碼主要包括9個文件:JBICOMP.C 文 件、JBIJTAG.C 文 件、JBIMAIN.C 文 件、JBISTUB.C文件、JBC_FILE.C文件、JBICOMP.H 文件、JBIJTAG.H文件、JBIPORT.H文件和JBIEXPRT.H文件。以上9個文件構(gòu)成了Jam STAPL Byte-Code Player執(zhí)行軟件。圖3為該執(zhí)行軟件源代碼結(jié)構(gòu)圖。
圖3 執(zhí)行軟件源代碼結(jié)構(gòu)圖
Quartus軟件生成的.jbc文件,存放在JBC_FILE.C文件中。Jam STAPL Byte-Code Player解析.jbc文件中的描述信息,將其翻譯成設(shè)置到目標(biāo)CPLD中的數(shù)據(jù)和算法。一個.jbc文件可包括多種功能,例如對CPLD進(jìn)行編程、配置、驗(yàn)證、擦除以及空白檢查等。Jam STAPL Byte-Code Player是用C語言寫的,應(yīng)用于16位和32位處理器,其源代碼的一部分也適用于8位處理器。把執(zhí)行軟件源代碼分成3類:
①JBCSTUB.C文件:它是專門用于處理I/O功能的代碼平臺,應(yīng)用到所使用的硬件上。
②JBC_FILE.C文件:用于存放.jbc文件中的數(shù)據(jù)。在該文件中定義了一個數(shù)組jbc_code,該數(shù)組存儲的是十六進(jìn)制的數(shù),這些十六進(jìn)制的數(shù)是由.jbc文件轉(zhuǎn)換得來,本系統(tǒng)所用.jbc文件的大小為43 KB。
③所有其他的C文件:執(zhí)行Player內(nèi)部功能的通用代碼。
本系統(tǒng)是基于嵌入式處理器的CPLD的燒寫,移植代碼需要對其中的一些C文件進(jìn)行修改。Jam STAPL Byte-Code Player執(zhí)行軟件的默認(rèn)配置包括支持DOS、32位Windows以及UNIX的代碼,移植到本系統(tǒng)所選的平臺上,需要使用預(yù)處理聲明#define來去掉這些代碼。移植主要修改的文件為JBISTUB.C文件,其中需要定制幾個函數(shù):
①jbi_jtag_io():為4個IEEE 1149.1 JTAG 信號(TDI、TMS、TDO和TCK)提供接口。
②jbi_export():把信息(例如用戶電子簽名)傳遞回調(diào)用程序(選擇默認(rèn))。
③jbi_delay():執(zhí)行期間實(shí)現(xiàn)所需的編程脈沖或者延遲。
④jbi_vector_map():處理非IEEE 1149.1JTAG信號的信號到引腳映射(選擇默認(rèn))。
⑤jbi_vector_io():對 VECTOR MAP 中定義的非IEEE 1149.1 JTAG信號進(jìn)行置位(選擇默認(rèn))。
系統(tǒng)的代碼移植包括以下4步:
①將預(yù)處理聲明設(shè)置為去掉無關(guān)代碼。
修改默認(rèn)的PORT參數(shù)為EMBEDDED來去除DOS、Windows和 UNIX源代碼以及包含庫,在JBISTUB.C文件開頭定義#define JBC_PORT EMBEDDED,即選擇的環(huán)境是嵌入式處理器平臺。
②將JTAG信號映射至硬件引腳。
JBISTUB.C中的jbi_jtag_io()函數(shù)含有發(fā)送和接收二進(jìn)制編程數(shù)據(jù)的代碼。其實(shí)現(xiàn)代碼如下:
③定制延時校準(zhǔn)。
calibrate_delay()函數(shù)確定處理器每ms運(yùn)行多少次循環(huán)。因?yàn)榫幊毯团渲眯枰_的延時,因此這一校準(zhǔn)過程非常重要。默認(rèn)情況下,one_ms_delay=1000L,根據(jù)自己系統(tǒng)所使用的處理器芯片進(jìn)行修改,本系統(tǒng)定義的函數(shù)修改如下:
④修改主入口函數(shù)jbi_execute()。
Jam STAPL Byte-Code Player主入口點(diǎn)是jbi_execute()函數(shù),該函數(shù)將某些信息傳給Player,Player根據(jù)所傳達(dá)的命令作出相應(yīng)的編程動作,當(dāng)Player完成后會返回一個退出代碼,以及任何運(yùn)行時錯誤的詳細(xì)信息。JBISTUB.C中的程序原型定義了接口:
在JBISTUB.C的main()函數(shù)中確定了傳給jbi_execute()的變量。初始化列表告訴Jam STAPL Byte-Code Player要執(zhí)行的函數(shù)類型(例如編程和驗(yàn)證),傳送該列表到j(luò)bi_execute()。必須以正確的方式來傳送初始化列表,如果初始化列表沒有被傳送或者無效,那么Jam STAPL Byte-Code Player就會檢查.jbc文件的語法。如果沒有錯誤,那么返回一個成功退出碼,不會執(zhí)行程序函數(shù)。
移植只需要修改列表中3個參數(shù):定義program_size=43 883,單位是字節(jié),該參數(shù)是.jbc文件的大小;定義program =(unsigned char * )jbi_code,該參數(shù)是指向.jbc文件的指針,也就是指向由.jbc文件轉(zhuǎn)換而來的數(shù)組jbi_code[]的指針;定義action[]= "PROGRAM\0",即Player要對CPLD進(jìn)行燒寫動作。余下的參數(shù)不用修改,保持默認(rèn)即可。主程序流程圖如圖4所示。
圖4 主程序流程圖
系統(tǒng)所要燒寫的目標(biāo)CPLD為Altera公司生產(chǎn)的MAX II型號的器件,該器件能夠支持.jbc文件所包括的操作有5項(xiàng):Program、Blankcheck、Verify、Erase和 Read_usercode。本系統(tǒng)只選擇Program操作進(jìn)行了功能驗(yàn)證。表1為.jbc文件操作聲明定義。
對器件進(jìn)行燒寫后會返回退出代碼。無論燒寫成功與否,都會有一個退出代碼被返回。退出代碼是一個整數(shù)值,用于指示.jbc文件執(zhí)行后的結(jié)果。退出代碼為零表示成功,而非零則表示失敗,并指示出失敗的一般類型。系統(tǒng)的測試平臺和燒寫目標(biāo)板實(shí)物圖略——編者注。
在程序中已經(jīng)設(shè)定:目標(biāo)板中的CPLD燒寫成功后,目標(biāo)板的LED連閃三次,之后變成常亮的狀態(tài)。燒寫不成功,LED燈一直處于滅的狀態(tài)。通過串口在PC機(jī)上打印出燒寫成功的信息略——編者注。
表1 .jbc文件操作聲明
若返回代碼Exit code=0,表示CPLD燒寫成功;若返回其他任何非0數(shù)字,均為燒寫失敗。
該模塊的成功實(shí)現(xiàn),極大地方便了用戶對CPLD的燒寫和更新。對廠家而言,生產(chǎn)線上就可以告別笨重的電腦,省去繁瑣的操作,修改和維護(hù)已銷售產(chǎn)品中的CPLD邏輯將變得非常方便。
編者注:本文為期刊縮略版,全文見本刊網(wǎng)站www.mesnet.com.cn。
[1]吳玉香,周建香.基于JTAG的Flash在線編程系統(tǒng)實(shí)現(xiàn)[J].化工自動化及儀表,2009,36(6):70-74.
[2]Altera.Jam STAPL [OL ].[2014-08].http://www.jamisp.com.
[3]王誠,吳繼華,范麗珍,等.Altera FPGA/CPLD設(shè)計(jì)(基礎(chǔ)篇)[M].北京:人民郵電出版社,2005.
[4]盧有亮.基于STM32的嵌入式系統(tǒng)原理與設(shè)計(jì)[M].北京:機(jī)械工業(yè)出版社,2013.
[5]田澤.嵌入式系統(tǒng)開發(fā)與應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2005.
[6]杜延,劉從越.嵌入式實(shí)時系統(tǒng)軟件測試實(shí)踐[J].微計(jì)算機(jī)信息,2007(4-2):86-88.
[7]Stuart,R Ball.嵌入式微處理器系統(tǒng)設(shè)計(jì)實(shí)例 [M].3版.北京:電子工業(yè)出版社,2004.
[8]Kamal,Raj.嵌入式系統(tǒng):體系結(jié)構(gòu)、編程設(shè)計(jì)[M].北京:清華大學(xué)出版社,2005.
[9]鄭亞民,董曉舟.可編程邏輯器件開發(fā)軟件QuartusII[M].北京:國防工業(yè)出版社,2006.