《電子技術(shù)應用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設計應用 > 基于串口通信的DSP應用程序在線升級方法
基于串口通信的DSP應用程序在線升級方法
來源:微型機與應用2013年第14期
汪晶晶,, 蘇建徽,, 孫佩石
(教育部光伏系統(tǒng)工程研究中心 合肥工業(yè)大學能源研究所,, 安徽 合肥230009)
摘要: 為解決特殊場合DSP程序升級困難的問題,以TMS320F28035為例,,介紹了一種基于串口通信的適合于TMS320C2000系列DSP實現(xiàn)程序更新的在線升級方法,。描述了該在線升級方法的基本思想和實現(xiàn)步驟,,給出了關(guān)鍵部分的程序代碼,。實驗證明,,該方法簡單可靠,可用于嵌入式設備軟件程序的升級更新中,。
Abstract:
Key words :

摘  要:為解決特殊場合DSP程序升級困難的問題,,以TMS320F28035為例,介紹了一種基于串口通信的適合于TMS320C2000系列DSP實現(xiàn)程序更新的在線升級方法,。描述了該在線升級方法的基本思想和實現(xiàn)步驟,,給出了關(guān)鍵部分的程序代碼,。實驗證明,該方法簡單可靠,,可用于嵌入式設備軟件程序的升級更新中,。
關(guān)鍵詞: 在線升級; DSP,;串口通信; Flash

    TMS320C2000系列DSP是美國德州儀器公司(簡稱TI)推出的集微控制器和高性能DSP特點于一身的DSP系列,。該系列的DSP具有強大的控制信號處理能力[1],,能夠?qū)崿F(xiàn)復雜的控制算法。隨著電子技術(shù)的不斷發(fā)展以及用戶需求的不斷提升,,可能需要經(jīng)常對已經(jīng)投入使用的嵌入式設備程序進行更新,,而目前一般的程序升級方法是實地取下設備,露出JTAG端口后通過仿真器來更新程序[2-4]。這種方法雖然簡單有效,,但對于某些特殊場合,會給程序升級帶來了極大的不便[2],。本文以TMS320F28035為例,描述了一種可以脫離JTAG仿真器,不改變DSP上電啟動方式,,實現(xiàn)TMS320C2000系列DSP應用程序在線更新的方法,。
1 在線升級的基本思想
    一般的基于DSP的軟件程序更新是在CCS環(huán)境下通過JTAG接口操作來實現(xiàn)的?;贘TAG接口的方法雖然易于操作,,而且調(diào)試方便,但經(jīng)常受空間以及傳輸距離的限制,。例如一臺DSP系統(tǒng)安裝在復雜,、封閉的環(huán)境下,當程序需要更新或升級時,利用JTAG接口難以實現(xiàn)程序的在線升級[3]。而基于串口通信的在線升級技術(shù)是通過用底層程序燒寫應用程序的方法來達到程序升級的目的,,該方法則不受復雜系統(tǒng)和復雜環(huán)境的限制,。另外,在線升級方法不需要改變DSP的啟動方式,,直接采用DSP默認的內(nèi)部Flash方式啟動[5],從而省去了要對DSP的一些引腳進行硬件設置的麻煩,。底層程序指已經(jīng)固化在DSP指定Flash空間中的程序,不允許用戶修改和擦除,主要用于實現(xiàn)在線升級的時機判斷,、數(shù)據(jù)接收及代碼燒寫等功能,,該程序中使用了Flash2803x_API庫存函數(shù)(詳見2.2節(jié));應用程序即為用戶的升級程序[3],。
    F28035 DSP每次上電復位,,先運行底層程序,與PC機建立聯(lián)系,,然后根據(jù)PC機的指令來判斷是否需要升級應用程序,。若需要,則將通過串口發(fā)送來的應用程序代碼燒寫至F28035片內(nèi)Flash指定扇區(qū);否則將繼續(xù)執(zhí)行原有的應用程序,。當應用程序很大或DSP的RAM空間比較小時,,可采用將應用程序代碼分批發(fā)給DSP,DSP接收并燒寫完一批代碼后,,再進行下一批代碼的接收和燒寫工作,,直到所有的應用程序代碼都燒寫完畢。
2 在線升級的具體實現(xiàn)
2.1 應用程序

    用戶的應用程序經(jīng)過CCS編譯連接生成具有模塊化格式的目標文件(.out),,該文件中的代碼和數(shù)據(jù)分別存放在不同的段中,,因而不能直接用來燒寫Flash,需將其轉(zhuǎn)換為Flash能識別的數(shù)據(jù)格式——二進制文件  (.bin),。本文采用hex2000.exe和FileOshell.exe工具來實現(xiàn)文件轉(zhuǎn)換,。首先,應用程序經(jīng)過編譯連接生成.out文件,,然后通過hex2000.exe把.out文件轉(zhuǎn)換成.hex文件,,再通過FileOshell.exe將文件轉(zhuǎn)換成.bin文件。先做一個批處理文件,,內(nèi)容如下:
    Example_2803xAdcSoc.out
    -map Example_2803xAdcSoc.map
    -o Example_2803xAdcSoc.hex
    -m
    -memwidth 16
    -image
    ROMS
    {
       Flash28035:  origin = 0x3e8000, len= 0x1000, romwidth=
        16, fill=0xFFFF
    }

其中,,Example_2803xAdcSoc.out 是應用程序經(jīng)過CCS生成的文件;-map是生成map文件,;-o是生成hex文件,;-m是Motorola-S 格式;-memwidth 16指存儲器位數(shù)為16 bit,;-image指選擇映像文件,;ROMS 是所需要轉(zhuǎn)換的起始地址、長度,、位數(shù)及填充,。本文選擇從0x3e8000開始,長度是4 KB,,即FlashH,,F(xiàn)lashH中未用的部分用0xFFFF填充,本文把這個批處理文件命名為:Example_2803xAdcSoc.cmd。接下來要生成.bin文件,先做一個MS-DOS型批處理文件,其內(nèi)容如下:     IFileIOShell.exe -i Example_2803xAdcSoc.hex -o Example_2803xAdcSoc.bin
    注意要把Example_2803xAdcSoc.out,、hex2000.exe,、FileIO
Shell.exe、Example_2803xAdcSoc.cmd和MS-DOS型批處理文件放在同一目錄下,,然后雙擊MS-DOS型批處理文件,,即生成所需要的Example_2803xAdcSoc.bin文件。
2.2 底層程序
    底層程序用于實現(xiàn)將串口發(fā)送的數(shù)據(jù)燒寫至Flash的指定部分,,涉及到應用程序的正確定位和復位后的啟動過程,,是實現(xiàn)整個在線升級的重點,。底層程序流程圖如圖1所示。底層程序主要實現(xiàn)以下功能[3]:

    (1)上電復位查詢功能,。上電復位后通過接收上位機發(fā)送的命令判斷是否升級,。若上位機發(fā)送的是升級命令,則跳轉(zhuǎn)到底層程序中升級部分執(zhí)行,;否則,,跳轉(zhuǎn)到原有的應用程序處執(zhí)行。
    (2)搬移燒寫程序的功能,。由于F28035片上Flash不支持在其中一個扇區(qū)運行程序去擦除或燒寫其他扇區(qū),,故完成接收數(shù)據(jù)和燒寫Flash工作的這部分程序(即底層程序中的升級部分程序)需搬移至片內(nèi)RAM或片外RAM上運行。實現(xiàn)程序搬移的函數(shù)為:
    void MemCopy (Uint16 *SourceAddr,  Uint16 *Source End
        Addr, Uint16 *DestAddr)
       {
      while (SourceAddr < SourceEndAddr)
          {
                *DestAddr++ = *SourceAddr++,;
            }
             return ;
    }
其中,,SourceAddr為Flash中升級程序的起始地址,,SourceEndAddr為Flash中升級程序的結(jié)束地址;DestAddr為搬移至內(nèi)存的首地址,。
    (3)接收上位機發(fā)送的應用程序代碼并保存到DSP
指定的內(nèi)存中(一般為RAM區(qū)),。這是通過串口RS232來實現(xiàn)的。并確定用于數(shù)據(jù)保存的這部分內(nèi)存未被占用,。例如,,若需要將應用程序代碼暫存到F28035的L0 SARAM區(qū)域(地址空間0x3F8000-0x3F8800)。定義數(shù)組Uint16 BlockBuffer[2048]用于存儲應用程序代碼,,在底層程序中采用存儲器定位語句,,將上面的緩沖數(shù)組定位到相應的存儲空間:
   #pragma DATA_SECTION(BlockBuffer,“BlockTransferbuffer”);
     在底層程序CMD文件中,采用定位語句,,將BlockTransferbuffer定位到DSP的L0 SRAM空間:
    BlockTransferBuffer:> L0 SARAM  PAGE=2  
                          //地址空間:0x3F8000~0x3F8800
    通過以上底層程序的設置,,可將應用程序緩存到指定的RAM區(qū)域中。
    (4)代碼接收結(jié)束后,,將內(nèi)存中的代碼燒寫至指定Flash扇區(qū),,該步驟通過調(diào)用Flash2803x_API庫函數(shù)完成。底層程序中所用到的Flash2803x_API庫函數(shù)如下[6]:
    ①擦除扇區(qū)的函數(shù)為Uint16 Flash28035_Erase(Uint16 SectorMask,,&Fstatus),,其中,SectorMask為即將被擦除的扇區(qū);&Fstatus為執(zhí)行擦除操作后返回的狀態(tài)值,,用來判斷擦除操作是否成功,。②將程序燒寫到Flash扇區(qū)的函數(shù)為Uintl6 Flash28035_Program(&FlashAddr, &BuffAddr,Length,,&Fstatus),其中,,&FlashAddr為即將被燒寫的Flash扇區(qū)的起始地址,;&BuffAddr為即將準備燒寫的程序當前存放在內(nèi)存空間的首地址;Length為程序長度,;&Fstatus為執(zhí)行燒寫操作后返回的狀態(tài)值,,用來判斷燒寫操作是否成功。③校驗燒寫到Flash中的程序為Uint16 Flash28035_Verify(&FlashAddr,,&BuffAddr,,Length,&Fstatus),其中,&FlashAddr指定從Flash內(nèi)開始比較的首地址,;&BuffAddr為被比較文件的存儲首地址,;Length是需要比較的16 bit字的個數(shù),程序長度;&Fstatus是執(zhí)行校驗操作后返回的狀態(tài)值,用來判斷校驗操作是否成功,。
2.3 底層程序和應用程序的定位
    DSP F28035上電復位后,,CPU將從內(nèi)部Boot Rom獲得復位向量。復位向量指向Boot Rom并執(zhí)行其內(nèi)部的Bootloader程序,,執(zhí)行完畢后確定從內(nèi)部Flash啟動,。程序指針跳轉(zhuǎn)到Flash的0x3F7FF6處。由于這個地址是固定的,,因此底層程序必須燒寫在以這個地址為起始地址的空間內(nèi),。DSP進入底層軟件程序中運行,首先通過接收上位機的命令來判斷是否進行在線升級,,如果進行在線升級,,則跳轉(zhuǎn)到相應升級程序中執(zhí)行;否則,,跳轉(zhuǎn)到原有的應用程序處執(zhí)行,。由底層程序跳轉(zhuǎn)到原有的應用程序處執(zhí)行時,采用絕對地址跳轉(zhuǎn),。部分程序如下所示:
     #define Jumpgxcx (void (*)(void))0x3E8FFE 
                            //定義應用程序的跳轉(zhuǎn)地址
     SCI_SendStatus(“upgrade program? (y/n):”)  
                                 //向上位機詢問是否升級
     temp = SCIA_GetByteData_app();   
                        //接收上位機發(fā)送來的是否升級命令
           if (temp==’y’)                  
           {
                 main2();   //如果升級,,則跳轉(zhuǎn)到升級程序中執(zhí)行
           }
           Else     
           {
                  (*Jumpgxcx)();   
    //如果不升級,則采用絕對地址跳轉(zhuǎn)到應用程序中執(zhí)行
       }
}
    底層程序的cmd配置與應用程序的cmd配置要保持一致,,不能產(chǎn)生地址沖突,。同時,要注意底層程序和應用程序的跳轉(zhuǎn)地址配置,。
    底層程序cmd文件的部分配置如下:
    BEGIN : origin = 0x3F7FF6, length = 0x000002 
    RESET : origin = 0x3FFFC0, length = 0x000002 /*
    codestart : > BEGIN           PAGE = 0
    應用程序cmd文件的部分配置如下:
    BEGIN : origin = 0x3E8FFE, length = 0x000002 
    codestart : > BEGIN         PAGE = 0
3 燒寫步驟
    首先把底層程序通過JTAG接口燒寫到F28035中,,然后再進行應用程序的燒寫。應用程序的燒寫步驟為:先把串口調(diào)試工具的參數(shù)配置為波特率9 600 bit/s,、8 bit數(shù)據(jù)位,、1 bit停止位、沒有奇偶校驗位,;選擇發(fā)送文本文件方式,發(fā)送應用程序的.bin文件到DSP,。由于F28035的RAM區(qū)比較小,可以采取把應用程序代碼分為多次發(fā)送的方式,。燒寫過程如圖2所示。

 

 

    本文介紹了一種基于串口通信的DSP應用程序在線升級技術(shù),,可以在不打開機箱的條件下實現(xiàn)模塊軟件的更新升級,。經(jīng)過實驗發(fā)現(xiàn),采用在線升級技術(shù)來更新程序所耗費的時間比采用JTAG口燒寫程序所耗費的時間要長一些,,但解決了復雜情況下程序升級困難的問題,。總之,,該方法簡單可靠,,可應用于嵌入式設備的軟件程序更新升級中。
參考文獻
[1] 蘇奎峰,,呂強,,耿慶鋒,等.TMS320F2812原理與開發(fā)[M]. 北京:電子工業(yè)出版社,,2005.
[2] 李聲飛,,代華山.基于串口通信的DSP程序動態(tài)加載技術(shù)[J]. 電訊技術(shù),2011,51(6):121-124.
[3] 李靜,,張樹團.TMS320F2812片內(nèi)Flash在線燒寫技術(shù)研究[J].國外電子元器件,,2008(10):37-40.
[4] 孫軼,,許少尉. TMS320F2812芯片的Flash燒寫技術(shù)[J].航空計算技術(shù),,2006,36(5):46-49.
[5] TI公司. TMS320F281x boot ROM serial Flash programming[Z]. 2007.
[6] TI公司. TMS320F2803x piccolo Flash API[Z].2010.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載,。