陜西凌云電器集團有限公司設(shè)計所 張 亮 劉延海
?
TMS320C6713 DSP的FLASH自引導(dǎo)及一種另類的燒寫方法
陜西凌云電器集團有限公司設(shè)計所張亮劉延海
FLASH存儲器是在EPROM和EEPROM的基礎(chǔ)上發(fā)展起來的一種非易失性存儲器,在掉電情況下仍能保證數(shù)據(jù)不丟失,并能夠在不離開電路板或數(shù)據(jù)設(shè)備的情況下實施檫除和在編程操作。由于其具備結(jié)果簡單、維護便利、存取速度快、對環(huán)境適應(yīng)性強、抗震性好等優(yōu)點十分適用于嵌入式系統(tǒng)的設(shè)計和開發(fā),并且以成為目前流行的數(shù)字信號處理系統(tǒng)的一個基本配置。
TI高速信號處理器TMS320C6000系列DSP需要從外部的ROM存儲器中引導(dǎo)程序,由于外部存儲器的種類很多,TI不在提供統(tǒng)一的燒寫工具,需要使用者自行解決,如何將寫好的程序燒寫入ROM中并能讓DSP引導(dǎo)運行起來,是TMS320C6000系列DSP開發(fā)過程中的重點和難點之一。本文主要介紹基于TMS320C6713 DSP的FLASH自引導(dǎo)及一種另類的FLASH燒寫方法。
DSP加電后,RESET信號為低,芯片復(fù)位。在RESET信號上升沿,讀取BOOTMODE[4:0]狀態(tài),以此來決定DSP的存儲器映射方式、地址0處得存儲器類型及復(fù)位后芯片的自引導(dǎo)方式。
TMS320C6713 DSP有三種引導(dǎo)方式,其操作過程分別如下:
1)不加載。CPU直接開始執(zhí)行地址0處得存儲器中的指令。如果該處存儲器是SDRAM,那么DSP會先掛起,等待SDRAM的初始化完成。
2)主機加載。核心CPU停留在復(fù)位狀態(tài),芯片其余部分保持正常狀態(tài),在這期間,外部主機通過主機接口初始化CPU的存儲空間,包括片內(nèi)配置寄存器。主機完成所有的初始化工作后,結(jié)束引導(dǎo)過程,CPU退出復(fù)位狀態(tài),開始執(zhí)行地址0處得指令。
3)ROM加載。位于外部CE1空間的ROM中的程序首先通過DMA/EDMA被搬入地址0處。盡管加載過程是在芯片從復(fù)位信號被釋放后才開始的,但是當(dāng)芯片仍處于復(fù)位時,就開始了上述傳輸過程。傳輸完成之后,CPU退出復(fù)位狀況,開始執(zhí)行地址0處得指令。
本文介紹的DSP的Flash自引導(dǎo)屬于上述 3種引導(dǎo)模式中的ROM加載模式,TMS320C6713 DSP每次只能搬移1Kb大小的數(shù)據(jù)到地址0處,而實際使用中程序肯定會大于1K,因此必須進行二次引導(dǎo)搬運(secondary bootloader)。二次引導(dǎo)搬運是指,DSP啟動后,CPU被鎖住,DMA/EDMA自動從外部Flash首地址搬移1Kb的程序到DSP內(nèi)部cache的首地址,搬移完成,激活CPU,運行該1Kb的程序,而該1Kb程序是二次引導(dǎo)搬運程序,即將真正需要運行的程序從外部Flash搬運至DSP內(nèi)部cache中,完成后,進入中斷c_int00(),進行DSP系統(tǒng)的初始化,開始運行main()主程序,完成自啟動。下面介紹二次引導(dǎo)搬運程序也就是Bootloader()程序的編寫。
首先Bootloader()程序一般編寫都是采用匯編語言來實現(xiàn),可以在互聯(lián)網(wǎng)上找到很多現(xiàn)成的例子,這里就不多做介紹。其實用C語言也一樣可以實現(xiàn),并且簡單易懂。將Bootloader()程序?qū)懭?**.c的文件中然后加入到目標(biāo)工程中即可,具體程序如下:
//Flash使用的是AMD公司的AM29LV033C(4M*8-Bit)
#define MEM_ADDR0x00000400
#define FLASH_ ADDR0x90000400
#define EMIF_GCR0x01800000
#pragma CODE_SECTION(bootload,".boot_load");
extern far void c_int00(void);
void bootload(void)
{register int code_i , code_Num;
*(unsigned char *)EMIF_GCR = 0x3300;
code_Num = 0x10000; // 這個地址存放的是要搬移的字節(jié)數(shù),可根據(jù)實際情況修改
for((code_i) = 0;(code_i)<(code_Num);(code_i)++)
{
*(unsigned char *)(MEM_ADDR+(code_i)) = *(unsigned char *)(FLASH_ADDR + (code_i));
}
c_int00();
}
修改目標(biāo)工程的.cmd文件,將Bootloader程序指向DSP內(nèi)部RAM中的前1Kb地址中(粗體為需加入的代碼),目標(biāo)工程的其他代碼放在其后,必須避開這1Kb(0x400)的空間。
MEMORY
{
BOOT_RAM: org =0x0000000len = 0x0000400
IRAM: org = 0x0000400len = 0x0002FC00
}
SECTIONS
{
.boot_load > BOOT_RAM
………..//省略若干
.cio > IRAM
}
配置好引導(dǎo)方式和引導(dǎo)文件,還需將目標(biāo)程序的生成的目標(biāo)代碼寫入Flash中。一般的方法是用TI的編譯工具CCS編譯連接生成目標(biāo)文件(.out文件),但該.out文件不是COFF文件格式,F(xiàn)LASH不支持這種文件,所以不能直接寫入FLASH中,必須使用TI公司提供的工具hex6x.exe將.out轉(zhuǎn)換.hex文件,再通過工具hex2bin.exe轉(zhuǎn)換為.bin文件,根據(jù)具體使用的Flash型號編寫相應(yīng)的燒寫程序?qū)?bin文件寫入Flash中。
本文介紹Flash燒寫方法是將DSP片內(nèi)RAM中運行的程序直接燒寫入Flash中,首先通過JTAG將目標(biāo)文件的.out文件下載到片內(nèi)RAM,這時再通過JTAG下載一個Flash燒寫程序,將片內(nèi)RAM中的程序?qū)懭隖lash中即可,省去了前面轉(zhuǎn)換文件格式的過程。創(chuàng)建一個FlashBurn工程,將她所占用的數(shù)據(jù)空間避開前面要燒寫目標(biāo)程序所使用的數(shù)據(jù)空間。因為前面加載的工程文件已經(jīng)占用了片內(nèi)RAM前面的地址,如果地址重疊的話,后面加載的Flash燒寫程序會改變前面工程文件占用的片內(nèi)RAM地址中的內(nèi)容,導(dǎo)致燒寫內(nèi)容錯誤??梢酝ㄟ^前面工程文件生成的.map文件查看工程文件所占用的片內(nèi)RAM地址。如下:
MEMORY CONFIGURATION
nameoriginlengthusedattrfill
-----------------------------------------------------------
BOOT_RAM0000000000000400000000a0RWIX
IRAM000004000002fc00000197acRWIX
工程文件分配長度為0x2fc00字節(jié),實際使用0x197ac字節(jié)。Flash燒寫程序避開0x19bac(0x400+0x197ac)之前的地址即可,推薦這個地址盡可能的大于分配的地址0x30000(0x400+0x2fc00)。
Flashburn工程文件的.cmd文件如下
MEMORY
{
IRAM: org = 0x00030000len = 0x00000C00
}
這樣Flashburn.out文件就會下載到0x00030000~0x00030C00地址之間,不會把之前下載的.out文件沖掉。
下載Flashburn.out文件并點擊運行,首先檫除整片F(xiàn)LASH,由于FLASH型號不同所以檫除指令有所差異,具體檫除指令可以查詢所使用芯片的數(shù)據(jù)手冊,這里不作具體描述。其次將片內(nèi)RAM中0x00000000的數(shù)據(jù)(也就是Bootloader的代碼)寫進0x90000000,具體寫多少可以根據(jù)Map文件決定,也可以直接寫1K數(shù)據(jù)。最后把從0x00000400的開始代碼寫進0x90000400之后.寫進去的字節(jié)數(shù)就是上述.map文件中的0x197ac。
到此,片內(nèi)RAM中從0x00000000開始存放的目標(biāo)文件的代碼就全部寫進flash中去了,可以通過CCS窗口去查看是不是一樣。
斷開電源,再開電,DSP首先把0x900000000開始的1K字節(jié)搬移進片內(nèi),也就是Bootloader,然后Bootloader把代碼從0x90000400搬移到片內(nèi)的0x00000400,搬移完成之后,就跳到C_int00去執(zhí)行程序,完成了自啟動。
本文實現(xiàn)了TMS320C6713 DSP的FLASH自引導(dǎo)及FLASH的燒寫,工程實現(xiàn)簡單可靠,并提出一種另類的FLASH燒寫方法,有助于大家對DSP引導(dǎo)系統(tǒng)的理解。
參考文獻
[1]Texas Instruments:TMS320C6713B FLOATING-POINT DIGITAL SIGNAL PROCESSOR data sheet(SPRS294BOCTOBER 2005-REVISED JUNE 2006).
張亮(1982—),男,工程師,現(xiàn)供職于陜西凌云電器集團有限公司設(shè)計所,主要從事數(shù)字電路設(shè)計、圖像處理、嵌入式方面的應(yīng)用與開發(fā)。
劉延海(1983—),男,工程師,現(xiàn)供職于陜西凌云電器集團有限公司設(shè)計所,主要從事數(shù)字電路設(shè)計、圖像處理、嵌入式方面的應(yīng)用與開發(fā)。
作者簡介: