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代碼就是TI在dsp出廠時固化在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程序;