<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > TMS320C5410燒寫(xiě)Flash實(shí)現并行自舉引導

TMS320C5410燒寫(xiě)Flash實(shí)現并行自舉引導

作者: 時(shí)間:2004-12-06 來(lái)源:網(wǎng)絡(luò ) 收藏
摘要:介紹在環(huán)境下對Am29LV200B 存儲器進(jìn)行程序,并且上電后用戶(hù)程序自舉。

關(guān)鍵詞:Am29LV200B DSP 自舉 自舉表

  是一種可在線(xiàn)進(jìn)行電擦寫(xiě),掉電后信息不丟失的存儲器。它具有低功耗、大容量、擦寫(xiě)速度快等特點(diǎn),并且內部嵌入算法完成對芯片的操作,因而在數字信號處理系統中得到了廣泛的應用。本文通過(guò)一個(gè)完整的實(shí)例,介紹Am29LV200B Flash存儲器的方法,(以下簡(jiǎn)稱(chēng)C5410)上電后用戶(hù)程序的自舉。

1 Am29LV200B Flash存儲器

1.1 Flash存儲器簡(jiǎn)介

  Am29LV200B是AMD公司生產(chǎn)的Flash存儲器,其主要特點(diǎn)有:3 V單電源供電,可使內部產(chǎn)生高電壓進(jìn)行編程和擦除操作;支持JEDEC單電源Flash存儲器標準;只需向其命令寄存器寫(xiě)入標準的微處理器指令,具體編程、擦除操作由內部嵌入的算法,并且可以通過(guò)查詢(xún)特定的引腳或數據線(xiàn)監控操作是否完成;可以對任一扇區進(jìn)行讀、寫(xiě)或擦除操作,而不影響其它部分的數據。本文中128K16位Am29LV200B Flash 映射為C5410的片外數據存儲空間,地址為:0x8000~0xFFFF,數據總線(xiàn)16位,用于16位方式的并行引導裝載。128K的Flash ROM用32K地址分四頁(yè)進(jìn)行訪(fǎng)問(wèn),上電加載程序時(shí)使用Flash ROM的第3頁(yè)。

1.2 Flash存儲器的操作命令

  向Flash存儲器的特定寄存器寫(xiě)入地址和數據命令,就可對Flash存儲器編程,但要按一定的順序操作,否則就會(huì )導致Flash存儲器復位。由于編程指令不能使"0"寫(xiě)為"1",只能使"1"變?yōu)?0",而擦除命令可使"0"變?yōu)?1",所以正確順序是先擦除,后編程。下面就介紹幾個(gè)常用的操作命令:編程命令、擦除命令、讀數據命令、復位命令。

 ?、?編程命令。該命令向Flash的指定地址中寫(xiě)入數據,需要四個(gè)總線(xiàn)周期,前兩個(gè)是解鎖周期,第三個(gè)是建立編程命令,最后一個(gè)周期完成向編程地址中寫(xiě)入編程數據,如表1所列。

表1 編程命令

周期1(解鎖)2(解鎖)3(建立)4(編程)
地址0x5550x2AA0x555pa(編程地址)
數據0xAA0x550xA0pa(編程數據)

  由于向每個(gè)編程地址寫(xiě)入數據都需要四個(gè)周期,所以在循環(huán)寫(xiě)Flash時(shí)使用宏比較簡(jiǎn)單。Flash ROM的首地址為0x8000,故偏移地址0x555對應物理地址就為0x8555。編程程序如下:

_WRITECOMMAND .macro pa,pd ;單一周期編程的寫(xiě)命

;令宏,pa是編程地址,pd是編程數據

PSHM AR1

STM pa,AR1 ;AR1指向編程地址

LD pd,A

STL A,*AR1 ;把編程數據放入AR1的編程地址中

RPT #12

NOP

POPM AR1

.endm

_WRITEFlash .macro par,pdr ;編程宏,par是編程地址寄存

;器,pdr是存放編程數據的寄存器

_WRITECOMMAND #8555H,#0AAH ; 周期1(解鎖)

_WRITECOMMAND #82AAH,#055H ; 周期2(解鎖)

_WRITECOMMAND #8555H, #0A0H ; 周期3(建立)

LD pdr, A ; 周期4(編程)

STL A, par ; 把pdr寄存器中數據放入par

;寄存器的地址中

RPT #12

NOP

_JUDGE par, pdr ;檢測編程是否正確,見(jiàn)Flash

;的操作檢測

.endm

_WRITECOMMAND是實(shí)現一個(gè)周期編程的寫(xiě)命令宏,而_WRITEFlash是完成對指定地址編程的四個(gè)完整周期。

表2 擦除命令

周期1(解鎖)2(解鎖)3(建立)4(解鎖)5(解鎖)6(片擦除)6(扇區擦除)
地址0x5550x2AA0x5550x5550x2AA0x555SA(扇區地址)
數據0xAA0x550x800xAA0x550x100x30

 ?、?擦除命令。該命令有片擦除和扇區擦除兩種,都需要6個(gè)總線(xiàn)周期,前兩個(gè)解鎖周期,第三個(gè)建立周期,四、五兩個(gè)解鎖周期,最后是片擦除或扇區擦除周期,如表2所列。一旦執行編程或擦除命令后,就啟動(dòng)Flash的內部編程或擦除算法,自動(dòng)完成編程或擦除操作。擦除程序如下:

_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 ;檢測是擦除結束,見(jiàn)Flash的

;操作檢測

.endm

 ?、?讀數據命令。上電或內部編程、擦除操作結束后就進(jìn)入讀數據狀態(tài),寫(xiě)入要讀取的地址即可讀出該地址的數據。

 ?、?復位命令。它使存儲器復位,進(jìn)入讀數據狀態(tài),向任何一個(gè)地址寫(xiě)入數據0xF0就能使Flash存儲器復位。在進(jìn)行編程、擦除之前,都應先復位,在編程或擦除等正常操作中出現錯誤時(shí)也要復位。復位程序如下:

_RESETFlash .macro

_WRITECOMMAND #8001H,#0F0H

;向8001H寫(xiě)入0F0H使Flash復位

RPT #12

NOP

.endm

1.3 Flash的操作檢測

  Flash內部的編程或擦除算法可自動(dòng)完成編程或擦除操作,但我們必須了解其內部的操作檢測機制,以便知道操作是否完成或正確。常用檢測的狀態(tài)位有:跳變位(DQ6)、超時(shí)標志位(DQ5)、數據查詢(xún)位(DQ7)和Ready/Busy引腳(RY/)。檢測的方法有三種。第一種是判斷引腳RY/的狀態(tài),在編程、擦除或擦除掛起操作過(guò)程中,RY/引腳一直為"0",操作完成后變?yōu)?1"。 第二種是檢測跳變位DQ6,在編程或擦除時(shí)對任何地址進(jìn)行連續的讀均引起DQ6連續跳變,直至操作結束才停止跳變。最后一種是使用數據線(xiàn)的DQ7、DQ5:DQ7位在編程或擦除過(guò)程中輸出的數是寫(xiě)入該位數據的反碼,當操作完成時(shí)輸出才變?yōu)閷?xiě)入該位的數據;DQ5的狀態(tài)為"1"時(shí)表示操作超時(shí),此時(shí)應再讀一次DQ7的狀態(tài),若DQ7輸出仍不是寫(xiě)入的數據,則操作失敗,復位Flash,其流程如圖1所示。

  檢測程序如下:

_JUDGE .macro par,pdr;檢測宏程序。par是編程地址寄存

;器,pdr是存放編程數據的寄存器

_JUDGEBEGIN?: PSHM AR1

LD pdr,B ;獲取寫(xiě)入的數據

AND #00FFh,B ;取被寫(xiě)入數據的DQ7~DQ0

LD par,A ;讀被地址的數據

AND #00FFh,A ;取DQ7~DQ0

STL A ,TEMP ;保存

LD A,-7,A ;讀DQ7狀態(tài)

XOR B,-7,A ;是否是反碼?

BC _JUDGESUCCESS?,AEQ

; DQ7不是反碼而是寫(xiě)入數據表示操作成功

BITF TEMP,#20h

BC _JUDGEBEGIN?,ntc

;DQ5=1表示操作超時(shí)

LD par,A ;再讀被燒寫(xiě)地址的數據

AND #00FFh,A

LD A,-7,A

XOR B,-7,A

BC _JUDGESUCCESS?,AEQ

; DQ7不是寫(xiě)入數據,表示操作失敗

_JUDGEERRO?

_RESETFlash ;復位Flash

_JUDGESUCCESS?

POPM AR1

.endm

2 C5410 的自舉引導

  脫離仿真器獨立運行程序一般有兩種方式:一種是上電后用戶(hù)程序直接在Flash存儲器中運行,這種運行速度比較慢;另一種是上電或復位后將用戶(hù)程序從Flash存儲器引導到高速數據存儲器中運行,此方法最常用,可以較低的成本實(shí)現高速的運行。為了實(shí)現這個(gè)過(guò)程就必須運用DSP自舉引導功能。

 ?。?)自舉引導

  C5410上電復位后,首先檢查MP/MC狀態(tài):如果為高電平,說(shuō)明DSP處于微處理器工作方式,即從外部程序存儲器0FF80H地址開(kāi)始執行用戶(hù)程序;若為低電平,說(shuō)明DSP被設置為微計算機工作方式,從片內ROM的0FF80H地址開(kāi)始執行程序。0FF80H地址存放的是中斷向量表,它實(shí)為一條分支轉移指令(BD 0F800H),使程序跳轉至0F800H執行自舉引導程序(Bootloader)。Bootloader是固化在DSP芯片內ROM中的一段程序代碼,其功能是將用戶(hù)程序從外部加載至片內RAM或擴展的RAM中,使其高速運行。在搬運程序之前,Bootloader首先完成初始化工作:使中斷無(wú)效,內部RAM映射到程序/數據區(OVLY=1),對程序和數據區均設置7個(gè)等待狀態(tài)等。C5410有以下幾種自舉引導方式:主機接口HPI、并行口(8/16位)、標準串行口(MCBSP0是16位引導模式,MCBSP2是8位引導模式)以及I/O口(8/16位)自舉引導方式。

 ?。?)并行自舉引導

  這種方式是比較常用的一種,外部存儲器的字寬為8位或16位。在自舉引導時(shí),通過(guò)外部并行接口總線(xiàn)將這些代碼從數據存儲空間傳送到程序存儲空間,而且可以重新設置SWWSR及BSCR寄存器的內容。并行自舉引導方式首先從地址為0FFFFH的I/O口讀取自舉表首地址的內容,如果此內容不符合8位或16位的引導方式,就從地址為0FFFFH的數據存儲器讀取,進(jìn)行8位或16位并行自舉引導。所以,在燒寫(xiě)Flash數據的同時(shí),也要在0FFFFH燒入自舉表的首地址。引導流程如圖2所示。

(3)建立自舉表

  自舉表內容不僅包括欲加載的各段代碼,而且包括各段代碼長(cháng)度、各代碼段存放的目標地址、程序入口地址等信息。若要完成自舉引導功能,必須建立正確的自舉表。自舉表可以由hex500格式轉換器自動(dòng)生成;也可以手動(dòng)建立自舉表,就是把被燒寫(xiě)的程序直接放在燒寫(xiě)程序中,根據被燒寫(xiě)程序的相關(guān)信息手動(dòng)建立自舉表。

3 C5410 燒寫(xiě)Flash和并行自舉引導

  下面通過(guò)一個(gè)Flash燒寫(xiě)實(shí)例,介紹怎樣將用戶(hù)程序燒寫(xiě)進(jìn)Flash,以及怎樣手動(dòng)建立自舉表,并且脫離仿真器以并行自舉引導方式使用戶(hù)程序獨立運行。被燒寫(xiě)和燒寫(xiě)程序如下:

  .title "FLASH"

  .mmregs

SWCR .set 002BH

TEMP .set 0060H

  .data

  .sect ".BOOT"

  .label BOOTTABLE ; 自舉表開(kāi)始

  .word 10AAH ; 16位自舉標記

  .word 7FFFH ; 7個(gè)等待周期(SWWSR)

  .word 0F000H ; 塊轉換寄存器(BSCR)

  .word 0000h ; 程序入口XPC

  .word 0200h ; 程序入口地址(MAIN_START)

  .word LOADEND - LOADSTART

  ; 程序塊長(cháng)度(0116H)

  .word 0000h ; 存放目標XPC

  .word 0100h ; 存放目標地址

LOADSTART: ;中斷向量表開(kāi)始地址

  .copy "vector.asm";復位處跳轉MAIN_START

MAIN_START: ;被燒寫(xiě)的主程序

  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 ;延時(shí)

  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 ; 被燒寫(xiě)的程序結束

  .space 20h

  .mmregs

  .label FINDTABLE

  .word 8000h

  .text

ERASE_WRITE_Flash: ;燒寫(xiě)程序開(kāi)始

  STM #0FFA0H,PMST

  STM #07FFFH,SWWSR

  STM #0FFFFH,SWCR

  _RESETFlash ; Flash復位

  _ERASEFlash ;擦除Flash

WRIFlashSTART: ;開(kāi)始編程Flash

  SSBX SXM

  RSBX OVM

  _RESETFLASH ; Flash復位

  STM #8000H,AR0 ;Flash起始地址8000H

  STM BOOTTABLE,AR5 ;被燒寫(xiě)的源地址(自舉

 ??;表首地址)

  STM #( LOADEND- BOOTTABLE),AR4

  ; 寫(xiě)入011E個(gè)字

WRI_RPT

  _WRITEFlash *AR0,*AR5 ;調入編程宏

  LD *AR0+,A

  LD *AR5+,A ;完成AR0和AR5地址自動(dòng)加1

  BANZ WRI_RPT,*AR4-

  STM #0FFFFH,AR0; AR0指向數據空間的FFFF

 ??;地址

  STM FINDTABLE,AR5

  _WRITEFlash *AR0,*AR5 ; 向數據空間的FFFF

;地址寫(xiě)入自舉表的首地址8000H

ENDD: NOP

  B ENDD

  .end

  被燒寫(xiě)的主程序是從MAIN_START開(kāi)始,一直到LOADEND。程序的主要功能是不斷改變XF引腳的狀態(tài)。LOADSTART是中斷向量文件(vector.asm)的開(kāi)始,在中斷復位(RESET)處放入一條跳轉到MAIN_START指令(BD MAIN_START)。ERASE_WRITE_FLASH是燒寫(xiě)程序的開(kāi)始,只要程序指針( PC)指向ERASE_WRITE_FLASH,開(kāi)始運行就可以完成對Flash的燒寫(xiě)操作。從自舉表首地址BOOTTABLE (0F8H)到LOADEND(0216H)存放的數據就是要寫(xiě)入Flash的內容,從LOADSTART到LOADEND的數據是DSP自舉程序從Flash搬運到片內RAM的程序,具體如下:

00F8H: BOOTTABLE ; 自舉表開(kāi)始

0100H: LOADSTART ;中斷向量表首地址

0100H: RESET :BD MAIN_START

... ;中斷向量表的內容

0178H: RESERVED

0200H: MAIN_START

... ;主程序

0216H: LOADEND

  被燒寫(xiě)的程序只需一個(gè)段,根據以上信息就可以完成自舉表的內容,如表3所列。

表1 自舉表

數據區地址內 容含 義
8000H10AA16位自舉標記
8001H7FFFSWWSR
8002HF000BSCR
8003H0000程序入口XPC
8004H0200程序入口地址
8005H0123程序段長(cháng)度
8006H0000存放目標XPC
8007H0100存放目標地址
8008HF273程序代碼1
8009H0200程序代碼2
………………
811DHFC00程序代碼
811EH0000結束
………………
FFFFH8000自舉表存放首地址

  整個(gè)并行自舉引導過(guò)程為:C5410上電復位后,判斷MP/MC=0 處于微計算機工作方式,從片內ROM的0FF80H處執行中斷向量表的分支轉移指令(BD 0F800H),使程序跳轉至0F800H處執行自舉引導程序。自舉引導程序完成初始化后,讀取數據空間的0FFFFH地址的內容,找到自舉表首地址8000H,從8000H處開(kāi)始讀取內容。首先,是16位自舉標記(10AA)。然后分別是寄存器SWWSR及BSCR的內容,程序入口地址、代碼段長(cháng)度、存放代碼段的目標地址等信息。最后,根據這些信息把Flash的8008H到811EH的程序搬運到片內RAM的100H開(kāi)始的地址中,跳轉至片內RAM 100H、即PC為100H、XPC為0,開(kāi)始執行用戶(hù)程序,完成用戶(hù)程序的并行自舉過(guò)程。

結 語(yǔ)

  把程序燒寫(xiě)入Flash后,復位C5410,使其處于微計算機工作方式;使用示波器測試XF引腳,觀(guān)察程序運行正確與否。通過(guò)上述方法可完成C5410對Am29LV200B Flash 的燒寫(xiě),很好地實(shí)現了C5410上電后的用戶(hù)程序自舉引導功能。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>