日本a√视频在线,久久青青亚洲国产,亚洲一区欧美二区,免费g片在线观看网站

        <style id="k3y6c"><u id="k3y6c"></u></style>
        <s id="k3y6c"></s>
        <mark id="k3y6c"></mark>
          
          

          <mark id="k3y6c"></mark>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > TMS320C5410燒寫(xiě)Flash實(shí)現(xiàn)并行自舉引

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

          作者: 時(shí)間:2011-12-10 來(lái)源:網(wǎng)絡(luò) 收藏

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

          1 Am29LV200B Flash存儲(chǔ)器

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

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

          1.2 Flash存儲(chǔ)器的操作命令

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

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

          表1 編程命令

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

          _WRITECOMMAND .macro pa,pd ;單一周期編程的寫(xiě)命
          ;令宏,pa是編程地址,pd是編程數(shù)據(jù)
            PSHM AR1
            STM pa,AR1 ;AR1指向編程地址
            LD pd,A
            STL A,*AR1 ;把編程數(shù)據(jù)放入AR1的編程地址中
            RPT #12
            NOP
            POPM AR1
            .endm
          _WRITEFlash .macro par,pdr ;編程宏,par是編程地址寄存器,pdr是存放編程數(shù)據(jù)的寄存器
            _WRITECOMMAND #8555H,#0AAH ; 周期1(解鎖)
            _WRITECOMMAND #82AAH,#055H ; 周期2(解鎖)
            _WRITECOMMAND #8555H, #0A0H ; 周期3(建立)
            LD pdr, A ; 周期4(編程)
            STL A, par ; 把pdr寄存器中數(shù)據(jù)放入par;寄存器的地址中
            RPT #12
            NOP
            _JUDGE par, pdr ;檢測(cè)編程是否正確,見(jiàn)Flash;的操作檢測(cè)
            .endm
            _WRITECOMMAND是實(shí)現(xiàn)一個(gè)周期編程的寫(xiě)命令宏,而_WRITEFlash是完成對(duì)指定地址編程的四個(gè)完整周期。

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

          表2 擦除命令

          _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 ;檢測(cè)是擦除結(jié)束,見(jiàn)Flash的操作檢測(cè)
            .endm

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

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

          _RESETFlash .macro
            _WRITECOMMAND #8001H,#0F0H;向8001H寫(xiě)入0F0H使Flash復(fù)位
            RPT #12
            NOP
            .endm

          1.3 Flash的操作檢測(cè)

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


          圖1 Flash操作檢測(cè)流程

            檢測(cè)程序如下:

          _JUDGE .macro par,pdr;檢測(cè)宏程序。par是編程地址寄存器,pdr是存放編程數(shù)據(jù)的寄存器
          _JUDGEBEGIN?: PSHM AR1
            LD pdr,B ;獲取寫(xiě)入的數(shù)據(jù)
            AND #00FFh,B ;取被寫(xiě)入數(shù)據(jù)的DQ7~DQ0
            LD par,A ;讀被燒寫(xiě)地址的數(shù)據(jù)
            AND #00FFh,A ;取DQ7~DQ0
            STL A ,TEMP ;保存
            LD A,-7,A ;讀DQ7狀態(tài)
            XOR B,-7,A ;是否是反碼?
            BC _JUDGESUCCESS?,AEQ ; DQ7不是反碼而是寫(xiě)入數(shù)據(jù)表示操作成功
            BITF TEMP,#20h
            BC _JUDGEBEGIN?,ntc;DQ5=1表示操作超時(shí)
            LD par,A ;再讀被燒寫(xiě)地址的數(shù)據(jù)
            AND #00FFh,A
            LD A,-7,A
            XOR B,-7,A
            BC _JUDGESUCCESS?,AEQ; DQ7不是寫(xiě)入數(shù)據(jù),表示操作失敗
          _JUDGEERRO?
            _RESETFlash ;復(fù)位Flash
          _JUDGESUCCESS?
            POPM AR1
            .endm

          2 C5410 的自舉引導(dǎo)

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

           ?。?) 自舉引導(dǎo)

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

           ?。?) 導(dǎo)

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


          圖2 并行自舉引導(dǎo)流程圖

           ?。?) 建立自舉表

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

          3 C5410 和并行自舉引導(dǎo)

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

            .title “FLASH”
            .mmregs
          SWCR .set 002BH
          TEMP .set 0060H
            .data
            .sect ".BOOT"
            .label BOOTTABLE ; 自舉表開(kāi)始
            .word 10AAH ; 16位自舉標(biāo)記
            .word 7FFFH ; 7個(gè)等待周期(SWWSR)
            .word 0F000H ; 塊轉(zhuǎn)換寄存器(BSCR)
            .word 0000h ; 程序入口XPC
            .word 0200h ; 程序入口地址(MAIN_START)
            .word LOADEND - LOADSTART
            ; 程序塊長(zhǎng)度(0116H)
            .word 0000h ; 存放目標(biāo)XPC
            .word 0100h ; 存放目標(biāo)地址
          LOADSTART: ;中斷向量表開(kāi)始地址
            .copy “vector.asm”;復(fù)位處跳轉(zhuǎn)MAIN_START
          MAIN_START: ;被燒寫(xiě)的主程序
            STM #0F7h,SP
            STM #012Ch,PMST
            ;IPTR=01(中斷向量指針為100,指向目標(biāo)地址),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ě)的程序結(jié)束
            .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復(fù)位
            _ERASEFlash ;擦除Flash
          WRIFlashSTART: ;開(kāi)始編程Flash
            SSBX SXM
            RSBX OVM
            _RESETFLASH ; Flash復(fù)位
            STM #8000H,AR0 ;Flash起始地址8000H
            STM BOOTTABLE,AR5 ;被燒寫(xiě)的源地址(自舉
            ;表首地址)
            STM #( LOADEND- BOOTTABLE),AR4
                    ; 寫(xiě)入011E個(gè)字
          WRI_RPT
            _WRITEFlash *AR0,*AR5 ;調(diào)入編程宏
            LD *AR0+,A
            LD *AR5+,A ;完成AR0和AR5地址自動(dòng)加1
            BANZ WRI_RPT,*AR4-
            STM #0FFFFH,AR0; AR0指向數(shù)據(jù)空間的FFFF
                        ;地址
            STM FINDTABLE,AR5
            _WRITEFlash *AR0,*AR5 ; 向數(shù)據(jù)空間的FFFF
          ;地址寫(xiě)入自舉表的首地址8000H
          ENDD: NOP
            B ENDD
            .end

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

          00F8H: BOOTTABLE ; 自舉表開(kāi)始
          0100H: LOADSTART ;中斷向量表首地址
          0100H: RESET :BD MAIN_START
          ... ;中斷向量表的內(nèi)容
          0178H: RESERVED
          0200H: MAIN_START
          ... ;主程序
          0216H: LOADEND

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

          表3 自舉表

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

          結(jié)語(yǔ)

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

          參考文獻(xiàn)

          1 TMS320VC5410 Bootloader SPRA609A Copyright (c) TI, 2000-04
          2 Am29LV200B Copyright (c) 2002 Advanced Micro Devices, 2002-04-12
          3 張雄偉, 曹鐵勇. DSP芯片的原理與開(kāi)發(fā)應(yīng)用. 北京:電子工業(yè)出版社, 2001



          評(píng)論


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

          關(guān)閉