DSP系統(tǒng)應(yīng)用中FLASH在線編程方法 作者: 時(shí)間:2007-03-09 來(lái)源:網(wǎng)絡(luò) 加入技術(shù)交流群 掃碼加入和技術(shù)大咖面對(duì)面交流海量資料庫(kù)查詢 收藏 摘要:介紹了在TI公司TMS320VC33 DSP應(yīng)用系統(tǒng)中,通過(guò)JTAG口對(duì)DSP外部FLASH存儲(chǔ)器實(shí)現(xiàn)在線編程的方法,給出了DSP系統(tǒng)加電后的自動(dòng)裝載運(yùn)行。 關(guān)鍵詞:DSP JTAG FLASH存儲(chǔ)器 在線編程 Bootload FLASH存儲(chǔ)器是一種高密度、非易失性的電可擦寫(xiě)存儲(chǔ)器,存儲(chǔ)量大,使用方便,適用于低功耗、高性能的系統(tǒng)。在高速DSP應(yīng)用系統(tǒng)中,為了充分發(fā)揮DSP性能,在加電后需要將用戶代碼裝載到高速RAM存儲(chǔ)器中運(yùn)行。下面介紹SST29LE020型FLASH存儲(chǔ)器的燒寫(xiě)方法,以及如何實(shí)現(xiàn)TMS320VC33上電后用戶程序的自舉引導(dǎo)(Bootload)。 1 SST29LE020的特點(diǎn)及操作 SST29LE020是SST公司生產(chǎn)的一種256K%26;#215;8FLASH,它有10萬(wàn)次以上的擦寫(xiě)壽命,其內(nèi)部分為2048個(gè)頁(yè)面,每個(gè)頁(yè)面128字節(jié),頁(yè)面寫(xiě)周期為5ms。如果頁(yè)面中一個(gè)數(shù)據(jù)需要改變,則這個(gè)分區(qū)的所有數(shù)據(jù)必須重新裝入。 FLASH支持軟件數(shù)據(jù)保護(hù)功能(Software Data Protection),當(dāng)執(zhí)行三字節(jié)DSP寫(xiě)指令時(shí),保護(hù)功能將自動(dòng)加上,任何后續(xù)的寫(xiě)操作必須帶上三字節(jié)DSP寫(xiě)指令。 SST29LE020的讀操作與傳統(tǒng)EPROM讀操作一致;在進(jìn)行數(shù)據(jù)編程操作時(shí),它支持內(nèi)部定時(shí)(Internal Timer)、數(shù)據(jù)查詢(Data#Polling)、跳變位(Toggle Bit)三種方式,以測(cè)試內(nèi)部編程操作是否完成。FLASH軟件擦除指令為6字節(jié)加載指令,該指令執(zhí)行后,最多等待20ms整個(gè)芯片便被擦除,即將FLASH每個(gè)數(shù)據(jù)位都恢復(fù)為1狀態(tài)的全FF狀態(tài)。 SST29LE020軟件指令序列可在SST公司的數(shù)據(jù)手冊(cè)上查到,在FLASH編程之前,需對(duì)FLASH進(jìn)行擦除,擦除操作需要六個(gè)總線周期。 FLASH頁(yè)面寫(xiě)操作在使用內(nèi)部定時(shí)方式時(shí)的流程如圖1所示。 2 TMS320VC33簡(jiǎn)介 TMS320VC33是美國(guó)TI公司推出的TMS320C3X系列的32位浮點(diǎn)數(shù)字信號(hào)處理器,它是在TMS320C31浮點(diǎn)DSP的基礎(chǔ)上開(kāi)發(fā)的一個(gè)價(jià)格更低的DSP,該產(chǎn)品具有高速、低功耗、低成本、易于開(kāi)發(fā)等顯著優(yōu)點(diǎn)。TMS320VC33采用內(nèi)部1.8V,外部3.3V供電,因而它的功耗比原有型號(hào)TMS320C31的功耗降低了大約一個(gè)整量級(jí),而且能支持高達(dá)150M/FLOPS的運(yùn)行速率。其主要特性如下: CPU是32bit的高性能CPU:可進(jìn)行16/32b整數(shù)和32/40b的浮點(diǎn)操作;內(nèi)含8個(gè)擴(kuò)展精度寄存器;有2個(gè)地址發(fā)生器、8個(gè)輔助寄存器和2個(gè)輔助寄存器算術(shù)單元(ARAU)。 片內(nèi)存儲(chǔ)器為32bit指令字、24bit地址線、34K%26;#215;32b(1.1Mb)的雙靜態(tài)RAM。 外圍接口具有啟動(dòng)程序裝載功能;內(nèi)含5倍頻的鎖相環(huán)(PLL)時(shí)鐘發(fā)生器;片內(nèi)存儲(chǔ)器可映射外設(shè),其中包括一個(gè)串行口、兩個(gè)32bit定時(shí)器和一個(gè)DMA;具有四個(gè)內(nèi)部譯碼頁(yè)選,可大大簡(jiǎn)化TMS320VC33與I/O及存儲(chǔ)器的接口。 3 TMS320VC33程序引導(dǎo)功能 TMS320VC33具有兩種存儲(chǔ)器映射方式,即MP(Microprocessor Mode)方式和MC/BL(Microcomputer/Bootloader Mode)方式,兩種方式下中斷向量的位置不同。常用的是MC方式。在該方式下,MCBL/MP引腳接高電平,內(nèi)部ROM被映射到000~FFF之間。這段ROM中今有器件生產(chǎn)廠家固化的引導(dǎo)程序(BootLoader),該引導(dǎo)程序可以將DSP實(shí)時(shí)運(yùn)行的程序和數(shù)據(jù)從外部低速ROM或串行口裝入到高速RAM中。 TMS320VC33復(fù)位后即運(yùn)行內(nèi)部固化的引導(dǎo)程序,引導(dǎo)程序通過(guò)查詢四個(gè)中斷引腳來(lái)確定裝入方式。這些引腳為低電平有效,查詢順序依次為INT3、INT0、INT1、INT2;當(dāng)INT3有效時(shí),為串行裝入方式;當(dāng)INT0有效時(shí),從外部地址0x001000處裝入(BOOT1);當(dāng)INT1有效時(shí),從外部地址0x400000處裝入(BOOT2);當(dāng)INT2有效時(shí),從外部地址0xfff000處裝入(BOOT3)。 TMS320VC33具有四個(gè)快速頁(yè)選信號(hào),用于對(duì)外部地址空間尋址。 使用外部存儲(chǔ)器裝入數(shù)據(jù)時(shí),外部存儲(chǔ)器數(shù)據(jù)頭位置需包含以下信息: (1) 外部存儲(chǔ)器寬度(8/16/32位);(2) 程序代碼塊的長(zhǎng)度; (3) 裝入數(shù)據(jù)的目的起始地址; (4) 存儲(chǔ)器訪問(wèn)的定時(shí)控制參數(shù)。 頭信息之間是用戶的程序代碼,程序代碼按低位在前、高位在后的順序排列。程序代碼之后,必須有一個(gè)全零字,即0x00000000,用以指示引導(dǎo)程序用戶程序代碼已結(jié)束。引導(dǎo)完成后,即從裝入的目的地址處開(kāi)始執(zhí)行用戶程序。 4 FLASH在線編程方法 TMS320VC33的調(diào)試使用CC for C3x/4X(Code COmposer)集成編程環(huán)境,通過(guò)JTAG頭仿真用戶板,用戶代碼先放在外部RAM中調(diào)試,調(diào)試成功后,就可以將用戶程序代碼寫(xiě)入FLASH了。下面介紹在并行裝入BOOT2方式下的在線編程方法。 SST29LE020與TMS320VC33的連接方式比較簡(jiǎn)單,F(xiàn)LASH片選CE引腳直接連接至TMS320VC33的PAGE1引腳;FLASH的輸出使能OE引腳的最簡(jiǎn)單的處理方法是采用跳線方式(當(dāng)向FLASH寫(xiě)入數(shù)據(jù)時(shí),接高電平;通常情況下,接地)。 在調(diào)試用戶程序時(shí),需根據(jù)用戶板的存儲(chǔ)器空間分配制作CMD文件,假設(shè)用戶擴(kuò)展的外部RAM為32bit,起始地址為0x00c00000,長(zhǎng)度為32K;外部FLASH起始地址為0x00400000(使用BOOT2方式),長(zhǎng)度為256K。其CMD文件如下: MEMORY { INTRAM1:origin=0x00800000,length=0x00008000 INTRAM2:origin=0x00809800,length=0x000007c1 VEC:origin=0x00809fc1,length=0x3f EXTRAM:origin=0x00c00000,length=0x00008000/*32k*/ FLASH:origin=0x00400000,length=0x00040000/*256*/ } SECTIONS {/*用戶程序代碼及初始化數(shù)據(jù)放在外部RAM*/ .vectors>VEC /*VC33規(guī)定的中斷向量地址*/ .text :LOAD=EXTRAM .cinit>EXTRAM .data:RUN=EXTRAM .bss:RUN=INTRAM2 .stack>INTRAM1 } 第一步:在CC下編譯后,裝入用戶.OUT文件,用戶程序代碼即被寫(xiě)入EXRAM空間。 第二步:依據(jù)TMS320VC33的BOOT格式,并根據(jù)CC產(chǎn)生的用戶.MAP文件找出程序入口地址、各加載塊的入口地址以及長(zhǎng)度,編寫(xiě)FLASH燒寫(xiě)文件。示例源程序清單如下: #define MEM_WIDE 0x00000008 /*Flash存儲(chǔ)器寬度*/ #define CG_REGISTER 0x000010c8 /*全局存儲(chǔ)器配置參數(shù)*/ #define ENTER_POINT 0x00c00064 /*程序代碼入口地址*/ volatile int *flash_add=(volatile int *)0x400000;/*外部Flash的映射地址*/ #define BOOTORG 0xc00064 /*.MAP文件中的程序入口地址 #define BOOTBLK 3/*.MAP 文件中的加載塊數(shù)量*/ #define BOOTSRC1_ADD 0x00809fc1 /*第1個(gè)加載塊地址*/ volatile int *bootblk1_add=(volatile int *)0x00809fc1; #define BOOTBLK1_LEN 0x3a /*第1個(gè)加載塊長(zhǎng)度*/ #define BOOTSRC2_ADD 0x00C00000 /*第2個(gè)加載塊地址*/ volatile int *bootblk2_add=(volatile int *)0x00c00000; #define BOOTBLAK2_LEN 0xa3 /*第2個(gè)加載塊長(zhǎng)度*/ #define BOOTSRC3_ADD 0x00C000a3 /*第3個(gè)加載塊地址*/ volatile int *bootblk3_add=(volatile int *)0x00c000a3; #define BOOTBLK3_LEN 0x17 /*第3個(gè)加載塊長(zhǎng)度*/ //////////////////////////////////////////// unsigned int flashaddnum,bytenum; /*定義Flash地址及頁(yè)面字節(jié)數(shù)變量*/ void waite(int ms)/****軟件 1ms子程序****/ {…………;} void sdp_flash()/******軟件數(shù)據(jù)保護(hù)子程序*********/ {flash_add[0x5555]=0xaa;/*3字節(jié)芯片SDP指令*/ flash_add[0x2aaa]=0x55; flash_add[0x5555]=0xa0; } void era_flash()/******擦除芯片子程序*********/ {flash_add[0x5555]=0xaa;/*6字節(jié)芯片擦除指令*/ flash_add[0x2aaa]=0x55; flash_add[0x5555]=0x80; flash_add[0x5555]=0xaa; flash_add[0x2aaa]=0x55; flash_add[0x5555]=0x10; waite(20); /*20ms等待芯片擦除完成*/ } void write_flash(int bootdata)/***寫(xiě)一個(gè)int型數(shù)據(jù)***/ {unsigned int i; for(i=0;i<3;i++) /*一個(gè)int型數(shù)分成四個(gè)字節(jié)寫(xiě)入*/ {if(bytenum==0) /*如果是頁(yè)面第1個(gè)字節(jié),先寫(xiě)SDP指令*/ {sdp_flash();} flash_add[flashaddnum]=bootdata; /*向Flash地址寫(xiě)一個(gè)字節(jié)*/ flashaddnum++; /*Flash地址加1*/ bytenum++; /*頁(yè)面字節(jié)加1*/ if(bytenum>127) /*一個(gè)頁(yè)面寫(xiě)完,頁(yè)面字節(jié)置0,等待11ms*/ {bytenum=0;waite(11);} bootdata>>=8; /*待寫(xiě)數(shù)據(jù)右移8位*/ } } void main() /***主程序***/ {unsigned int i,j,lenth; bytenum=0;flashaddnum=0; /*Flash地址及頁(yè)面字節(jié)數(shù)置*/ waite(1); /*等待1ms*/ era_flash(); /*擦除Flash芯片*/ write_flash(MEM_WIDE); /*寫(xiě)外部Flash存儲(chǔ)器寬度*/ write_flash(CG_REGISTER); /*寫(xiě)寄存器配置參數(shù)*/ write_flash(1); /*第1個(gè)boot的數(shù)據(jù)長(zhǎng)度為1*/ write_flash()ENTER_POINT; /*寫(xiě)入boot的目的地址*/ write_flash(0); /*第1個(gè)boot的數(shù)據(jù)*/ for(i=0;iINTRAM1 .stack>INTRAM1 } 第四步:運(yùn)行燒寫(xiě)程序,用戶代碼即被寫(xiě)入FLASH中,將FLASH的OE引腳跳線連通至的位置,利用CC可以查看FLASH存儲(chǔ)器內(nèi)容是否與要燒寫(xiě)的內(nèi)部一致,并脫機(jī)檢驗(yàn)。 FLASH在線編程方法已在用戶板上得到了驗(yàn)證,達(dá)到了預(yù)期的目的。通過(guò)JTAG仿真器對(duì)TMS320VC33用戶系統(tǒng)外部FLASH的在線編程,可以省去HEX轉(zhuǎn)換工具及EPROM編程器等工具,且具有方便、易行的特點(diǎn)。該現(xiàn)場(chǎng)在線編程的方法可推廣至其它系列DSP用戶系統(tǒng),是DSP開(kāi)發(fā)中需要掌握的一項(xiàng)新技術(shù)。
評(píng)論