曹丙虎 張建新
【摘 要】嵌入式設(shè)備裝入整機(jī)或系統(tǒng)后,拆卸進(jìn)行軟件升級(jí)非常困難。本文以TMS320F2812為例,提出一種通過串口進(jìn)行軟件更新的方法。借鑒sci-A更新方式,不需要更改相關(guān)硬件端口,通過默認(rèn)內(nèi)部flash啟動(dòng),借助F2812內(nèi)部存儲(chǔ)及API函數(shù)完成更新操作。實(shí)驗(yàn)證明,該方法燒寫效率高,準(zhǔn)確穩(wěn)定,操作簡單,能夠應(yīng)用于嵌入式軟件的在線升級(jí)。
【關(guān)鍵字】串口通信;flash;API;在線更新
中圖分類號(hào): TP332文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 2095-2457(2019)34-0111-002
DOI:10.19694/j.cnki.issn2095-2457.2019.34.049
0 引言
TMS320F2812是美國德州儀器公司推出的一款高性能定點(diǎn)DSP,主頻150MHz,集成了128k的FLASH、18k的SARAM,以及豐富的外部接口,廣泛應(yīng)用于工業(yè)控制等領(lǐng)域。軟件經(jīng)常隨用戶需求更改進(jìn)行更新,傳統(tǒng)更新方式需要拆除外殼連接JTAG仿真器進(jìn)行,這種方法燒寫穩(wěn)定,但是操作繁雜。因此迫切需要一種簡單高效的程序更新方法,設(shè)備一般都會(huì)預(yù)留外部通信接口,因此我們選用常用的串口通過數(shù)據(jù)線對(duì)程序進(jìn)行更新。
1 基本原理及操作流程
一般情況下DSP程序的燒寫是在CCS環(huán)境下通過JTAG仿真器連接設(shè)備和計(jì)算機(jī)實(shí)現(xiàn)的,這種方法雖然操作簡單穩(wěn)定,但是受限于現(xiàn)場條件以及距離。假如DSP被裝入復(fù)雜的整機(jī)結(jié)構(gòu)內(nèi),現(xiàn)場拆解困難,此時(shí)就無法通過傳統(tǒng)JTAG方式進(jìn)行程序更新。DSP本身也提供了一種通過串口進(jìn)行更新程序的方法,該方法需要配置相關(guān)管腳電平,選擇Boot Mode為SCI模式,然后配合相應(yīng)軟件工具進(jìn)行操作,這種方式對(duì)于硬件上事先未對(duì)端口做處理,無法配置電平信號(hào)的設(shè)備無法使用。
通過分析DSP的上電啟動(dòng)過程發(fā)現(xiàn)可以在程序的啟動(dòng)位置加入一段更新程序,用于實(shí)現(xiàn)FLSAH存儲(chǔ)內(nèi)容的燒寫,來達(dá)到程序升級(jí)的目的。該方法不需要改變DSP的啟動(dòng)方式,省去了管腳配置的麻煩,也不受復(fù)雜系統(tǒng)及環(huán)境的限制,可以簡單高效地完成程序的升級(jí)工作。更新程序通過傳統(tǒng)JTAG方式燒寫在指定FLASH空間,其他方式無法對(duì)其進(jìn)行修改擦除,主要來時(shí)間與PC機(jī)輔助程序的串口通信握手,更新文件接收保存,調(diào)用Flash2812_API_V210函數(shù)對(duì)FLASH進(jìn)行擦寫操作。
DSP上電啟動(dòng)時(shí),首先運(yùn)行更新程序,程序啟動(dòng)后稍加延時(shí),等待與PC機(jī)通信握手,如果握手失敗程序跳轉(zhuǎn)至應(yīng)用程序執(zhí)行,握手成功則開始執(zhí)行更新操作,接收PC機(jī)傳輸?shù)母挛募筇幚肀4?,完成接收后將完整文件寫入指定FLASH空間,燒寫操作完成程序跳轉(zhuǎn)至應(yīng)用程序啟動(dòng)位置。該方法完整流程圖如圖1所示。
2 方法具體實(shí)現(xiàn)過程
該更新方法的實(shí)現(xiàn)需要完成應(yīng)用程序文件準(zhǔn)備,上位機(jī)輔助軟件設(shè)計(jì),DSP更新程序設(shè)計(jì),DSP應(yīng)用程序針對(duì)性修改,接下來會(huì)針對(duì)每一部分的實(shí)現(xiàn)進(jìn)行詳細(xì)的說明。
2.1 應(yīng)用程序文件的準(zhǔn)備
應(yīng)用程序通過CCS編譯生成的目標(biāo)文件(.out)不能直接用于燒寫FLASH,使用CCS自帶的工具h(yuǎn)ex2000.exe將.out文件轉(zhuǎn)換為.hex文件,hex文件為bin文件對(duì)應(yīng)的字符文件,直接將hex文件發(fā)送給DSP,由DSP程序進(jìn)行處理轉(zhuǎn)換成對(duì)應(yīng)bin文件并保存到RAM空間。為了提高工作效率,本文將hex2000.exe和out文件放在同一目錄c:\hex下,并編寫批處理文件保存在該目錄,運(yùn)行批處理文件生成hex文件。批處理文件內(nèi)容如下:
2.2 PC輔助軟件設(shè)計(jì)
PC輔助軟件主要是為了保障更新文件的高效準(zhǔn)確傳輸,主要功能為連接設(shè)備、加載文件、文件傳輸以及過程監(jiān)控。連接設(shè)備實(shí)現(xiàn)與DSP設(shè)備的通信握手,使更新程序停留在更新功能。加載文件功能讀入hex文件內(nèi)容,字符串形式按行保存在發(fā)送文件緩沖區(qū)。文件傳輸通過串口通信,將緩沖區(qū)內(nèi)容逐行發(fā)送給DSP更新程序。過程監(jiān)控實(shí)時(shí)接收DSP設(shè)備反饋內(nèi)容,實(shí)時(shí)顯示當(dāng)前文件傳輸、燒寫進(jìn)程。
2.3 更新程序設(shè)計(jì)
更新程序可以實(shí)現(xiàn)程序文件的接收、處理及暫存,程序?qū)懭雽?duì)應(yīng)FLASH,跳轉(zhuǎn)執(zhí)行應(yīng)用程序。更新程序經(jīng)過初始化寫入后不可修改和擦除,因此需要分配獨(dú)立的存儲(chǔ)空間,我們選取了FLASHA用于程序文件及變量的存儲(chǔ),F(xiàn)LASHB用于上電復(fù)位加載程序。這兩個(gè)區(qū)域在用于程序的空間分配中被排除,具體的CMD文件相關(guān)內(nèi)容如下:
SECTIONS
{
Flash28_API:
{
-lFlash2812_API_V210.lib(.econst)
-lFlash2812_API_V210.lib(.text)
} ? ? ? ? ? ? ? ? ? LOAD = FLASHB,
RUN = RAML0,
LOAD_START(_Flash28_API_LoadStart),
LOAD_END(_Flash28_API_LoadEnd),
RUN_START(_Flash28_API_RunStart),
PAGE = 0
.text ? ? ? ? ? ? ? : > FLASHA ? ? ?PAGE = 0
ramfuncs ? ? ? ? ? ?: LOAD = FLASHB,
RUN = RAML0,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
PAGE = 0
}
為了簡化開發(fā)過程,我們以Flash2812_API_V210的DEMO程序?yàn)榛A(chǔ),進(jìn)行功能完善,主要完成以下工作:
(1)SCI端口配置為串口,串口參數(shù)初始化配置,串口采用接收中斷接收PC發(fā)送的指令數(shù)據(jù),對(duì)接收的數(shù)據(jù)進(jìn)行校驗(yàn)處理后暫存到RAM空間備用。
(2)程序上電啟動(dòng)首先判斷PC機(jī)是否發(fā)送了更新指令,根據(jù)指令選擇等待接收文件或者跳轉(zhuǎn)執(zhí)行應(yīng)用程序,采用匯編語言asm("LB 0x3DC000")跳轉(zhuǎn)到指定地址,該地址為應(yīng)用程序存放地址。
(3)文件接收完畢后調(diào)用Example_CallFlashAPI()函數(shù)將文件寫入對(duì)應(yīng)FLASH空間,該空間不能與更新程序定義的兩個(gè)扇區(qū)重疊,防止對(duì)更新程序造成修改。
(4)操作過程通過串口指令發(fā)送給PC程序,PC程序根據(jù)指令顯示當(dāng)前狀態(tài)及進(jìn)度。
2.4 應(yīng)用程序修改
應(yīng)用程序本身不需要進(jìn)行修改,只對(duì)CMD文件配置進(jìn)行修改,定義FLASH空間如下:
Flash_CTOH:origin=0x3DC000,length=0x018000
該段FLASH覆蓋C至H共6個(gè)扇區(qū),可以滿足程序的存儲(chǔ)及加載需求,同時(shí)與更新程序使用的扇區(qū)不重合,操作不會(huì)影響更新程序,具體涉及的使用分配如下:
SECTIONS
{
.text ? ? ? ? ? ?: > Flash_CTOH, ? ? ?PAGE = 0
ramfuncs ? ? ? ? : LOAD = Flash_CTOH, PAGE = 0
RUN = Z2SARAM1, ? PAGE = 0
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart)
}
代碼啟動(dòng)位置存儲(chǔ)在BEGIN_Flash內(nèi),該值為.text分配存儲(chǔ)FLASH區(qū)域的起始地址,BEGIN_Flash內(nèi)容連接JTAG仿真器燒寫程序時(shí)被寫入,本方法中寫入更新程序的代碼啟動(dòng)地址。應(yīng)用程序通過更新程序?qū)懭雽?duì)應(yīng)區(qū)域,不包括BEGIN_Flash的寫入操作,本方法中可以忽略應(yīng)用程序中相關(guān)內(nèi)容,定義與更新程序相同即可。應(yīng)用程序的啟動(dòng)運(yùn)行通過更新程序尾部的地址跳轉(zhuǎn)完成,不使用CMD文件中定義的代碼啟動(dòng)。
3 結(jié)論
本文介紹的這種基于串口通信的DSP程序更新方法,可以在不拆解設(shè)備的情況下實(shí)現(xiàn)軟件的更新升級(jí)。經(jīng)過實(shí)驗(yàn)發(fā)現(xiàn),由于程序文件需要事先通過串口通信發(fā)送至DSP,更新升級(jí)的時(shí)間要比JTAG口燒寫程序耗時(shí)略長。雖然耗時(shí)增加,但是相對(duì)于設(shè)備的拆解時(shí)間幾乎可以忽略不計(jì),因此該方法可以克服困難環(huán)境,應(yīng)用于嵌入式設(shè)備的軟件程序更新升級(jí)中。
【參考文獻(xiàn)】
[1]蘇奎峰,呂強(qiáng),耿慶鋒,等.TMS320F2812原理與開發(fā)[M].北京,電子工業(yè)出版社,2005.
[2]李聲飛,代華山.基于串口通信的DSP程序動(dòng)態(tài)加載技術(shù)[J].電訊技術(shù),2011,5l(6):121-124.
[3]汪晶晶,蘇建徽,孫佩石.基于串口通信的DSP應(yīng)用程序在線升級(jí)方法[J].微型機(jī)與應(yīng)用,2013,32(14):15-17.