- Bootloader
TI的DSP芯片在出廠時,在片內ROM中固化有引導裝載程序(BootLoader),其主要功能就是講外部的程序裝載到片內RAM中運行,以提高系統的運行速度。
- 模式介紹
VC5509A具有Parallel EMIF BOOT mode、EHPI Boot mode、Standard serial boot mode、SPI EEPROM boot mode、IIC EEPROM boot mode、USB boot mode等多種方式自舉加載。
- boot模式選擇
Boot引導模式選擇是通過引腳BOOTM[0:3]配置
BOOTM[0:3] |
BOOT資源 |
|||
IO.0 |
IO.1 |
IO.2 |
IO.3 |
|
0 |
0 |
0 |
0 |
系統保留 |
0 |
0 |
0 |
1 |
串行24位地址EEPROM引導方式、使用MCBSP0 |
0 |
0 |
1 |
0 |
USB引導方式 |
0 |
0 |
1 |
1 |
IIC EEPROM引導模式 |
0 |
1 |
0 |
0 |
系統保留 |
0 |
1 |
0 |
1 |
EHPI(multiplexed mode) BOOT 多路複用 |
0 |
1 |
1 |
0 |
EHPI (non-multiplexed mode)BOOT |
0 |
1 |
1 |
1 |
系統保留 |
1 |
0 |
0 |
0 |
從外部16位異步存儲器中引導 |
1 |
0 |
0 |
1 |
串行16位地址EEPROM引導方式,使用MCBSP0 |
1 |
0 |
1 |
0 |
並行EMIF模式引導(8位異步存儲器) |
1 |
0 |
1 |
1 |
並行EMIF模式引導(16位異步存儲器) |
1 |
1 |
0 |
0 |
系統保留 |
1 |
1 |
0 |
1 |
系統保留 |
1 |
1 |
1 |
0 |
標準串口模式(16位),使用McBSP0 |
1 |
1 |
1 |
1 |
標準串口模式(8位),使用McBSP0 |
- 引導表
BootLoader在引導程序時,程序代碼是以引導表格形式加載的,TMS320VC55X的引導表結構中包括了用戶程序的代碼段和數據段以及相應段在內存中的指定存儲位置。此外還包括程序入口地址、部分寄存器的配置值、可編程延時時間等信息,引導表結構如下:
32位程序入口地址 |
|||
32位寄存器配置計數器n |
|||
16位寄存器地址 |
16寄存器內容 |
||
...(REGISTER n addr) |
...(register n contents) |
||
16位延時指示器 |
16位延時計數器 |
||
32位段字節計數器 |
|||
32位段起始位 |
|||
數據(字節) |
數據(字節) |
數據(字節) |
數據(字節) |
數據(字節) |
數據(字節) |
數據(字節) |
數據(字節) |
...(section n) |
|||
32位全0數據(BOOT表結束位) |
其中,程序入口地址是引導表加載結束後,用戶程序開始執行的地址;寄存器配置數目決定了後面有多少個寄存器需要配置:只有當延時標誌爲FFFFh時,延時才被執行;延時長度決定了在寄存器配置後延時多少個CPU週期才進行下一個動作:段長度、段起始地址和數據則爲用戶程序中定義的各個段的內容;最後以00000000h作爲引導表的結束標誌
- 執行流程
而該流程中的reset,initboot,call selectbootmode, read i/o state, call boot loader這些步驟都是固化在芯片內的程序自己執行的,也就是說這些代碼在出廠的時候已經在TI的芯片內。在28335中是一段的8k*16的read-only的memory,地址位於0x3fe000-0x3fffff,見下圖:
根據上面的流程圖和rom分佈圖,詳細的解釋一下流程:
1、在3f ffc0到3f ffff其實是放了中斷向量表的地方:系統一開機當然是處於reset中斷,因此直接跳至reset的地方執行(0x3f ffc0)。而這個地方的兩個字節只是放了一條指令,就是跳至initboot函數,也就是3f f34c的地址執行boot load。
- 在3f f34c的bootloader操作中會去檢測外部GPIO口的狀態,從而判斷是哪種方式的啓動
3、 然後根據相依的啓動方式跳至相應的入口地址:比如FLASH啓動就是0x33fff6, 內部SARAM啓動就是0x0.
- 而這裏的入口地址就是cmd文件中定義的begin段。因此對於flash啓動和ram啓動,begin的定義是不同的,在flash啓動時begin就是 0x33fff6 ,而ram啓動begin就是0x0. 這個2個字的區間也就是放了我們程序最初執行的第一條指令(通常是code_start).因爲CSM_PWL的存放位置是在0x33fff8,因此只有2個words空間來存放跳轉指令。而一條長跳轉指令LB剛好佔兩個字節(這擺明着是ti精心設計的)