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