李聲飛,代華山
(中國西南電子技術(shù)研究所,成都 610036)
TMS320F2812是TI公司推出的一款高性能的定點(diǎn)DSP[1],具有32位內(nèi)核處理器,主頻可達(dá)150MHz,片內(nèi)集成 128 kbyte的 FLASH、16 kbyte的SARAM,以及豐富多樣的外部接口,廣泛應(yīng)用于工業(yè)控制、移動(dòng)通信、軍事安全等領(lǐng)域。隨著電子技術(shù)的發(fā)展和用戶需求的提升,對(duì)已投入使用嵌入式設(shè)備程序的升級(jí)也越來越頻繁,而目前傳統(tǒng)的程序升級(jí)方法是實(shí)地取下設(shè)備,通過JTAG仿真器來燒寫程序[2]。這種方法簡單有效,但對(duì)于某些特殊場合,如設(shè)備在密閉的箱體內(nèi)以及其它不便觸及的地方,這種方式給升級(jí)帶來了極大的不便,因此開發(fā)高效、便捷的升級(jí)技術(shù)成為一種迫切的需求。筆者考慮到多數(shù)設(shè)備都有遠(yuǎn)程通信端口,如串口、SPI等,因此可采用在線升級(jí)方式,在不打開設(shè)備箱體的情況下,實(shí)現(xiàn)軟件更新。
如圖1所示,系統(tǒng)硬件結(jié)構(gòu)采用DSP+FPGA架構(gòu)。DSP(TMS320F2812)作為處理中心,通過數(shù)據(jù)總線和地址總線完成與FPGA的數(shù)據(jù)交換,實(shí)現(xiàn)復(fù)雜數(shù)據(jù)處理算法和外部控制。FPGA利用其大規(guī)模硬件資源,實(shí)現(xiàn)接口擴(kuò)展。上電時(shí),FPGA對(duì)DSP的模式選擇端進(jìn)行控制,使DSP選擇從片內(nèi)FLASH啟動(dòng)或SCI啟動(dòng),并且通過FPGA,將PC機(jī)的串口與DSP的串口相連,實(shí)現(xiàn)PC機(jī)和DSP的數(shù)據(jù)透明交換。
圖1 嵌入式設(shè)備系統(tǒng)框圖Fig.1 Block diagram of embedded equipment system
傳統(tǒng)的編程方式采用JTAG口加載程序,利用TI公司編譯軟件CCS中的On-chip Flash Programmer插件,將編譯生成的.out文件直接燒寫到片內(nèi)FLASH區(qū)[3]。該方法簡單高效,能夠?qū)崿F(xiàn)對(duì)模塊軟件的升級(jí)。但對(duì)于特殊場合,如模塊在密閉箱體內(nèi),該升級(jí)方式無法快速有效的實(shí)現(xiàn)軟件升級(jí),所以本文采用基于串口的動(dòng)態(tài)加載的方式,實(shí)現(xiàn)設(shè)備軟件更新。
TMS320F2812的啟動(dòng)方式可以分為內(nèi)部Flash引導(dǎo)啟動(dòng)、SPI引導(dǎo)啟動(dòng)、SCI-A引導(dǎo)啟動(dòng)、H0-SARAM引導(dǎo)啟動(dòng)、OTP引導(dǎo)啟動(dòng)、GPIO端口B引導(dǎo)啟動(dòng)等幾種模式,由其模式選擇端實(shí)現(xiàn)不同的啟動(dòng)方式。其中,TMS320F2812脫機(jī)運(yùn)行默認(rèn)為內(nèi)部Flash啟動(dòng),本文通過串口實(shí)現(xiàn)軟件升級(jí),將模式選擇端置為SCI啟動(dòng)模式。
本文描述的程序加載采用兩級(jí)引導(dǎo)方式[4],分為引導(dǎo)程序加載和應(yīng)用程序FLASH編程。程序動(dòng)態(tài)加載原理如下:首先DSP上電并掃描模式選擇口,選擇SCI-A啟動(dòng)模式,然后等待接收來自SCI口數(shù)據(jù);PC機(jī)通過串口將引導(dǎo)程序發(fā)送給DSP的SCI通信口,將引導(dǎo)程序緩存至RAM區(qū);然后再發(fā)送應(yīng)用程序的燒寫文件,DSP在引導(dǎo)程序的控制下,將應(yīng)用程序燒寫到DSP的FLASH區(qū)。由于TMS320F2812有128 kbyte的FLASH空間,能夠滿足一般的應(yīng)用需求。
DSP的RAM空間分為安全區(qū)和非安全區(qū),為了代碼的安全性,一般將代碼放在安全區(qū)域內(nèi)運(yùn)行。所以要把加載引導(dǎo)程序加載至RAM的安全區(qū)內(nèi)。
如圖2所示,DSP在SCI_BOOT模式下,接收來自串口的數(shù)據(jù),先將引導(dǎo)程序存儲(chǔ)到非安全RAM區(qū)(安全RAM處于鎖定狀態(tài)),該區(qū)域在DSP存儲(chǔ)器的低地址位。然后加載引導(dǎo)程序接管DSP的控制權(quán),對(duì)DSP進(jìn)行解鎖操作,并將自身拷貝到RAM的安全區(qū)。
圖2 引導(dǎo)程序加載Fig.2 Download boot program
在引導(dǎo)程序的控制下,將應(yīng)用程序燒寫到DSP的FLASH區(qū),如圖3所示。
圖3 應(yīng)用程序燒寫Fig.3 Programming APP code
首先PC機(jī)通過串口將編譯好的應(yīng)用程序發(fā)到DSP,DSP接收并緩存程序到RAM區(qū)。鑒于應(yīng)用程序占用空間較大,一般將其存儲(chǔ)在較大的RAM空間中。筆者根據(jù)需求,將其定位到L0L1區(qū)域(地址空間0x008000~0x00A000)。預(yù)定義兩個(gè)數(shù)組Uint16BlockBuffer1[4096]、Uint16BlockBuffer2[4096]用于存儲(chǔ)應(yīng)用程序,在引導(dǎo)程序中采用存儲(chǔ)器定位語句,將以上兩個(gè)緩沖數(shù)組定位到相應(yīng)存儲(chǔ)空間:
在CMD文件中,采用定位語句,將Buffer1/2定位到DSP較大的RAM空間:
通過以上引導(dǎo)程序的設(shè)置,可將應(yīng)用程序緩存至RAM區(qū)中。
當(dāng)緩沖區(qū)Buffer1存滿后,引導(dǎo)程序調(diào)用FLASH編程API函數(shù),將Buffer1中應(yīng)用程序燒寫到FLASH中。在燒寫前要對(duì)FLASH進(jìn)行擦除,采用TI公司提供的API函數(shù)對(duì)FLASH區(qū)域擦除:
其中,第一個(gè)參數(shù)SECTOR-F2812表示要擦除的扇區(qū),第二個(gè)參數(shù)返回狀態(tài)值;通過Erase Status來判斷擦寫是否成功,若成功,則調(diào)用FLASH編程API函數(shù)如下:
其中,參數(shù)Flash-ptr表示編程首地址,BlockBuffer1為應(yīng)用程序暫存RAM的首地址,Length為燒寫字節(jié)數(shù),ProgStatus表示返回狀態(tài)。通過調(diào)用該API函數(shù),將暫存在RAM區(qū)的應(yīng)用程序燒寫至指定的FLASH區(qū)域,并可以通過指定燒寫首地址方式來自行分配FLASH空間。
在BlockBuffer1程序FLASH燒寫同時(shí),引導(dǎo)程序繼續(xù)接收剩下的應(yīng)用程序代碼至BlockBuffer2空間,然后重復(fù)以上步驟,將BlockBuffer2中代碼燒寫至FLASH指定位置,如此反復(fù),待FLASH全部燒寫完畢,即完成了程序的升級(jí)。
首先要搭建設(shè)備升級(jí)的硬件環(huán)境,將設(shè)備串口與PC機(jī)串口相連,保證數(shù)據(jù)傳輸?shù)挠布氛?然后通過FPGA控制DSP的啟動(dòng)模式[5],配置DSP上電SCI-A啟動(dòng)。如表1所示,FPGA控制4條模式選擇線GPIOF4、GPIOF12、GPIOF3、GPIOF2 輸出為 0011。
表1 DSP啟動(dòng)模式控制Table 1 DSP boot mode control
TMS320F2812片內(nèi)[6]有兩塊 1 k×16 bit的SARAM MO/M1,兩塊 4 k ×16 bit的 SARAM L0/L1,1塊8 k×16 bit的 SARAM H0、128 k ×16 bit的FLASH 。由于SARAM具有讀寫速度快的優(yōu)點(diǎn),所以優(yōu)先考慮程序在SARAM中運(yùn)行,同時(shí)大容量的SARAM可以作為數(shù)據(jù)暫存。FLASH具有掉電數(shù)據(jù)不丟失的特性,用來保存代碼和重要數(shù)據(jù)信息?;谝陨峡紤],引導(dǎo)程序代碼量較小,筆者選擇將其代碼段存放到MO/M1空間中,運(yùn)行程序放在較大的L0/L1段,CMD映射關(guān)系如下所示:
應(yīng)用程序的CMD文件控制其取址和運(yùn)行的空間,如下所示:
econst段為存放外部數(shù)據(jù)和常量的空間,分配一個(gè)較大的8 k FLASH的區(qū)域來保存外部數(shù)據(jù);text段為代碼段,將程序映射到 FLASHD(地址空間:0x3EC000~0x3F0000)中;cinit用于保存已初始化全局?jǐn)?shù)據(jù),存放到FLASHD區(qū)域。Ramfuncs控制程序的執(zhí)行方式,上電后程序從FLASHD中拷貝代碼到RAML0(地址空間:0x008000~0x009000)中運(yùn)行,實(shí)現(xiàn)了程序從FLASH區(qū)到RAM區(qū)的映射。
由于CCS編譯生成的目標(biāo)文件(.out)是模塊化格式,即程序中代碼和數(shù)據(jù)分別存放在不同段中,該文件不能直接用來燒寫FLASH,需將其轉(zhuǎn)換為FLASH能識(shí)別的數(shù)據(jù)格式——二進(jìn)制文件(.bin)。筆者采用HEX2000和Fileoshell.exe工具來實(shí)現(xiàn)文件轉(zhuǎn)換。編寫AppCode-hex-2812.cmd文件,將CCS編譯后生成文件AppCode.out轉(zhuǎn)換成HEX文件App-Code.hex,并填充未用的FLASH區(qū)域?yàn)槿?。
利用AppCode-COFF2BIN-2812.bat批處理文件,控制FillOShell工具生成bin文件,可以直接傳輸該文件來實(shí)現(xiàn)在線升級(jí)。
首先配置串口調(diào)試工具,配置參數(shù)為:波特率9600bit/s,8 bit數(shù)據(jù)位,1 bit截止位。然后,選擇發(fā)送文本文件方式,發(fā)送引導(dǎo)程序的bin文件到DSP,如圖4所示。
圖4 傳輸引導(dǎo)程序Fig.4 Transmission boot program
傳完后再次鎖定波特率,并選擇擦除FLASH,將未編程的FLASH區(qū)域全部擦除,再傳輸應(yīng)用程序的bin文件,如圖5所示。FLASH燒寫完成,并校驗(yàn)應(yīng)用程序大小,若校驗(yàn)通過則FLASH燒寫成功。
圖5 燒寫成功Fig.5 Programming success
本文提出了一種DSP軟件動(dòng)態(tài)加載方法,可以在不打開機(jī)箱條件下實(shí)現(xiàn)模塊軟件升級(jí)。通過實(shí)際測試,應(yīng)用程序代碼在10kbyte左右時(shí),升級(jí)耗時(shí)2 min左右,與傳統(tǒng)的JTAG升級(jí)方式相比,雖然時(shí)間有所增加,但解決了高空、密閉等特殊情況下程序升級(jí)的困難,可滿足基于TMS320F2812 DSP開發(fā)的嵌入式系統(tǒng)升級(jí)要求。文中采用二級(jí)引導(dǎo)方式,通過串口傳輸數(shù)據(jù)并調(diào)用API編程函數(shù)實(shí)現(xiàn)程序動(dòng)態(tài)加載。由于片內(nèi)FLASH容量有限(128 kbyte),擴(kuò)充片外FLASH資源以滿足大型應(yīng)用需求,將成為下一階段工作的重點(diǎn),若配合以太網(wǎng)絡(luò)或總線技術(shù),還可實(shí)現(xiàn)軟件的遠(yuǎn)程升級(jí)??傊?該方法具有操作簡單、燒寫穩(wěn)定等優(yōu)點(diǎn),可廣泛應(yīng)用于嵌入式設(shè)備軟件的更新升級(jí)中,是智能化設(shè)備的必然要求和趨勢。
[1]王虹,楊更生.基于 TMS320F2812的步進(jìn)電機(jī) SVPWM 細(xì)分驅(qū)動(dòng)[J].電訊技術(shù),2008,48(8):189-193.WANG Hong,YANG Su.Subdivision Driving with SVPWM of Stepping Motor Based onTMS320F2812[J].Telecommunication Engineering,2008,48(8):189-193.(in Chinese)
[2]李靜,張樹團(tuán).TMS320F2812片內(nèi)Flash在線燒寫技術(shù)研究[J].計(jì)算機(jī)應(yīng)用,2008(10):37-40.LI Jing,ZHANG Shu-tuan.Research on on-line programming techniques for Flash in TMS320F2812[J].Journal of Computer Applications,2008(10):37-40.(in Chinese)
[3]陳代媛.C6000外部FLASH在線編程引導(dǎo)技術(shù)[J].電訊技術(shù),2009,49(5):86-88.CHEN Dai-yuan.External FLASH Memory′s Bootloader System for C6000[J].Telecommunication Engineering,2009,49(5):86-88.(in Chinese)
[4]朱望純,胡漢武,李智.DSP+FLASH的二次程序加載實(shí)現(xiàn)方法[J].理論與方法,2008,27(4):14-16.ZHU Wang-chun,HU Han-wu,LI Zhi.Secondary boot loader method for DSP and FLASH[J].Journal of Theory and Methods,2008,27(4):14-16.(in Chinese)
[5]黃玉梅.一種基于DSP+FPGA的控制系統(tǒng)方案設(shè)計(jì)[J].電訊技術(shù),2004,44(3):136-138.HUANG Yu-mei.A DSP and FPGA Based Scheme for Control System[J].Telecommunication Engineering,2004,44(3):136-138.(in Chinese)
[6]李晶,鐘瑜,鄭百衡.基于DSP的FPGA動(dòng)態(tài)配置技術(shù)[J].電訊技術(shù),2005,45(1):156-159.LI Jing,ZHONG Yu,ZHENG Bai-heng.FPGA Dynamic Reconfiguration Based on DSP[J].Telecommunication Engineering,2005,45(1):156-159.(in Chinese)