F28335BOOTROM引導(dǎo)模式和程序_第1頁
F28335BOOTROM引導(dǎo)模式和程序_第2頁
F28335BOOTROM引導(dǎo)模式和程序_第3頁
F28335BOOTROM引導(dǎo)模式和程序_第4頁
F28335BOOTROM引導(dǎo)模式和程序_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、28335使用串口燒寫程序串口燒寫是一種相對較方便的燒寫方式,相對于仿真器或是CAN燒寫,相對于仿真器或是USB轉(zhuǎn)CAN的設(shè)備,串口是一種非常廉價的燒寫方式,而且也不需要安裝專業(yè)的集成開發(fā)環(huán)境CCS等,但是不能實現(xiàn)在線調(diào)試,因此也只適用于程序基本不用再調(diào)整或大批量的場合。F28335的存儲器映射圖如下:BOOTROM 是一塊8K X 16的只讀存儲器,位于地址空間0x3FE0000x3FFFFF,片內(nèi)BOOTROM在出廠時固化了引導(dǎo)加載程序以及定點和浮點數(shù)據(jù)表,片上BOOTROM的存儲映射如下圖所示:1內(nèi)BOOT ROM數(shù)學(xué)表:在BOOT ROM中保留了4K X 16位空間,用以存放浮點和IQ

2、數(shù)據(jù)公式表,這些數(shù)據(jù)公式表有助于改善性能和節(jié)省SARAM空間。2.CPU向量表:CPU向量表位于ROM存儲器0x3FE0000x3FFFFF段內(nèi),如下圖所示。復(fù)位后,當(dāng)VMAP=1,ENPIE=0(PIE向量表禁止)時,該向量表激活。在內(nèi)部BOOT ROM引導(dǎo)區(qū)中能夠調(diào)用的唯一向量就是位于0x3FFFC0的復(fù)位向量。復(fù)位向量在出廠時被燒錄為直接指向存儲在BOOT ROM空間中的InitBoot函數(shù),該函數(shù)用于開啟引導(dǎo)過程。然后通過通用I/O引腳上的檢驗判斷,決定具體引導(dǎo)模式。引導(dǎo)模式與控制引腳之間的關(guān)系如下圖所示:Bootloader特性:Bootloader是位于片上引導(dǎo)ROM中的在復(fù)位后執(zhí)

3、行的程序,用于在上電復(fù)位后,將程序代碼從外部源轉(zhuǎn)移到內(nèi)部存儲器。這允許代碼暫時存儲在掉電不丟失數(shù)據(jù)的外部存儲器內(nèi),然后被轉(zhuǎn)移到高速存儲器中執(zhí)行。引導(dǎo)ROM中的復(fù)位向量將程序執(zhí)行重定向至InitBoot函數(shù)。執(zhí)行器件初始化之后,bootloader將檢查GPIO引腳的狀態(tài)以確定您需要執(zhí)行哪種引導(dǎo)模式。這些選項包括:跳轉(zhuǎn)至閃存、跳轉(zhuǎn)至SARAM、跳轉(zhuǎn)至OTP或調(diào)用其中一個片上引導(dǎo)加載例程。完成選擇進程后,如果已完成所需的引導(dǎo)加載,處理器將在所選引導(dǎo)模式確定的應(yīng)用起點繼續(xù)執(zhí)行。如果調(diào)用了bootloader,則由外設(shè)加載的輸入流確定此應(yīng)用起點地址。然而,如果選擇直接引導(dǎo)至閃存、OTP或SARAM,這

4、些存儲器塊中每一個存儲器塊的應(yīng)用起點均已預(yù)定義。上圖顯示了引導(dǎo)進程的概述。以下引導(dǎo)模式不掉用bootloader,他們會跳轉(zhuǎn)至存儲器中的預(yù)定義位置:1. 跳轉(zhuǎn)至閃存中的分支指令:在此模式下,引導(dǎo)ROM軟件將針對28x操作配置器件,然后直接分支至閃存的0x33FFF6位置。此位置剛好是128位代碼安全模塊(CSM)密碼位置之前。您需要預(yù)先在0x33FFF6位置處編寫分支指令,以將代碼執(zhí)行重定向至定制的boot-loader或應(yīng)用代碼。在僅有RAM的器件上,“引導(dǎo)至閃存”將跳轉(zhuǎn)到保留存儲器,因此不應(yīng)當(dāng)使用此選項。2. 跳轉(zhuǎn)至M0 SARAM在此模式下,BOOTROM將針對28x操作配置器件,然后直

5、接分支至0x000000,即M0 SARAM存儲器塊中的第一個地址。3. 跳轉(zhuǎn)至OTP存儲器在此模式下直接分支至0x380400,即OTP存儲器塊中的第一個地址以下引導(dǎo)模式將調(diào)用一個用于將數(shù)據(jù)流從外設(shè)加載至存儲器的引導(dǎo)加載例程:SCI-A(注意此處的SCI-A對應(yīng)的是GPIO28和GPIO29)SPI-AI2C-AeCAN-AGPIO0-GPIO15并行引導(dǎo)。如果使用SCI或者其他引導(dǎo)的話,首先需要將啟動模式選擇相關(guān)的引腳配置成對應(yīng)的模式,然后器件退出復(fù)位狀態(tài)之后,首先從復(fù)位向量處開始運行,即從0x3FFFC0處,該地址存放著BOOT ROM中的第一個匯編初始引導(dǎo)程序InitBoot程序的入口

6、地址,程序跳轉(zhuǎn)至0x3FFC00執(zhí)行InitBoot程序。該程序主要初始化F28335器件工作的目標(biāo)模式。然后讀取安全保護模塊的密碼,如果CSM密碼被擦除(全部等于0xFFFF)則自動解鎖,否則CSM仍被鎖定。對CSM密碼讀取完成后,初始化例程調(diào)用模式選擇功能函數(shù)(SelectBoot),該函數(shù)根據(jù)GPIO的狀態(tài)確定處理器引導(dǎo)的方式。一旦完成SelectMode將會把入口地址返回給初始化引導(dǎo)。然后初始化引導(dǎo)函數(shù)調(diào)用回復(fù)CPU寄存器的退出例程(ExitBoot)并退出到由引導(dǎo)模式確定的程序入口地址。因此我們在使用SCI升級程序時可以分兩個步驟,第一個步驟是我們需要一個Bootloader程序,第

7、二個就是我們要升級的程序,BootLoader程序就是我們在選擇引導(dǎo)SCI模式之后,SelectBoot之后通過串口加載的第一個程序,待ExitBoot之后會跳轉(zhuǎn)到我們這個bootloader指定的地址開始執(zhí)行(即將控制權(quán)交給我們的這個BootLoader程序),因此我們的BootLoader程序就肩負著串口接收我們的應(yīng)用程序并將應(yīng)用程序燒寫到FLASH的任務(wù)。第二個就是我們的應(yīng)用程序,這個跟平常的應(yīng)用程序一樣,沒有任何區(qū)別。1. BootLoader程序由上面的介紹明顯知道我們的Bootloader程序是運行在RAM里面的,所以使用CCS在編寫該程序的時候使用的是RAM_Link的CMD,而

8、且該程序除了串口的處理還有包括FLASH操作的API函數(shù),而這些函數(shù)必須要運行在RAM里面,而且在進行FLASH操作的時候要將中斷全部都關(guān)掉,F(xiàn)LASH的API有相關(guān)的例程是燒進FLASH的還要拷貝到RAM,我們這里正好還免去了拷貝的過程,因為我們整個程序都是運行在RAM中的。Bootloader數(shù)據(jù)流的結(jié)構(gòu):上圖就是BootLoader數(shù)據(jù)流的結(jié)構(gòu),數(shù)據(jù)流的第一個16位字稱為鍵值,該鍵值用來指向Bootloader指示流入的數(shù)據(jù)流的寬度:8位或16位(在這里SCI就是8位),對于8位數(shù)據(jù)流,鍵值為0x08AA,如果bootloader收到一個無效的鍵值,加載則中止。則直接跳轉(zhuǎn)到FLASH開始

9、執(zhí)行。接下來的8個字(2-9)用于初始化寄存器直,如果bootloader不使用這些值,則將這些值留作將來使用。第10個和第11個字組成了22位應(yīng)用起點地址,此地址用于在完成引導(dǎo)加載后初始化PC,也就是我們程序的起點。第12個字表示傳輸?shù)牡谝粋€數(shù)據(jù)塊的大小。對于8位和16位數(shù)據(jù)流格式,該數(shù)據(jù)塊的大小均定義為塊中的16位字個數(shù),例如,要從8位數(shù)據(jù)流中傳輸一個包含20個8位數(shù)據(jù)值的數(shù)據(jù)塊,該塊大小將為0x000A,表示有10個16位字。第13和14個字表示程序的目的地址,后面跟的就是程序的字,直到遇到數(shù)據(jù)塊長度為0的則傳輸結(jié)束。上圖為BOOTLoader傳輸流程,如果不相等會自動退出引導(dǎo)程序,系統(tǒng)

10、會從內(nèi)部FLASH存儲器執(zhí)行程序。這里需要講一下,我們的Bootloader數(shù)據(jù)流如何得到,我們正常的使用CCS編譯鏈接得到了xx.out文件,然后使用hex2000.exeboot sci8-map=xx.map -o xx.hex-i xx.out(詳細解釋可參考TMS320C28x-Assembly-Language-Tools-User's-Guide-v6.1.pdf),當(dāng)然你可以將這些命令參數(shù)寫成腳本xx.cmd,然后直接執(zhí)行hex2000.exe xx.cmd即可。這就會生成Intel格式的hex文件,我們需要自己對這個hex文件解析,對于生成的Hex文件都是以冒號開始,

11、后面一個字節(jié)是數(shù)據(jù)長度,2-3字節(jié)是地址,第4字節(jié)是數(shù)據(jù)類型(00表示數(shù)據(jù)記錄,01表示文件結(jié)束記錄,02表示擴展段地址記錄,04表示擴展線性地址記錄)首先需要一個將兩個字符轉(zhuǎn)換為一個字節(jié)量函數(shù):Void CharToByte(char *pChar,BYTE *pByte)char h,l;h=pChar0;l=pChar1;if(l>=0 && l<=9)l=l-0;else if(l>=a && l<=f)l=l-a+0xa;else if(l>=A && l<=F)l=l-A+0xa;if(h>=

12、0 && h<=9)h=h-0;else if(h>=a && h<=f)h=h-a+0xa;else if(h>=A && h<=F)h=h-A+0xa;*pByte=(BYTE)h*16 + 1;解析的關(guān)鍵代碼:If(fopen_s(&myFile,filename,”r”) != 0)Printf(“打開文件%s失?。 ?,filename);while(!feof(myFile)+len;fgetc(myFile);/將文件長度計算出來用于申請存儲數(shù)據(jù)的緩沖區(qū)rewind(myFile);outBuf

13、= (BYTE *)malloc(len/2);memset(outBuf,0xff,len/2);while(!feof(myFile)if(fgetc(myFile) = :)/:號表示一行的開始/一行的頭兩個字符為該行包含的數(shù)據(jù)長度data0 = fgetc(myFile);data1 = fgetc(myFile);CharToByte(data,&datalen);/一行的第3、4個字符為數(shù)據(jù)存儲起始地址的高位data0 = fgetc(myFile);data1 = fgetc(myFile);CharToByte(data,&addresshigh);/一行的5、

14、6個字符為數(shù)據(jù)存儲起始地址的低位data0 = fgetc(myFile);data1 = fgetc(myFile);CharToByte(data,&addresslow);/一行的7、8個字符為數(shù)據(jù)類型data0 = fgetc(myFile);data1 = fgetc(myFile);CharToByte(data,&dataType);if(dataType = 0x00)/表示普通數(shù)據(jù)for(i=0;i<datalen;i+)data0 = fgetc(myFile);data1 = fgetc(myFile);CharToByte(data,&by

15、teData);outBufadressHigh*256+adresslow+i = byteData;if(dataType = 0x01)printf(“文件結(jié)束記錄!”);if(dataType = 0x02)printf(“不支持擴展段地址記錄!”);return;if(dataType = 0x04)/本行包含擴展線性地址記錄/表示的是extended地址高位和低位data0 = fgetc(myFile);data1 = fgetc(myFile);CharToByte(data,&addresslinearhigh);data0 = fgetc(myFile);data1

16、 = fgetc(myFile);CharToByte(data,&addresslinearlow);fclose(myFile);這個只是對hex文件進行了解析,然后還需要通過串口將數(shù)據(jù)發(fā)送出去,在發(fā)送數(shù)據(jù)之前需要先發(fā)送“A”字符給DSP,等待DSP回復(fù)“A”之后,表明DSP波特率已經(jīng)鎖定,這時候可以將轉(zhuǎn)換的數(shù)據(jù)發(fā)送給DSP,DSP在接收的時候會將接收到的數(shù)據(jù)保持原樣返回給上位機,反觀我們的核心板,我們的核心板上的SCI引出的不是GPIO28和GPIO29,再者就是控制發(fā)送的引腳在上電時的電平不對導(dǎo)致燒寫不成功。等這個程序傳輸完了之后,會跳轉(zhuǎn)到我們這個程序指定的入口地址開始執(zhí)行,此

17、時可以進行下一步的操作,我們需要將我們的應(yīng)用程序(即xx.out文件也轉(zhuǎn)換成xx.hex),轉(zhuǎn)換的cmd命令如:hex2000.exeromwidth 16-memwidth16-i-oxx.hexxx.out轉(zhuǎn)換之后的hex文件也需要按照上述轉(zhuǎn)換的方式轉(zhuǎn)換之后才能發(fā)送出去,因為RAM空間有限,而且一個應(yīng)用程序通常都比較大,因此上位機可以一行一行的解析然后發(fā)送給DSP,DSP端接收之后根據(jù)指定的地址還有數(shù)據(jù)長度寫入對應(yīng)的FLASH即可。在完成FLASH操作之后,就可以斷電撥回FLASH啟動正常啟動看是不是正常運行了。上述的是DSP啟動過程分析,還提供了如果需要自己制作的思路及方法,上述方法僅僅做了驗證,非常不完善;但是我們可以找到第三方的燒寫軟件,相比較而言這樣的燒寫軟件相對來說要可靠的多,下面大致介紹一下使用C2Prog這個軟件來燒寫的過程:有的CCS軟件在生成的配置選項中可以找到生成Intel HEX文件的選項,但是我裝的版本在選擇了

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論