李聲飛,代華山
(中國西南電子技術研究所,成都 610036)
TMS320F2812是TI公司推出的一款高性能的定點DSP[1],具有32位內核處理器,主頻可達150MHz,片內集成 128 kbyte的 FLASH、16 kbyte的SARAM,以及豐富多樣的外部接口,廣泛應用于工業控制、移動通信、軍事安全等領域。隨著電子技術的發展和用戶需求的提升,對已投入使用嵌入式設備程序的升級也越來越頻繁,而目前傳統的程序升級方法是實地取下設備,通過JTAG仿真器來燒寫程序[2]。這種方法簡單有效,但對于某些特殊場合,如設備在密閉的箱體內以及其它不便觸及的地方,這種方式給升級帶來了極大的不便,因此開發高效、便捷的升級技術成為一種迫切的需求。筆者考慮到多數設備都有遠程通信端口,如串口、SPI等,因此可采用在線升級方式,在不打開設備箱體的情況下,實現軟件更新。
如圖1所示,系統硬件結構采用DSP+FPGA架構。DSP(TMS320F2812)作為處理中心,通過數據總線和地址總線完成與FPGA的數據交換,實現復雜數據處理算法和外部控制。FPGA利用其大規模硬件資源,實現接口擴展。上電時,FPGA對DSP的模式選擇端進行控制,使DSP選擇從片內FLASH啟動或SCI啟動,并且通過FPGA,將PC機的串口與DSP的串口相連,實現PC機和DSP的數據透明交換。

圖1 嵌入式設備系統框圖Fig.1 Block diagram of embedded equipment system
傳統的編程方式采用JTAG口加載程序,利用TI公司編譯軟件CCS中的On-chip Flash Programmer插件,將編譯生成的.out文件直接燒寫到片內FLASH區[3]。該方法簡單高效,能夠實現對模塊軟件的升級。但對于特殊場合,如模塊在密閉箱體內,該升級方式無法快速有效的實現軟件升級,所以本文采用基于串口的動態加載的方式,實現設備軟件更新。
TMS320F2812的啟動方式可以分為內部Flash引導啟動、SPI引導啟動、SCI-A引導啟動、H0-SARAM引導啟動、OTP引導啟動、GPIO端口B引導啟動等幾種模式,由其模式選擇端實現不同的啟動方式。其中,TMS320F2812脫機運行默認為內部Flash啟動,本文通過串口實現軟件升級,將模式選擇端置為SCI啟動模式。
本文描述的程序加載采用兩級引導方式[4],分為引導程序加載和應用程序FLASH編程。程序動態加載原理如下:首先DSP上電并掃描模式選擇口,選擇SCI-A啟動模式,然后等待接收來自SCI口數據;PC機通過串口將引導程序發送給DSP的SCI通信口,將引導程序緩存至RAM區;然后再發送應用程序的燒寫文件,DSP在引導程序的控制下,將應用程序燒寫到DSP的FLASH區。由于TMS320F2812有128 kbyte的FLASH空間,能夠滿足一般的應用需求。
DSP的RAM空間分為安全區和非安全區,為了代碼的安全性,一般將代碼放在安全區域內運行。所以要把加載引導程序加載至RAM的安全區內。
如圖2所示,DSP在SCI_BOOT模式下,接收來自串口的數據,先將引導程序存儲到非安全RAM區(安全RAM處于鎖定狀態),該區域在DSP存儲器的低地址位。然后加載引導程序接管DSP的控制權,對DSP進行解鎖操作,并將自身拷貝到RAM的安全區。

圖2 引導程序加載Fig.2 Download boot program
在引導程序的控制下,將應用程序燒寫到DSP的FLASH區,如圖3所示。

圖3 應用程序燒寫Fig.3 Programming APP code
首先PC機通過串口將編譯好的應用程序發到DSP,DSP接收并緩存程序到RAM區。鑒于應用程序占用空間較大,一般將其存儲在較大的RAM空間中。筆者根據需求,將其定位到L0L1區域(地址空間0x008000~0x00A000)。預定義兩個數組Uint16BlockBuffer1[4096]、Uint16BlockBuffer2[4096]用于存儲應用程序,在引導程序中采用存儲器定位語句,將以上兩個緩沖數組定位到相應存儲空間:

在CMD文件中,采用定位語句,將Buffer1/2定位到DSP較大的RAM空間:

通過以上引導程序的設置,可將應用程序緩存至RAM區中。
當緩沖區Buffer1存滿后,引導程序調用FLASH編程API函數,將Buffer1中應用程序燒寫到FLASH中。在燒寫前要對FLASH進行擦除,采用TI公司提供的API函數對FLASH區域擦除:

其中,第一個參數SECTOR-F2812表示要擦除的扇區,第二個參數返回狀態值;通過Erase Status來判斷擦寫是否成功,若成功,則調用FLASH編程API函數如下:

其中,參數Flash-ptr表示編程首地址,BlockBuffer1為應用程序暫存RAM的首地址,Length為燒寫字節數,ProgStatus表示返回狀態。通過調用該API函數,將暫存在RAM區的應用程序燒寫至指定的FLASH區域,并可以通過指定燒寫首地址方式來自行分配FLASH空間。
在BlockBuffer1程序FLASH燒寫同時,引導程序繼續接收剩下的應用程序代碼至BlockBuffer2空間,然后重復以上步驟,將BlockBuffer2中代碼燒寫至FLASH指定位置,如此反復,待FLASH全部燒寫完畢,即完成了程序的升級。
首先要搭建設備升級的硬件環境,將設備串口與PC機串口相連,保證數據傳輸的硬件通路正常;然后通過FPGA控制DSP的啟動模式[5],配置DSP上電SCI-A啟動。如表1所示,FPGA控制4條模式選擇線GPIOF4、GPIOF12、GPIOF3、GPIOF2 輸出為 0011。

表1 DSP啟動模式控制Table 1 DSP boot mode control
TMS320F2812片內[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具有讀寫速度快的優點,所以優先考慮程序在SARAM中運行,同時大容量的SARAM可以作為數據暫存。FLASH具有掉電數據不丟失的特性,用來保存代碼和重要數據信息。基于以上考慮,引導程序代碼量較小,筆者選擇將其代碼段存放到MO/M1空間中,運行程序放在較大的L0/L1段,CMD映射關系如下所示:

應用程序的CMD文件控制其取址和運行的空間,如下所示:

econst段為存放外部數據和常量的空間,分配一個較大的8 k FLASH的區域來保存外部數據;text段為代碼段,將程序映射到 FLASHD(地址空間:0x3EC000~0x3F0000)中;cinit用于保存已初始化全局數據,存放到FLASHD區域。Ramfuncs控制程序的執行方式,上電后程序從FLASHD中拷貝代碼到RAML0(地址空間:0x008000~0x009000)中運行,實現了程序從FLASH區到RAM區的映射。
由于CCS編譯生成的目標文件(.out)是模塊化格式,即程序中代碼和數據分別存放在不同段中,該文件不能直接用來燒寫FLASH,需將其轉換為FLASH能識別的數據格式——二進制文件(.bin)。筆者采用HEX2000和Fileoshell.exe工具來實現文件轉換。編寫AppCode-hex-2812.cmd文件,將CCS編譯后生成文件AppCode.out轉換成HEX文件App-Code.hex,并填充未用的FLASH區域為全1。


利用AppCode-COFF2BIN-2812.bat批處理文件,控制FillOShell工具生成bin文件,可以直接傳輸該文件來實現在線升級。
首先配置串口調試工具,配置參數為:波特率9600bit/s,8 bit數據位,1 bit截止位。然后,選擇發送文本文件方式,發送引導程序的bin文件到DSP,如圖4所示。

圖4 傳輸引導程序Fig.4 Transmission boot program
傳完后再次鎖定波特率,并選擇擦除FLASH,將未編程的FLASH區域全部擦除,再傳輸應用程序的bin文件,如圖5所示。FLASH燒寫完成,并校驗應用程序大小,若校驗通過則FLASH燒寫成功。

圖5 燒寫成功Fig.5 Programming success
本文提出了一種DSP軟件動態加載方法,可以在不打開機箱條件下實現模塊軟件升級。通過實際測試,應用程序代碼在10kbyte左右時,升級耗時2 min左右,與傳統的JTAG升級方式相比,雖然時間有所增加,但解決了高空、密閉等特殊情況下程序升級的困難,可滿足基于TMS320F2812 DSP開發的嵌入式系統升級要求。文中采用二級引導方式,通過串口傳輸數據并調用API編程函數實現程序動態加載。由于片內FLASH容量有限(128 kbyte),擴充片外FLASH資源以滿足大型應用需求,將成為下一階段工作的重點,若配合以太網絡或總線技術,還可實現軟件的遠程升級。總之,該方法具有操作簡單、燒寫穩定等優點,可廣泛應用于嵌入式設備軟件的更新升級中,是智能化設備的必然要求和趨勢。
[1]王虹,楊更生.基于 TMS320F2812的步進電機 SVPWM 細分驅動[J].電訊技術,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]李靜,張樹團.TMS320F2812片內Flash在線燒寫技術研究[J].計算機應用,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在線編程引導技術[J].電訊技術,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的二次程序加載實現方法[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的控制系統方案設計[J].電訊技術,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動態配置技術[J].電訊技術,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)