摘 要: 隨著DSP" title="DSP">DSP的廣泛應用,如何對DSP系統上的FALSH重新編程" title="編程">編程的問題日益突出。在介紹Flash" title="Flash">Flash存儲器 Am29LV200B操作方法的基礎上,通過TMS320VC5410" title="TMS320VC5410">TMS320VC5410對FLASH進行程序燒寫,從而實現TMS320VC5410上電后用戶程序并行" title="并行">并行自舉引導。
關鍵詞: DSP FLASH TMS320VC5410 并行 引導裝載" title="引導裝載">引導裝載 編程
FLASH是一種可在線進行電擦寫而掉電后信息又不丟失的存儲器。它具有功耗低、容量大、擦寫速度快等特點,并且使用內部嵌入算法對芯片進行操作,因而在很多采用DSP+FLASH自舉引導裝載方案的數字信號處理系統中得到了廣泛的應用。本文通過一個完整的實例,介紹Am29LV200B FLASH存儲器的燒寫方法,實現TMS320VC5410(以下簡稱C5410)上電后用戶程序的并行引導裝載。
1 Am29LV200B FLASH存儲器
1.1 FLASH存儲器簡介
Am29LV200B是AMD公司生產的FLASH存儲器,其主要特點[6]有:3V單電源供電,可使內部產生高電壓進行編程和擦除操作;支持JEDEC單電源FLASH存儲器標準;只需向其命令寄存器寫入標準的微處理器指令,具體編程和擦除操作可由內部嵌入的算法實現,并且可以通過查詢特定的引腳或數據線監控操作是否完成;可以對任一扇區進行讀、寫或擦除操作,而不影響其它部分的數據。本文中128K×16位Am29LV200B FLASH映射為C5410的片外數據存儲空間,地址為:0x8000~0xFFFF,數據總線16位,用于16位方式的并行引導裝載。128K的FLASH ROM用32K地址分四頁進行訪問,上電加載程序時使用FLASH ROM的第3頁。
1.2 Flash存儲器的操作命令
只要向FLASH存儲器的特定寄存器寫入地址和數據命令,就可對FLASH存儲器編程。但要按一定的順序操作,否則就會導致FLASH存儲器復位。由于編程指令不能使“0”變為“1”,只能使“1”變為“0”,而擦除命令可使“0”變為“1”,所以正確順序是先擦除、后編程。下面介紹幾個常用的操作命令:編程命令、擦除命令、讀數據命令、復位命令。
(1)編程命令。該命令向FLASH的指定地址寫入數據,需要四個總線周期,前兩個周期是解鎖周期,第三個周期建立編程命令,最后一個周期則向編程地址寫入編程數據,如表1所示。
由于向每個編程地址寫入數據都需要四個周期,所以在循環寫FLASH時使用宏比較簡單。FLASH ROM的首地址為0x8000,故偏移地址0x555對應的物理地址就為0x8555。_WRITECOMMAND是實現一個周期編程的寫命令宏,而_WRITEFlash則是對指定地址進行編程的四個完整周期。
具體編程程序如程序1、程序2所示。
程序1
_WRITECOMMAND .macro pa,pd
; 單一周期編程的寫命令宏,
; pa是編程地址,pd是編程數據
PSHM AR1
STM pa,AR1 ; AR1指向編程地址
LD pd,A
STL A,*AR1 ; 把編程數據放入AR1的編程地址
RPT #12
NOP
POPM AR1
.endm
程序2
_WRITEFlash .macro par,pdr
; 編程宏,par是編程地址寄存器,
; pdr是存放編程數據的寄存器
_WRITECOMMAND #8555H,#0AAH ;周期1(解鎖)
_WRITECOMMAND #82AAH,#0A0H ;周期2(解鎖)
_WRITECOMMAND #8555H,#0A0H ;周期3(建立)
LD pdr, A ;周期4(編程)
STL A, par ;把pdr寄存器中數據放入par寄存器的地址
RPT #12
NOP
_JUDGE par, pdr
; 檢測編程是否正確,見FLASH的操作檢測
.endm
(2)擦除命令。該命令有片擦除和扇區擦除兩種,都需要6個總線周期,前兩個是解鎖周期,第三個是建立周期,第四、第五兩個是解鎖周期,最后是片擦除或扇區擦除周期,如表2所示。
一旦執行編程或擦除命令后,就啟動FLASH的內部編程或擦除算法,自動完成編程或擦除操作。擦除程序如程序3所示。
程序3
_ERASEFlash .macro ;擦除宏
_WRITECOMMAND #8555H, #0AAH ;周期1(解鎖)
_WRITECOMMAND #82AAH, #055H ;周期2(解鎖)
_WRITECOMMAND #8555H, #080H ;周期3(建立)
_WRITECOMMAND #8555H, #0AAH ;周期4(解鎖)
_WRITECOMMAND #82AAH, #055H ;周期5(解鎖)
_WRITECOMMAND #8555H, #010H ;周期6(片擦除)
STM #8555H,AR3
LD #010H, A
STL A, *AR5
_JUDGE *AR3, *AR5
;檢測擦除是否結束,見FLASH的操作檢測
.endm
(3)讀數據命令。上電或內部編程、擦除操作結束后就進入讀數據狀態,寫入要讀取的地址即可讀出該地址的數據。
(4)復位命令。該命令使存儲器復位,進入讀數據狀態。向任何一個地址寫入數據0xF0就能使FLASH存儲器復位。在進行編程、擦除之前,都應先復位,在編程或擦除等正常操作中出現錯誤時也要復位。復位程序如程序4所示。
程序4
_RESETFlash .macro ;復位宏
_WRITECOMMAND #8001H,0F0H
;向8001H寫入0F0H使FLASH復位
RPT #12
NOP
.endm
1.3 Flash的操作檢測
FLASH內部的編程或擦除算法可自動完成編程或擦除操作,但必須了解其內部的操作檢測機制,以便知道操作是否完成或正確。常用的檢測狀態位有:跳變位(DQ6)、超時標志位(DQ5)、數據查詢位(DQ7)和Ready/Busy引腳(RY/)。檢測的方法有三種。第一種是判斷引腳RY/的狀態。在編程、擦除或擦除掛起操作過程中,RY/引腳一直為“0”,操作完成后變為“1”。 第二種是檢測跳變位DQ6,在編程或擦除時對任何地址進行連續的讀均引起DQ6連續跳變,直至操作結束才停止跳變。最后一種是使用數據線的DQ7、DQ5。DQ7位在編程或擦除過程中輸出的數是寫入該位數據的反碼,當操作完成時輸出才變為寫入該位的數據;DQ5的狀態為“1”時表示操作超時,此時應再讀一次DQ7的狀態,若DQ7輸出仍不是寫入的數據,則操作失敗,復位FLASH。其流程如圖1所示,檢測程序如程序5所示。
程序5
JUDGE .macro par,pdr
;檢測宏程序。par是編程地址寄存器,
;pdr是存放編程數據的寄存器
_JUDGEBEGIN?: PSHM AR1
LD pdr,B; 獲取寫入的數據
AND #00FFh,B ;取被寫入數據的DQ7~DQ0
LD par,A;讀被燒寫地址的數據
ADN #00FFh, A ;取DQ7~DQ0
STL A, TEMP; 保存
LD A,-7,A ;讀DQ7狀態
XOR B, -7,A ;是否是反碼?
BC_JUDGESUCCESS?,AEQ
;DQ7不是反碼而是寫入數據表示操作成功
BITF TEMP, #20h
BC_JUDGEBEGIN?芽,ntc
;DQ5=1表示操作超時
LD par,A ;再讀被燒寫地址的數據
AND #00FFh,A
LD A,-7,A
XOR B, -7,A
BC_JUDGESUCCESS?. AEQ
;DQ7不是寫入數據,表示操作失敗
_JUDGEERR0?
_RESETFlash ;復位FLASH
_JUDGESUCCESS?
POPM AR1
.endm
2 C5410 的自舉引導
脫離仿真器獨立運行程序一般有兩種方式:一種是上電后用戶程序直接在FLASH存儲器中運行,這種方式運行速度比較慢;另一種是上電或復位后將用戶程序從FLASH存儲器引導到高速數據存儲器中運行,此方法最常用,可以較低的成本實現高速的運行。為了實現這個過程就必須運用DSP的自舉引導功能。
2.1 自舉引導[1~3]
C5410上電復位后,首先檢查MP/MC狀態:若為高電平,說明DSP處于微處理器工作方式,即從外部程序存儲器0FF80H地址處開始執行用戶程序;若為低電平,說明DSP被設置為微計算機工作方式,從片內ROM的0FF80H地址處開始執行程序。0FF80H地址存放的是中斷向量表,它實為一條分支轉移指令(BD 0F800H),使程序跳轉至0F800H執行自舉引導程序(Bootloader)。Bootloader是固化在DSP芯片內ROM中的一段代碼程序,其功能是將用戶程序從外部加載至片內RAM或擴展的RAM中,使其高速運行。在搬運程序之前,Bootloader首先完成初始化工作:使中斷無效、內部RAM映射到程序/數據區(OVLY=1)、對程序和數據區均設置7個等待狀態等。C5410有以下幾種自舉引導方式[4~5]:主機接口HPI、并行口(8/16位)、標準串行口(MCBSP0是16位引導模式,MCBSP2是8位引導模式)以及I/O口(8/16位)自舉引導方式。
2.2 并行自舉引導
這種方式是比較常用的一種方式,外部存儲器的字寬為8位或16位。在自舉引導時,通過外部并行接口總線將這些代碼從數據存儲空間傳送到程序存儲空間,而且可以重新設置SWWSR及BSCR寄存器的內容。并行自舉引導方式首先從地址為0FFFFH的I/O口讀取自舉表首地址的內容,如果此內容不符合8位或16位的引導方式,就從地址為0FFFFH的數據存儲器讀取,進行8位或16位并行自舉引導。所以在燒寫FLASH數據的同時,也要在0FFFFH燒入自舉表的首地址。引導流程如圖2所示。
2.3 建立自舉表
自舉表內容不僅包括欲加載的各段代碼,而且包括各段代碼長度、各代碼段存放的目標地址、程序入口地址等信息。若要完成自舉引導功能,必須建立正確的自舉表。自舉表可以由hex500格式轉換器自動生成;也可以手動建立自舉表,就是把被燒寫的程序直接放在燒寫程序中,根據被燒寫程序的相關信息手動建立自舉表。
3 通過C5410燒寫FLASH及并行自舉引導
下面通過一個FLASH燒寫實例,介紹怎樣將用戶程序燒寫進FLASH,以及怎樣手動建立自舉表,并且脫離仿真器以并行自舉引導方式使用戶程序獨立運行。被燒寫和燒寫程序如程序6所示。
程序6
.title“FLASH”
.mmregs
SWCR .set 002BH
.set 0060H
.data
.sect “.BOOT”
.label BOOTTABLE ;自舉表開始
.word 10AAH ;16位自舉標記
.word 7FFFH ; 7位等待周期(SWWSR)
.word 0F000H ;塊轉換寄存器(BSCR)
.word 0000h ;程序入口XPC
.word 0200h ;程序入口地址(MAIN_START)
.word LOADEND - LOADSTART
;程序塊長度(0116H)
.word 0000h ;存放目標XPC
.word 0100h ;存放目標地址
LOADSTART: ;中斷向量表開始地址
.copy “vector.asm”;復位處跳轉MAIN_START
MAIN_START: ;被燒寫的主程序
STM #0F7h,SP
STM #012Ch,PMST
; IPTR=01(中斷向量指針為100,指向目標址)
; MP/MC=0,OVLY=1,AVIS=0,DROM=1,CLKOFF=1
LOOPF:RSBX XF ;XF置低
CALL DELAY ;延時
SSBX XF ;XF置高
CALL DELAY
B LOOPF
DELAY: PSHM AR6
STM #0090H,AR6
DELAY_LOOP;
RPT #0FF0h
NOP
BANZ DELAY_LOOP, *AR6-
POPM AR6
RET
LOADEND: ;被燒寫的程序結束
.space 20h
.mmregs
.label FINDTABLE
.word 8000h
.text
ERASE_WRITE_Flash: ;燒寫程序開始
STM #0FFA0H,PMST
STM #07FFFH,SWWSR
STM #0FFFFH,SWCR
_RESETFlash ;FLASH復位
_ERASEFlash ;擦除FLASH
WRIFlashSTART: ;開始編程FLASH
SSBX SXM
RSBX OVM
_RESETFLASH ;FLASH復位
STM#8000H, AR0 ;FLASH起始地址8000H
STM BOOTTABLE,AR5 ;被燒寫的源地址(自舉表首地址)
STM #(LOADEND-BOOTTABLE),AR4
;寫入011E個字WRI_RPT
_WRITEFlash *AR0,*AR5 ;調入編程宏
LD *AR0+,A
LD *AR5+,A ;完成AR0和AR5地址自動加1
BANZ WRI_RPT,*AR4-
STM #0FFFFH,AR0 ;AR0指向數據空間的FFFF地址
STM FINDTABLE,AR5
_WRITEFlash *AR0,*AR5
;向數據空間的FFFF地址寫入自舉表的首地址8000H
ENDD: NOP
B ENDD
.end
被燒寫的主程序是從MAIN_START開始,一直到LOADEND。程序的主要功能是不斷改變XF引腳的狀態。LOADSTART是中斷向量文件(vector.asm)的開始,在中斷復位(RESET)處放入一條跳轉到MAIN_START的指令(BD MAIN_START)。ERASE_WRITE_FLASH是燒寫程序的開始,只要程序指針(PC)指向ERASE_WRITE_FLASH,開始運行就可以完成對FLASH的燒寫操作。從自舉表首地址BOOTTABLE(0F8H)到LOADEND(0216H)存放的數據就是要寫入Flash的內容,從LOADSTART到LOADEND的數據是DSP自舉程序從FLASH搬運到片內RAM的程序。根據以上信息就可以完成自舉表的內容,如表3所列。
整個并行自舉引導過程為:C5410上電復位后,判斷MP/MC=0 處于微計算機工作方式,從片內ROM的0FF80H處執行中斷向量表的分支轉移指令(BD 0F800H),使程序跳轉至0F800H處執行自舉引導程序。自舉引導程序完成初始化后,讀取數據空間的0FFFFH地址的內容,找到自舉表首地址8000H,從8000H處開始讀取內容。首先是16位自舉標記(10AA)。然后分別是寄存器SWWSR及BSCR的內容、程序入口地址、代碼段長度、存放代碼段的目標地址等信息。最后,根據這些信息把FLASH的8008H~811EH的程序搬運到片內RAM的100H開始的地址中,跳轉至片內RAM 100H,即PC為100H、XPC為0,開始執行用戶程序,完成用戶程序的并行自舉過程。
把程序燒寫入FLASH后,復位C5410,使其處于微計算機工作方式;使用示波器測試XF引腳,觀察程序運行正確與否。通過上述方法可完成C5410對Am29LV200B FLASH的燒寫,很好地實現C5410上電后的用戶程序自舉引導功能。
參考文獻
1 韋江維,寥義奎,農建波等.TMS320VC5402 DSP的并行I/O引導裝載方法研究. 電子技術應用,2000;15(8):42~44
2 韓 峰,侯亞峰,張 浩等.兩類DSP芯片的引導過程分析.電子技術應用,2002;17(10):65~67
3 杜志秀. TMS320C542系統的最小硬件設計.微計算機信息,1999;15(6):62~64
4 TMS320VC5410 Fixed-Point Digital Signal Processor Data Manual. Texas Instrument, December. 2000
5 TMS320VC5410 Bootloader Application Report. Texas Instrument, April 2000
6 Am29LV200B Data Sheet.AMD, April 2002