新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 用DSP軟件編程實現的引導裝載系統設計

        用DSP軟件編程實現的引導裝載系統設計

        作者: 時間:2012-07-03 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/257389.htm

        2.3 對FLASH的操作

        對照圖1的地址映射關系,如果采用的是微處理器模式(MP/MC=1),并且設置寄存器OVLY=I,那么由于連接的關系使得FLASH的起始地址0x0000和的起始地址0x0000重合,在第0頁程序空間中可見的FLASH的地址范圍應為0x8000-0xFFFF。

        在擦除或讀寫FLASH之前,必須先執行相應的命令字序列,即在指定的FLASH地址處寫入指定的指令代碼,M29W400T的命令字序列如表2所示。


        表2中的某些FLASH地址空間對照圖1恰好對應于DSP的內部地址空間,即對DSP而言是不可見的,所以需要考慮地址的重映射。文中以對FLASH寫人為例,FlashWrite表示一次底層的總線寫操作。

        未考慮地址重映射時,命令字序列為:

        FlashWrite(0x5555L,0x00AA);// lst cycle
        FlashWrite(0x2AAAL.0x0055);// 2nd cycle
        FlashWrite(Ox5555L,OxOOAO);// 3rd cycle
        (寫入命令)
        FlashWrite(myaddress,mydata);// 將數據
        mydata寫入FLASH地址myaddress

        由圖1可知,當MP=1和OVLY=1時,FLASH地址0x5555L和0x2AAAL在DSP中不屬于外部空間,即對DSP是不可見的。這樣DSP執行上述語句時,根本沒有對FLASH進行相應的操作,從而導致即使FLASH地址myaddress是DSP可見的,也無法實現數據寫入的功能。

        仔細分析FLASH的命令字序列可知,其實前三句命令字序列中真正起作用的地址位是A0-A14,而高地址位A15-A17可以是任意值,于是考慮加一個地址偏移量0x8000,以使得重映射后的FLASH地址在DSP中是可見的。修改后的代碼為:

        #define OFFSET Ox8000
        FlashWrite(((k5555L+OFFSET),0x00AA);// 19tcycle
        FlashWrite((0x2AAAL+OFFSET),0x0055);// 2ndcycle
        FlashWrite((0x5555L+OFFSET),0x00A0);
        // 3rdf cycle(重映射的寫入命令)
        FlashWrite(myaddress,mydata): // 將數據mydata
        寫入FLASH地址myaddress

        這樣,在DSP中就可以對外部FLASH進行寫入操作了,而其前提是FLASH地址myaddress在DSP中可見。其它的擦除和讀操作也要對照圖1作類似的地址重映射。

        在DSP將數據寫入FLASH之前,只有先刪除數據所在塊,然后才能重新寫入。擦除和寫操作之前都要執行如表2所示的相應命令字序列。其中要寫入的數據部分即為引導程序以及用戶程序經過編譯、連接后的目標代碼,為M29W400T可識別的HEX格式。


        3 軟件描述

        3.1 功能分析

        系統主要由引導程序和用戶程序兩部分構成,最后都存儲在外擴的M29W400T的指定地址中。以上主要敘述的是如何將目標代碼寫入M29W400T,下面敘述如何設計引導程序和用戶程序,以及生成最后目標代碼的方法。

        由于DSP采用微計算機工作模式。因此,在加電后,DSP將首先執行0xFF80處的中斷向量表起始處的跳轉命令,然后轉向0xF800處的引導程序并實現代碼移植功能。完畢后,再次跳轉到移植后的用戶程序的起始地址并執行。

        以一個完整的系統為例,設用戶程序是從TMS320VC5410的XF管腳輸出一個均勻方波。此段代碼也可以被其它用戶程序替代,因此本文的系統具有一定的通用性。

        3.2 代碼實現

        利用TI公司的DSP集成開發套件CCS可以生成*.out格式的目標代碼,首先要建立引導程序段、用戶程序段、中斷向量表和連接命令文件四部分。引導程序段負責將用戶程序段和中斷向量表裝載到目標地址,用戶程序段是實現用戶系統功能的核心代碼(本文僅以實現輸出一個方波為例),中斷向量表包括自啟時的跳轉處理和中斷服務程序的人口;連接命令文件則是分配各個程序段在DSP地址空間中的位置,協助生成目標代碼,在這四部分中,引導程序段是設計重點,它負責將中斷向量表和用戶代碼段從片外的M29W400T移植到片內的RAM中,并且將程序指針指向用戶代碼段起始地址。其引導程序段(1Oad.asm)的命令代碼如下:

        .def load_start
        .sect,load_prg
        load_start:
        ssbx intm ;關中斷
        rsbx sxm ;符號擴展模式設置為0
        ld #0,dp ;定義數據頁指針為0
        nop
        nop
        nop
        1d #0ff80h,a ;移植中斷向量表,
        0xff80為中斷向量表的舊起始地址
        stm # VECT_NEW,arl;VECT_NEW表示中斷向量表的新起始地址
        rpt#(VECT_LEN_1);VECT_LEN表示中斷向量表的長度
        reada * arl+
        nop
        ld # MAIN_OLD,a ;移植用戶程序段,
        MAm_OlD表示用戶程序段的舊起始地址

        stm # MAIN-NEW,arl ;MAIN_NEW表示用戶程序段的新起始地址
        rpt#(MAIN_LEN_1) ;MAIN_LEN表示用戶程序段的長度
        reada * arl+
        endboot:
        orm # 020h,@ldh ;

        設置OVLY=1,使得內部RAM同時映射到DSP數據和程序空間
        ld # MAIN_NEW,a
        bacc a ;程序指針指向用戶程序段的起始地址
        .end
        用戶程序段(main.asm)代碼如下:
        .def main_start
        .sect main_prg
        main_start:
        loop: rsbx xf ;實現XF的復位和置位
        nop
        ssbx Xf
        nop
        b loop
        .end
        中斷向量表(vect.asm)如下:
        .mmregs
        .Ief main_ start
        .ref lOad_start
        .def reset
        .def nmi
        .sect''.vectors''
        reset: bd load_start ;加電后,跳轉到自啟程序段起始地址
        stm #200,sp
        nmi: rete ;
        此表中只包含NMI中斷入口,也可以類似添加其他中斷入口

        nop
        nop
        nop
        .end
        連接命令文件(boot.cmd)的配置如下:
        vect.obj
        main.obj
        load.obj
        -O boot.out
        SECTIONS

        {
        main_prg:load=MAIN_OID,run=MAIN_NEW
        vectors: load=0ff80h,run=VECF_NEW
        load_prg:load=0f800h
        }

        上述引導程序經過CCS編譯及連接后,生成的目標文件boot.out是TMS320VC5410能夠識別的COFF格式,但是M29W400T不支持這種格式,所以不能直接寫入FLASH中。而CCS自身帶有多種HEX類型的轉換程序。因此,在經過格式轉換后,即可得到對應于上文提到的一系列數據和地址mydata和myaddress,此時就可以在聯機情況下利用CCS以DSP方式將目標代碼寫入到M29W400T之中。一旦寫入成功,便可以脫機加電自啟系統。同時,在經一段時間后,還可用示波器測得XF管腳輸出的均勻脈沖方波,以證明引導裝載成功。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 汤原县| 民县| 深圳市| 根河市| 乐业县| 高雄市| 阳高县| 衡水市| 英超| 焦作市| 洪洞县| 扎兰屯市| 连南| 渭源县| 颍上县| 隆子县| 婺源县| 蒲城县| 绥滨县| 陆丰市| 鄯善县| 五寨县| 松溪县| 盐源县| 阿拉善盟| 当雄县| 夏河县| 铅山县| 仁化县| 毕节市| 府谷县| 兴义市| 晋宁县| 民勤县| 改则县| 贵阳市| 仙桃市| 林西县| 盈江县| 卢氏县| 澎湖县|