Bootloader下實(shí)現(xiàn)Flash的讀寫.doc_第1頁
Bootloader下實(shí)現(xiàn)Flash的讀寫.doc_第2頁
Bootloader下實(shí)現(xiàn)Flash的讀寫.doc_第3頁
Bootloader下實(shí)現(xiàn)Flash的讀寫.doc_第4頁
Bootloader下實(shí)現(xiàn)Flash的讀寫.doc_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

物理與電子工程學(xué)院設(shè)計(jì)實(shí)驗(yàn)報(bào)告 嵌入式系統(tǒng)與應(yīng)用設(shè)計(jì)性實(shí)驗(yàn)報(bào)告 題 目 Bootloader下實(shí)現(xiàn)Flash的讀寫 系 別 年 級 專 業(yè) 班 級 學(xué) 號 學(xué)生姓名 指導(dǎo)教師 實(shí)驗(yàn)時(shí)間 2010.6 目 錄課題要求21.本課題的目的22.運(yùn)行環(huán)境2正文3一.課題分析31.1ADS1.2 開發(fā)環(huán)境31.2超級終端41.3Bootloader的燒寫過程5二系統(tǒng)設(shè)計(jì)62.1程序流程圖62.2代碼分析72.3硬件連接圖102.4實(shí)驗(yàn)結(jié)果11三.技術(shù)實(shí)現(xiàn)問題12四. 總結(jié)與體會(huì)12參考文獻(xiàn)13設(shè)計(jì)性實(shí)驗(yàn)報(bào)告成績: 指導(dǎo)教師簽名:14課題要求1.本課題的目的嵌入式系統(tǒng)是當(dāng)前研究的熱門課題。而Bootloader是嵌入式系統(tǒng)軟件開發(fā)的第一個(gè)環(huán)節(jié),主要用于完成由硬件啟動(dòng)到操作系統(tǒng)啟動(dòng)的過渡,從而為操作系統(tǒng)提供基本的運(yùn)行環(huán)境。Bootloader從字面上講就是啟動(dòng)裝載程序,這一程序在系統(tǒng)的啟動(dòng)過程中扮演了非常重要的角色。由于Bootloader作為內(nèi)核的引導(dǎo)者,并不承擔(dān)業(yè)務(wù)軟件的功能,所以它并沒有引起足夠的重視。但它是系統(tǒng)啟動(dòng)時(shí)運(yùn)行的第一段代碼,用于引導(dǎo)操作系統(tǒng)內(nèi)核。如果由于誤操作或者程序異常導(dǎo)致Bootloader被改寫,那么第一個(gè)運(yùn)行的程序就遭破壞,后續(xù)程序就不可能也沒有辦法運(yùn)行了,這時(shí)就必須使用加載工具重新燒寫B(tài)ootloader,而這在產(chǎn)品應(yīng)用現(xiàn)場是不可能完成的。因此,Bootloader在嵌入式系統(tǒng)設(shè)計(jì)中舉足輕重。Bootloader通常被存放在Flash存儲(chǔ)器中。Flash存儲(chǔ)器是一種可在線多次擦除的非易失性存儲(chǔ)器,即掉電后數(shù)據(jù)不會(huì)丟失。它主要分為兩種:一種為NOR型Flash,另一種為NAND型Flash。NAND型Flash以塊為單位存取數(shù)據(jù),使用控制信號選擇極高的單元密度,并且寫人和擦除的速度也很快,是高數(shù)據(jù)存儲(chǔ)密度的最佳選擇。而NOR型Flash的特點(diǎn)是支持程序在芯片內(nèi)部運(yùn)行,這樣應(yīng)用程序可以直接在Flash上運(yùn)行,不必再把代碼讀到系統(tǒng)RAM中?;谏鲜鎏攸c(diǎn)Bootloader通常是存儲(chǔ)在NOR Flash中,我們本次實(shí)驗(yàn)就是研究Bootloader下實(shí)現(xiàn)NOR Flash的讀寫。2.運(yùn)行環(huán)境硬件:ARM嵌入式開發(fā)平臺(tái)、ARM7TDMI 的JTAG 仿真器、PC機(jī)Pentium100 以上。軟件:PC 機(jī)操作系統(tǒng)win98、Win2000 或WinXP 、ARM SDT 2.51 或ADS1.2 集成開發(fā)環(huán)境、仿真器驅(qū)動(dòng)程序、超級終端通訊程序 正文一.課題分析本次實(shí)驗(yàn)的設(shè)計(jì)要求是在Bootloader啟動(dòng)后,提供一個(gè)可以讀寫Flash的程序,可以提供用戶保存一些數(shù)據(jù),如系統(tǒng)的IP地址等。在進(jìn)行編寫Flash的操作前,我們還必須知道:如何使用ADS 編譯、下載、調(diào)試;超級終端的使用;怎么通過ARM7TDMI 的JTAG 仿真器將Bootloader程序燒寫到實(shí)驗(yàn)箱中; Bootloader的作用等等。這些都必須事先做好準(zhǔn)備,這樣才有可能將本次實(shí)驗(yàn)做好。而具體要對NOR Flash進(jìn)行的操作包括“讀”、“寫”和“擦除”。對于“讀”操作,可以直接從相應(yīng)地址讀出數(shù)據(jù),但對于“寫”和“擦除”操作,應(yīng)遵循NOR Flash的操作步驟,通常應(yīng)根據(jù)地址定義的類型,向特定的地址處寫入特定的命令字,然后再讀出數(shù)據(jù),以驗(yàn)證操作是否成功。下面我將具體介紹ADS1.2 開發(fā)環(huán)境、超級終端和Bootloader的燒寫過程。1.1 ADS1.2 開發(fā)環(huán)境我們要學(xué)會(huì)使用ADS1.2來進(jìn)行編譯、下載、調(diào)試,在此我簡要介紹下。首先得建立一個(gè)新的工程,選擇File New菜單,將它放到所要保存的路徑下。然后選擇Release版本,它是用于下載的,而Debug是用來調(diào)試的,可以不用設(shè)置。使用Edit | Debug Settings 菜單對Release 版本進(jìn)行參數(shù)設(shè)置。在Debug Settings 對話框中做如下設(shè)置:選擇Target Settings 項(xiàng),在Post-linker 一欄中選擇ARM fromELF;選擇ARM Linker 項(xiàng)的Output 選項(xiàng)卡,由于BootLoader 映象文件最終運(yùn)行的地址空間是0Bank,所以該工程的連接地址不同于其他運(yùn)行于SDRAM 的工程,具體設(shè)置如下圖1所示;選擇ARM C Compiler 項(xiàng),在ATPCS 選項(xiàng)卡中選擇ARM/Thump interwork;選擇ARM Linker 項(xiàng),在Layout 選項(xiàng)卡的Place at beginning of image 框中設(shè)置程序的入口模塊,具體操作如下圖2所示;在Output file name 框中設(shè)置輸出文件名為system.bin, 這就是要下載到開發(fā)板的嵌入式應(yīng)用程序文件。如果需要調(diào)試的話, Debug版本參數(shù)設(shè)置和Release版本的一樣。圖 1 設(shè)置連接地址范圍圖 2 設(shè)置入口模塊1.2 超級終端運(yùn)行Windows 系統(tǒng)下的超級終端(HyperTerminal )應(yīng)用程序,新建一個(gè)通信終端,取名為arm 。選擇終端的連接的串口,設(shè)置通信的格式和協(xié)議,波特率為115200 ,無數(shù)據(jù)流控制。完成超級終端設(shè)置以后,可以保存為一個(gè)特定終端到桌面上,以備后用,然后在終端上就可以看到程序輸出的信息了,如圖3所示為本次實(shí)驗(yàn)的提示信息。圖 3 提示信息1.3 Bootloader的燒寫過程嵌入式系統(tǒng)的BootLoader,類似于PC上的BIOS,往往固化在系統(tǒng)0x0地址處的Flash之中,在系統(tǒng)加電復(fù)位后,操作系統(tǒng)內(nèi)核執(zhí)行之前,處理器將首先執(zhí)行BootLoader中的啟動(dòng)代碼。通過這段程序,初始化軟硬件運(yùn)行環(huán)境,如CPU異常向量表、各模式下的堆棧、內(nèi)存控制器、看門狗等硬件設(shè)備;同時(shí)初始化應(yīng)用程序,如C語言變量初始化,從而將系統(tǒng)軟硬件設(shè)置到合適狀態(tài),最后引導(dǎo)操作系統(tǒng)內(nèi)核并跳轉(zhuǎn)到操作系統(tǒng)內(nèi)核的起始代碼部分執(zhí)行。Bootloader功能包括上電后對系統(tǒng)進(jìn)行自檢,主要包括SDRAM,CACHE,F(xiàn)LASH 等硬件;提供Shell Menu 檢測設(shè)置菜單和相應(yīng)的檢測程序;引導(dǎo)操作系統(tǒng)及應(yīng)用程序。下面簡要介紹下Bootloader的燒寫過程,首先先打開UarmJtag,如圖4所示,完成初始化配置,打開要燒寫的目標(biāo)代碼,點(diǎn)擊“Flash編程”,在彈出的對話框中如圖5,寫上地址,選擇Flash的型號。然后把實(shí)驗(yàn)箱電源打開,點(diǎn)擊“整片擦除”,完成后,重新復(fù)位,再點(diǎn)擊“編程”,這樣就完成了整個(gè)Bootloader程序的下載燒寫。圖 4 Jtag菜單欄圖 5 初始化配置二系統(tǒng)設(shè)計(jì)2.1 程序流程圖 圖6 “寫”操作流程 圖7 “塊擦除”操作流程2.2 代碼分析首先我將介紹的是如何在Bootloader中增加菜單項(xiàng)。u 在Bootloader中增加三個(gè)菜單項(xiàng)。每個(gè)菜單項(xiàng)都對應(yīng)一個(gè)類型為Bios_function 的結(jié)構(gòu)體變量,其中包括該菜單項(xiàng)的功能函數(shù)指針,快捷鍵,菜單中的提示信息等內(nèi)容。所有這些結(jié)構(gòu)體變量都在一個(gè)數(shù)組中,以方便檢索。在顯示菜單后程序等待按鍵并根據(jù)鍵值查找對應(yīng)的功能函數(shù)。 增加菜單項(xiàng)的基本格式為:typedef struct Bios_func_t func; char *pShellMenu; /shell 模式下顯示的菜單字符串char MenuAcc; /shell 模式下菜單快捷鍵char *pCommand; /命令行模式下的命令char *pHelp; /命令行模式下的幫助Bios_function;我自己按照格式編寫的代碼如下:Bios_function Flashwrite_func= /寫FlashFlashwrite, write the flash, /顯示的菜單為“write the flash”w, /菜單快捷鍵為“w”writeflash, /命令行模式下的命令為“writeflash”NULL /沒有幫助;Bios_function Flashread_func= /讀FlashFlashread, read the flash, /顯示的菜單為“read the flash”r, /菜單快捷鍵為“r”readflash, /命令行模式下的命令為“readflash”NULL /沒有幫助;Bios_function SectorErase_func= /Flash塊擦除SectorErase,erase the flash, /顯示的菜單為“erase the flash”s, /菜單快捷鍵為“s”eraseflash, /命令行模式下的命令為“eraseflash”NULL /沒有幫助;具體在超級終端上顯示出來的效果為圖8所示,可以清楚的看到Bootloader的菜單項(xiàng)增加了三個(gè)菜單項(xiàng):圖 8 菜單項(xiàng)下面我對Flash的操作進(jìn)行具體說明,在進(jìn)行Flash的各種操作前,應(yīng)首先確定Flash地址類型為“字(16位)”還是“字節(jié)(8位)”,而本次實(shí)驗(yàn)是FLASH Am29LV160D的“字”地址類型。u FLASH“讀”操作對于“讀”操作,我們可以直接從相應(yīng)地址讀出數(shù)據(jù),具體代碼如下:void readFlash(unsigned int *dataaddr1) datadata=*dataaddr1; /直接從dataaddr1地址中讀u FLASH“寫”操作對于“寫”和“擦除”操作,應(yīng)遵循NOR Flash的操作步驟,通常應(yīng)根據(jù)地址定義的類型,向特定的地址處寫入特定的命令字,如果需要,再讀出數(shù)據(jù),驗(yàn)證操作是否成功。Flash“寫”操作共需要4個(gè)周期的總線寫操作,具體實(shí)現(xiàn)代碼如下: void FlashProg(U32 ProgStart, U16 *DataPtr, U32 WordCnt)U16 i, j;ProgStart += ROM_BASE; /定義起始地址for( ; WordCnt; ProgStart+=2, DataPtr+, WordCnt-)j = *DataPtr;CMD_ADDR0 = 0xaaaa; /將0xaaaa寫到FLASH地址0x5555CMD_ADDR1 = 0x5555; /將0x5555寫到FLASH地址0x2aaaCMD_ADDR0 = 0xa0a0; /將0xa0a0寫到FLASH地址0x5555*(volatile U16 *)ProgStart = j; /將數(shù)據(jù)寫到對應(yīng)的編程地址上去while(1) /判斷是否寫成功i = *(volatile U16 *)ProgStart&0x40;if(i!=*(volatile U16 *)ProgStart&0x40)/D6 = D6continue; /繼續(xù)if(*(volatile U16 *)ProgStart&0x80)=(j&0x80)break; /D7 = D7,退出u FLASH“擦除”操作在對Flash讀寫操作之前,要先對Flash進(jìn)行擦除操作。Flash有3種擦除方式:段擦除、塊擦除和芯片擦除。不同的擦除方式有不同的擦除命令,本次實(shí)驗(yàn)所使用的是塊擦除,它的操作需要6個(gè)周期的總線寫操作,將6條命令寫入對應(yīng)地址,就可實(shí)現(xiàn)塊擦除。具體的代碼如下:void SectorErase(void) U32 sector;if(state&1)if(state&2)SWPIDExit();elseCFIQueryExit();sector = 0x10000; /塊擦除地址為0x10000CMD_ADDR0 = 0xaaaa; /將0xaaaa寫到FLASH地址0x5555CMD_ADDR1 = 0x5555; /將0x5555寫到FLASH地址0x2aaaCMD_ADDR0 = 0x8080; /將0x8080寫到FLASH地址0x5555CMD_ADDR0 = 0xaaaa; /將0xaaaa寫到FLASH地址0x5555CMD_ADDR1 = 0x5555; /將0x5555寫到FLASH地址0x2aaa*(volatile U16 *)sector = 0x3030;/將0x3030寫到要擦除的SECTOR對應(yīng)的地址while(1)U16 i; /判斷是否擦除成功i = *(volatile U16 *)sector)&0x40;if(i!=*(volatile U16 *)sector)&0x40) /D6 = D6continue; /繼續(xù)if(*(volatile U16 *)sector)&0x80)break; /D7 = 1,退出printf(Erase sector 0x%xokn, sector-ROM_BASE);以上就是對本次實(shí)驗(yàn)主要代碼的分析。2.3 硬件連接圖本次實(shí)驗(yàn)所用的Flash為Am29LV160D,它是由AMD公司推出的1M16bit的CMOS多用途Flash。圖 9 Am29LV160D的電路連接圖ARM處理器外部擴(kuò)展的是16-BIT的NOR FLASH,數(shù)據(jù)線必須要錯(cuò)位連接。圖10給了一個(gè)ARM處理器和16-BIT NOR FLASH的連接示意圖。ARM處理器的數(shù)據(jù)信號D0-D15和FLASH的數(shù)據(jù)信號D0-D15是一一對應(yīng)的。而ARM處理器的地址信號和NOR FLASH的地址信號是錯(cuò)位連接的,ARM的A0懸空。需要錯(cuò)位連接的原因是:ARM處理器的每個(gè)地址對應(yīng)的是一個(gè)BYTE的數(shù)據(jù)單元,而16-BIT的FLASH的每個(gè)地址對應(yīng)的是一個(gè)HALF-WORD(16-BIT)的數(shù)據(jù)單元。為了保持匹配,所以必須錯(cuò)位連接。這樣,從ARM處理器發(fā)送出來的地址信號的最低位A0對16-BIT FLASH來說就被屏蔽掉了。圖 10 ARM處理器和16-BIT FLASH的連接示意圖注:有些ARM處理器內(nèi)部可以設(shè)置地址的錯(cuò)位。對于支持軟件選擇地址錯(cuò)位的處理器,在連接16-BIT FLASH的時(shí)候,硬件上可以不需要把地址線錯(cuò)位。如果處理器支持內(nèi)部設(shè)置地址錯(cuò)位,在實(shí)際訪問的時(shí)候,送出的地址實(shí)際上是在MCU內(nèi)部做了錯(cuò)位處理,其作用是等效于硬件連接上的錯(cuò)位的。2.4 實(shí)驗(yàn)結(jié)果打開ADS,設(shè)置參數(shù),設(shè)置好之后,把代碼放進(jìn)去編譯,有錯(cuò)誤修改,沒有錯(cuò)誤的話,生成system.bin文件,注意是把Release版本的的system.bin通過JTAG燒寫到實(shí)驗(yàn)箱中,然后打開超級終端看結(jié)果。(具體操作過程在課程分析中講過了,在這里不重復(fù)了。)在鍵盤上依次按鍵 s、w、r(先擦除,然后寫,最后讀),當(dāng)然每次按鍵過后都要按復(fù)位鍵重新復(fù)位,最終超級終端上顯示的結(jié)果如下:圖 11 實(shí)驗(yàn)結(jié)果三.技術(shù)實(shí)現(xiàn)問題在本次實(shí)驗(yàn)完成過程中,我們碰到了下面幾個(gè)主要問題。一開始我們不知道從哪下手,經(jīng)過老師的多次講解和分析,我們決定按老師說的分為三部分:“讀”、“寫”、“擦除”,分別來寫。我們就想建立一個(gè)Flash.c文件,在這里面寫相關(guān)代碼,可寫完了編譯時(shí)發(fā)現(xiàn)出錯(cuò),出錯(cuò)提示是我建立的Flash.c文件與主文件Main.c同名,可檢查發(fā)現(xiàn)沒重名啊,后來我們問老師,老師建議我們重新建個(gè)文件,可建了之后,編譯時(shí)發(fā)現(xiàn)又是這個(gè)錯(cuò)誤,最后實(shí)在不知道哪錯(cuò)了,我們只好將Flash.c里的文件都放到Main.c里面,這才沒錯(cuò)誤。我們將system.bin燒寫到實(shí)驗(yàn)箱中發(fā)現(xiàn)結(jié)果沒有出來,經(jīng)過同學(xué)的提示才知道我們應(yīng)該將起始地址定義在0x10000,否則將和Bootloader程序沖突,修改過后實(shí)驗(yàn)結(jié)果終于出來了。當(dāng)然在這過程中,還會(huì)碰到許多其它的問題,但那些都是小問題,看到提示后就知道錯(cuò)在哪了,比如,變量沒定義,符號錯(cuò)誤啊等等,都是由于寫的時(shí)候沒注意引起的。四. 總結(jié)與體會(huì)本次實(shí)驗(yàn)重點(diǎn)在于Bootloader和Flash的研究,我們畢竟是剛接觸這方面的知識(shí),所以不會(huì)是很正常的,首先我通過去圖書館或上網(wǎng)查資料知道它們起的作用、如何操作等,現(xiàn)在科技發(fā)達(dá),完全可以找到相

溫馨提示

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

評論

0/150

提交評論