DSP2812學習筆記-內部Flash啟動過程


2812從內部flash啟動的詳細流程說明:

a) 程序硬件復位或者軟件復位

b) 判斷mp/mc是否為0,為0則從boot rom啟動,否則從外部啟動(見附錄1)

c) 到boot rom的0x3FFFC0處取出復位向量,跳到boot函數

d) 采集IO管腳狀態,根據IO狀態選擇boot方式(見附錄2)

e) 如果是flash,程序退出boot函數,跳轉到0x3F7FF6

f) 取出跳轉指令,跳轉到自己的指定地址或者C初始化的入口_C_INT00處

g)  在C初始化的入口_C_INT00對一些變量,堆棧和寄存器進行必要的設置,該函數在c的庫函數內

h) 進入main函數

(a)上電復位后,(c)復位向量是指向片內Flash的0x3FFFC0,2812有一塊flash地址從0x3FF000-0x3FFFFF在出廠時已經固化好了引導程序。在0x3FFFC0處是一條跳轉指令,跳到iniboot(地址0x3F FC00)函數處執行iniboot代碼,該iniboot代碼就是TIdsp出廠時固化在flash中的。(d)InitBoot assembly Routine將選擇SelectBootMode function啟動模式函數。這個函數由GPIO 引腳的狀態決定啟動類型(見附錄2)。一旦啟動結束,選擇啟動模式函數返回一入口地址給InitBoot函數。入口地址是退出bootloader之后代碼開始執行的起始點。InitBoot接着將會調用ExitBoot子程序,把CPU寄存器的狀態恢復到復位狀態。比如flash boot模式,(e)那么initboot執行完后跳轉到0x3F7FF6處(codestart處),此位置剛好在128位(CSM)密碼位置之前,(f)你要在0x3F7FF6處放置跳轉指令(跳轉見附錄3),以跳轉到你要去的地方,比如是boot loader或應用代碼,通常的跳轉去處是_c_int00。(g)上面代碼執行后跳到C初始化的入口_c_int00(0x3F6000) ,在C初始化的入口,_c_int00對一些變量,堆棧和寄存器進行必要的設置(見附錄4)。(h)調用main函數開始運行C程序。

附錄1:XMP/~MC

當該引腳的為高電平時表示是微處理器模式(microprocessor),為低電平時表示微計算機模式(microcomputer),當為微處理器模式時,2812內部的bootrom被禁止,通過zone7(0x3F C000)從外部調引導程序啟動。2812復位以后,其復位向量是固定的0x3FFFC0,如果為微處理器模式,那么復位后的復位向量指向的外部的地址,即0x3FFFC0是zone7處的地址,若為微計算機模式,那么0x3FFFC0指向的是2812的片內FLASH的地址。

附錄2:引導模式選擇

GPIOF4

GPIOF12

GPIOF3

GPIOF2

 

(SCITXDA)

(MDXA)

(SPISTEA)

(SPICLK)

 

PU

No PU

No PU

No PU

Mode Selected

1

X

X

X

跳轉到地址為0x3F7FF6的Flash,用戶必須在這里編寫分支語句優先於復位,以按需要重新定位代碼的執行.

0

1

X

X

調用SPI_Boot 以從外部的EEPROM載入

0

0

1

1

調用SCI_Boot 以從SCI-A載入

0

0

1

0

J跳轉到 H0 SARAM 0x3F 8000

0

0

0

1

跳轉到OTP地址 0x3D 7800

0

0

0

0

調用Parallel_Boot從GPIO 端口B載入

附錄3: 在0x3F 7FF6 處放置跳轉指令,跳到C初始化的入口_c_int00(0x3F6000

(DSP281x_CodeStartBranch.asm中):
.sect "codestart"
code_start:
    .if WD_DISABLE == 1
        LB wd_disable      ;Branch to watchdog disable code
    .else
        LB _c_int00        ;Branch to start of boot.asm in RTS library
    .endif
    .if WD_DISABLE == 1
    .text
wd_disable:
    SETC OBJMODE        
    EALLOW              
    MOVZ DP, #7029h>>6  
    MOV @7029h, #0068h  
    EDIS                
    LB _c_int00        
.endif
.end

CMD文件中對應位置

MEMERY
 {
        Page 0:
           ………..

RAML0       : origin = 0x008000, length = 0x001000     /* on-chip RAM block L0 */

   OTP         : origin = 0x3D7800, length = 0x000400     /* on-chip OTP */

   FLASHD      : origin = 0x3F0000, length = 0x002000     /* on-chip FLASH */

   FLASHC      : origin = 0x3F2000, length = 0x002000     /* on-chip FLASH */

   FLASHA      : origin = 0x3F6000, length = 0x001F80     /* on-chip FLASH */

   CSM_RSVD    : origin = 0x3F7F80, length = 0x000076     

   BEGIN       : origin = 0x3F7FF6, length = 0x000002

    ………..
 }
 SECTIONS
 {        ……….
   /* Allocate program areas: */

   .cinit            : > FLASHA      PAGE = 0

   .pinit            : > FLASHA,     PAGE = 0

   .text             : > FLASHC      PAGE = 0

   codestart       : > BEGIN       PAGE = 0

   ramfuncs        : LOAD = FLASHD, 

                         RUN = RAML0, 

                         LOAD_START(_RamfuncsLoadStart),

                         LOAD_END(_RamfuncsLoadEnd),

                         RUN_START(_RamfuncsRunStart),

                         PAGE = 0

   csmpasswds          : > CSM_PWL     PAGE = 0

   csm_rsvd            : > CSM_RSVD    PAGE = 0

   /* Allocate uninitalized data sections: */

   .stack              : > RAMM0       PAGE = 1

   .ebss               : > RAML1       PAGE = 1

   .esysmem          : > RAML1       PAGE = 1

   /* For SDFlash to program these, they must be allocated to page 0 */

   .econst             : > FLASHA      PAGE = 0

   .switch             : > FLASHA      PAGE = 0   
         ……….
 }

附錄4:_c_int00

這個函數在運行支持庫(rts.lib)中,_c_int00函數為建立C運行環境,需完成以下工作:

1.為系統堆棧產生.stack塊,並初始化堆棧指針;

2.從.cinit塊將初始化數據拷貝到.bss塊中相應的變量;

3.對寄存器進行必要的配置,調用main函數開始運行C程序;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM