??? 摘? 要: FLASH存儲器的在系統(tǒng)編程技術(shù)及其基本命令,并結(jié)合TMS320C3X系列DSP的上電系統(tǒng)自動引導(dǎo)功能,介紹了利用該技術(shù)將用戶程序代碼燒寫到FLASH存儲器中的方法。該方法能夠?qū)崿F(xiàn)DSP系統(tǒng)上電后的用戶程序自動引導(dǎo)。?
??? 關(guān)鍵詞: FLASH存儲器? DSP? 在系統(tǒng)編程? 上電引導(dǎo)
?
??? 現(xiàn)在,數(shù)字信號處理器(DSP)正越來越多地應(yīng)用到各種場合。而FLASH存儲器已成為DSP系統(tǒng)的一個基本配置,主要用來存放用戶程序代碼。目前FLASH存儲器正在從單純的EPROM的替換件演變?yōu)樵S多電路系統(tǒng)中的不可缺少的組成部分。?
??? 將用戶程序代碼裝入FLASH存儲器的方法有三種。一種方法是要求供應(yīng)商在存儲器發(fā)貨前將數(shù)據(jù)寫入,但無法滿足產(chǎn)品開發(fā)階段用戶修改程序的要求。另一種方法是用戶使用編程器自己編程。但由于芯片制造工藝的提高,芯片集成度越來越高,FLASH存儲器正在向小型化、貼片式發(fā)展,從而使表面貼裝或PLCC封裝的FLASH存儲器難以利用編程器編程。第三種方法是將存儲器安裝到用戶電路板上進行編程。這包括現(xiàn)在普遍采用的在系統(tǒng)編程(In System Programming,ISP)。這種編程方式是通過系統(tǒng)的微處理器實現(xiàn)對FLASH存儲器的編程,不需要其它編程設(shè)備和附加編程電源,具有靈活、方便的優(yōu)點,因此廣泛應(yīng)用在DSP系統(tǒng)中。本文結(jié)合TMS320C3X系列DSP的上電引導(dǎo)表的產(chǎn)生及燒寫方法分析FLASH存儲器的在系統(tǒng)編程技術(shù)。?
1 FLASH存儲器的在系統(tǒng)編程技術(shù)?
1.1 AMF400B FLASH存儲器簡介?
??? AMF400B 是AMD公司生產(chǎn)的FLASH存儲器,這種FLASH存儲器編程簡單,下面以此為例對FLASH存儲器的編程進行介紹。?
??? AMF400B的主要特點有:僅需5V單電源供電便可使內(nèi)部產(chǎn)生高電壓進行編程和擦除操作;完全支持JEDEC單電源FLASH 存儲器標(biāo)準(zhǔn);支持在系統(tǒng)編程,用戶只需向其命令寄存器寫入標(biāo)準(zhǔn)的微處理器指令,具體編程、擦除操作便由內(nèi)部電路實現(xiàn);主系統(tǒng)可以通過查詢特定的管腳或數(shù)據(jù)線監(jiān)控編程、擦除操作是否完成;可以對某一扇區(qū)進行操作,而不影響其它部分的數(shù)據(jù);有硬件數(shù)據(jù)保護功能,以防止誤操作。?
1.2 編程命令?
??? 雖然用戶僅需向FLASH存儲器的特定寄存器寫入地址和數(shù)據(jù)命令,就可對FLASH存儲器編程,但是如果寫入的地址和數(shù)據(jù)錯誤或?qū)懭氲捻樞虿徽_,就會導(dǎo)致FLASH存儲器復(fù)位。下面介紹幾個最常用的編程命令。?
??? 讀數(shù)據(jù)命令:該命令不需要特定的時序,在電路上電或內(nèi)部編程擦除操作結(jié)束后,自動進入讀數(shù)據(jù)狀態(tài)。只需給出要讀取的地址,即可讀出該地址的內(nèi)容。?
??? 復(fù)位命令:該命令使存儲器復(fù)位,并進入讀數(shù)據(jù)狀態(tài)。向任何一個地址寫入數(shù)據(jù)0xF0就能使FLASH存儲器復(fù)位。在進行編程、擦除和自動選擇命令模式之前,都應(yīng)先復(fù)位。此外,在編程或擦除等正常操作中若出現(xiàn)錯誤,也應(yīng)寫復(fù)位命令退出。?
??? 自動選擇命令:該命令可以使主系統(tǒng)讀取存儲器生產(chǎn)廠家、設(shè)備代碼以及是否被保護等信息。?
??? 編程命令:該命令是一個4總線周期指令。以兩個解鎖周期開始,緊接著一個編程建立命令,最后是要編程的地址和數(shù)據(jù)。寫完該地址和數(shù)據(jù)后,內(nèi)置編程算法自動啟動,進行FLASH存儲器編程。編程算法完成后,進入讀取數(shù)據(jù)狀態(tài)。編程時序如表1所示。?
?
?
??? 擦除命令:該命令有片擦除和扇區(qū)擦除兩種。兩種擦除命令基本相似,片擦除指令用得較多,這里僅介紹片擦除指令。片擦除命令是一個6總線周期的操作,也以兩個解鎖周期開始,接著一個建立周期,再接著兩個解鎖周期,最后是擦除周期。該擦除命令啟動內(nèi)部擦除算法,自動完成擦除操作。其時序如表2所示。?
?
?
??? 由于只有擦除指令能使“0”變?yōu)椤?”,而編程指令不能使“0”寫為“1”,所以用戶在進行FLASH存儲器燒寫時,應(yīng)先擦除,再進行編程。?
1.3 FLASH存儲器操作的檢查機制?
??? 對采用在系統(tǒng)編程的FLASH存儲器,整個燒寫過程都由用戶控制,用戶必須了解FLASH存儲器的各狀態(tài)位,以便知道編程或擦除是否完成。?
??? FLASH內(nèi)部提供了幾個供用戶讀取的狀態(tài)位。其中常用的有:數(shù)據(jù)線的DQ2(跳變位)、 DQ5(超時標(biāo)志位)、DQ6(跳變位)、DQ7(數(shù)據(jù)查詢位)和管腳RY/BY#。?
??? 有三種方法可以判斷某種操作是否進行完。一種是判斷管腳RY/BY#的狀態(tài)。在編程、擦除或擦除懸掛操作過程中,RY/BY#管腳為“0”;操作完成后變?yōu)椤?”。另一種是用DQ7和DQ5判斷。DQ7位在編程或擦除過程中輸出的是寫入該位數(shù)據(jù)的反碼,而當(dāng)操作完成時,該位輸出變?yōu)閷懭朐撐坏臄?shù)據(jù),因此查詢此位可以判斷操作進程。但還要讀取DQ5的狀態(tài),若為“1”,操作超時,應(yīng)再讀一次DQ7的狀態(tài),若DQ7輸出仍不是寫入的數(shù)據(jù),則操作失敗,應(yīng)將FLASH復(fù)位。其流程如圖1所示。還有一種是檢測跳變位。在對FLASH存儲器進行編程或擦除時,對任何地址進行連續(xù)的讀會引起DQ6不斷跳變,而一旦操作結(jié)束就停止跳變。其流程如圖2所示。
?
?
1.4 FLASH存儲器的操作程序?
??? 采用前面的命令字和操作進程檢測方法,用戶就可以用DSP編程語言編寫FLASH存儲器操作程序了。下面給出擦除和編程子程序的部分代碼。?
/*Sample codes for erase and program*/?
cerase:?PUSH???DP?????????????????? ?
?????????PUSH?? R0???????????????????? ?
?????????....???/*擦除命令*/?
chkc: LDI *AR0,R0?
?????? NOP????? ?????? /*檢查擦除是否完成*/?
?????? NOP?
?????? XOR *AR0,R0?
?????? BNZ ??? chkc?
?????? POP??? ?R0?
?????? POP ??? DP?
?????? RETS?
sprg: PUSH ?? DP???????????????? ?
?????? PUSH??? R0?????????????????? ?
?????? ....???????? ?????? /*編程命令*/?
chkp: LDI *-AR2(1),R0?
?????? NOP?? ????????? /*檢查編程是否完成*/?
?????? NOP?
?????? XOR???? ??????? *-AR2(1),R0?
?????? BNZ???? chkp ?
???????POP???? R0?
?????? POP???? DP?
?????? RETS?
2 TMS320C3X系列DSP的上電引導(dǎo)功能?
??? 實際DSP電路中,調(diào)試后的用戶程序必須能夠脫離仿真器獨立運行,這就涉及到如何將用戶程序代碼編程到FLASH存儲器中。用戶程序執(zhí)行有兩種方式:一種是上電后用戶程序直接在FLASH存儲器中運行;另一種是上電后將用戶程序從FLASH存儲器引導(dǎo)到高速數(shù)據(jù)存儲器中運行。由于第一種方式影響程序的運行速度,現(xiàn)在大多數(shù)實際電路都采用第二種方法。下面以TI公司的TMS320C3X系列DSP為例,說明如何由仿真器最初生成的可執(zhí)行文件實現(xiàn)第二種方法的過程。?
2.1 MS320C3X的上電引導(dǎo)程序和引導(dǎo)表?
??? 引導(dǎo)程序(boot loader)是在一些DSP(如C3X,C4X系列)片內(nèi)固化的一個程序,它負責(zé)上電時初始化存儲器。換句話說,它將程序從非易失性存儲器(如EPROM或FLASH存儲器)中調(diào)入系統(tǒng)的存儲器中。?
??? 引導(dǎo)程序要調(diào)入的代碼稱為引導(dǎo)表(boot table)。引導(dǎo)表中除了包括源代碼之外還,包含一些附加信息。這些信息指導(dǎo)引導(dǎo)程序的具體執(zhí)行過程。一方面,存放引導(dǎo)表的介質(zhì)一般都是物理總線寬度小的存儲器(如8位,16位等),而DSP系統(tǒng)總線的寬度一般都是32位的(對C3X,C4X系列),因此就存在著代碼的拆分與組合問題,這就需要一些附加信息來“告訴”引導(dǎo)程序;另一方面,TI的DSP的可執(zhí)行文件是COFF格式的,它將程序代碼分為很多不同的段(如.text,.bss,.const等),這些段的大小和存儲地址都是不同的,因此也需要額外的信息來說明。因此可以說引導(dǎo)表是由程序代碼和一些附加信息組成的一種數(shù)據(jù)結(jié)構(gòu)。?
??? 每一種DSP,其引導(dǎo)表的數(shù)據(jù)結(jié)構(gòu)也是不同的,但其基本結(jié)構(gòu)差不多。具體來說引導(dǎo)表的格式主要由下面幾部分組成:首先是一個包含引導(dǎo)表數(shù)據(jù)寬度和其它數(shù)據(jù)總線控制寄存器值的文件頭;接著是COFF文件中各個段的數(shù)據(jù),其中每個段又都包含一個該段的文件頭來指示該段的代碼長度及目標(biāo)地址;最后是一個結(jié)束段,表明程序代碼的結(jié)尾。?
2.2 如何產(chǎn)生引導(dǎo)表?
??? 由于COFF文件格式與引導(dǎo)表格式對用戶是透明的,因此用戶可以自己編程由COFF格式生成引導(dǎo)表。這無疑是一項很繁瑣的工作,幸好DSP公司一般都在它們的開發(fā)軟件中提供了一個轉(zhuǎn)換工具,如TI公司的HEX30工具。這樣,用戶需要做的只是提供一個命令文件,即可由轉(zhuǎn)換工具生成可以上電引導(dǎo)的引導(dǎo)表。?
??? 在生成引導(dǎo)表時,應(yīng)特別注意幾個“字寬度”的概念。只有正確理解這幾個概念,才能生成正確的引導(dǎo)表。首先是目標(biāo)字寬度。它指COFF文件內(nèi)原始數(shù)據(jù)的寬度,是指處理器的操作碼長度。對特定DSP,該長度是固定的,不能改變。其次是數(shù)據(jù)寬度,可用-datawidth設(shè)定,它指在COFF文件中存有的某段數(shù)據(jù)的邏輯寬度。再次是存儲器寬度,可用-memorywidth設(shè)定,它指存儲器系統(tǒng)的物理寬度。最后是ROM寬度,用-romwidth設(shè)定。它指每塊ROM設(shè)備的物理寬度,同時也對應(yīng)HEX30工具輸出文件的寬度。下面的例子可以說明這幾個字寬度的概念。?
??? 例如,DSP為TMS320C32,用來存儲程序的FLASH存儲器是16位的,只用一塊FLASH。則命令文件可以按如下編寫:?
/*Command file for the hex utility*/?
??? prog.out?????????? ;COFF文件名?
??? -boot???????????? ;引導(dǎo)所有段的內(nèi)容?
??? -i??????????????? ;輸出文件的格式?
??? -memorywidth 16?
??? -bootorg 1000h?
??? ROMS?
??? {?
??? EPROM:? org=1000H, len=2000H,?
??? romwidth=16,files={prog.i0}?
??? }?
3 利用ISP對上電引導(dǎo)FLASH存儲器編程?
??? 上述的命令文件中有一個選項-i,這是指定輸出文件格式的選項。TI公司HEX工具可以支持多種格式,如ASCII-HEX、Intel、Motorola、TI-tagged、Tektronix等,這些文件都是文本格式的文件,都有固定的格式。以Intel格式為例,生成的文件的每行都有一9個字符的前綴,結(jié)尾有2個字符的檢驗位。若用EPROM編程器,則此文件就是編程器的輸入文件,可以直接使用。但對前面所說的在系統(tǒng)編程,編程程序本身就是一段DSP程序,要想讓此程序識別生成的引導(dǎo)表,還需要對文件進行轉(zhuǎn)換。?
??? 由于編程程序也是一段DSP程序代碼,最后生成的也是COFF格式,因此可以將引導(dǎo)表作為編程程序的一個初始化段,程序運行時將該段的內(nèi)容寫到FLASH所在的空間即可。?
??? 剩下的問題就是如何將HEX工具生成的文件轉(zhuǎn)化為DSP程序能識別的文件格式。由前面的內(nèi)容可知,每種格式的文件都包含自己獨特的頭文件,因此可以編寫一段簡單的C語言程序?qū)⑦@些與引導(dǎo)無關(guān)的“頭”去掉,分離出引導(dǎo)表,然后按特定格式將這部分內(nèi)容寫成一個數(shù)據(jù)文件。在編程程序中,為引導(dǎo)表建立一個段,將此數(shù)據(jù)文件嵌入即可。這樣,運行編程程序就能將引導(dǎo)表內(nèi)容燒寫到指定的FLASH存儲器中。整個編程過程如圖3所示。?
?
?
??? 例如,最初的COFF文件為prog.out,C語言程序?qū)EX工具生成的prog.i0文件轉(zhuǎn)化為prog.dat,那么最后的燒寫程序類似下面所給出的格式。?
??? /*A sample FLASH programming routine*/?
??? ....?
??? code?? .sect ″.FLASH″?
??? .include prog.dat?
??? ....?
??? _main: ?
??? ....??????????? ??????????? /*初始化及擦除子程序*/?
??? LDI @CODE_PTR,AR3 ???? /*CODE_PTR的值是code*/?
??????? LDI code_len,AR4?????? /*要燒寫的代碼長度*/?
??????? CALL FLASH_mprg???? /*調(diào)用編程子程序*/?
??? ....?
??? FLASH_mprg:?
??? ....?
??????? CALL sprg?? ??????? /*調(diào)用單個字編程子程序*/?
??????? BNZ FLASH_mprg?
??????? ....?
??????? RETS?
??? 前面各部分,結(jié)合TMS320C3X系列DSP的上電引導(dǎo)功能,介紹了利用在系統(tǒng)編程技術(shù)將用戶程序代碼編寫到FLASH存儲器中的方法,給出了相應(yīng)環(huán)節(jié)的程序流程圖和部分操作的程序示例。通過實際TMS320C32的DSP電路調(diào)試實驗,證明本文的方法能夠?qū)崿F(xiàn)FLASH存儲器的在系統(tǒng)編程和DSP系統(tǒng)上電后的用戶程序自動引導(dǎo)。?
參考文獻?
1 TMS320C3X User’ Guide. Texas Instruments,1997?
2 TMS320C3X/4X Assembly Language Tools User’s Guide.Texas Instruments,1997?
3 Markus Levy. 閃速存儲器設(shè)計工具概覽. 電子設(shè)計技術(shù)EDN China, 1996(12):42~45?
4 Antony Watts. 正確選擇非易失性存儲器.電子設(shè)計技術(shù)EDN China,1996(6):38~43