![基于OK6410的嵌入式開發(fā)教程(上)_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/10/d14b4274-e879-4569-a39b-b9feb88a19ed/d14b4274-e879-4569-a39b-b9feb88a19ed1.gif)
![基于OK6410的嵌入式開發(fā)教程(上)_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/10/d14b4274-e879-4569-a39b-b9feb88a19ed/d14b4274-e879-4569-a39b-b9feb88a19ed2.gif)
![基于OK6410的嵌入式開發(fā)教程(上)_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/10/d14b4274-e879-4569-a39b-b9feb88a19ed/d14b4274-e879-4569-a39b-b9feb88a19ed3.gif)
![基于OK6410的嵌入式開發(fā)教程(上)_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/10/d14b4274-e879-4569-a39b-b9feb88a19ed/d14b4274-e879-4569-a39b-b9feb88a19ed4.gif)
![基于OK6410的嵌入式開發(fā)教程(上)_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/10/d14b4274-e879-4569-a39b-b9feb88a19ed/d14b4274-e879-4569-a39b-b9feb88a19ed5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、U-BOOT編寫(基于OK6410) Written by water1.U-BOOT工作原理及設(shè)計(jì)藍(lán)圖 在所有章節(jié)開始必須首先介紹一下U-BOOT,所謂U-BOOT就是bootloader的一種,可用于多種cpu(x86,ARM等),在不同系統(tǒng)像Linux,Vxworks,QNX等上運(yùn)行調(diào)試。它能起到在上電后能對(duì)硬件,存儲(chǔ)器,內(nèi)核等完成初始化,并且引導(dǎo)內(nèi)核和文件系統(tǒng)正常工作的作用。U-BOOT并不是單純的裸機(jī)程序,在學(xué)完此課程后,可以完成大部分裸機(jī)程序的調(diào)試,移植與開發(fā)。最后得說明,我所用的開發(fā)板是OK6410,而我所做的學(xué)習(xí)筆記完全是建立在國(guó)嵌視頻上的,我會(huì)在這個(gè)筆記中對(duì)視頻的內(nèi)容進(jìn)行總結(jié)
2、,順序會(huì)有所調(diào)整。1.1 U-BOOT工作原理要講解這個(gè)首先需要讓大家看一張圖(注:這張圖是2440的機(jī)理圖,放在這里是為了能方便講解和理解):這張圖共分為兩部分,左邊部分是用于nor flash啟動(dòng),而右邊這部分就是用于nand flash啟動(dòng)了,這個(gè)也是我們講的重點(diǎn)。首先需要明確一點(diǎn),上電后第一條程序,肯定是從0地址(0x00000000)開始執(zhí)行的。左圖顯示0地址是在SROM中,這個(gè)我們不去管它,而右圖顯示第一條指令是從SRAM中執(zhí)行的,而這個(gè)存儲(chǔ)器只有4K,在這里我們就需要先明確一下“墊腳石(Stepping Stone)”這個(gè)概念了。在2440選擇從nand flash啟動(dòng)剛上電時(shí),
3、系統(tǒng)會(huì)自動(dòng)將nand flash中bootloader的前4K,放入到我們前面所述的0地址,也就是Boot internal SRAM中,此時(shí)系統(tǒng)會(huì)執(zhí)行bootloader的前4K,同時(shí)系統(tǒng)還會(huì)將整個(gè)bootloader復(fù)制到我們的內(nèi)存,前4k執(zhí)行完后,就跳轉(zhuǎn)至內(nèi)存繼續(xù)執(zhí)行剩余的bootloader,而我們這里4K大小的SRAM就是墊腳石(stepping stone)。為什么需要它,這點(diǎn)很簡(jiǎn)單,兩圖對(duì)比,我們就能發(fā)現(xiàn)我們的nand flash沒參與我們的統(tǒng)一編址,所以只能借stepping stone作為我們的橋梁。介紹完2440,我們來看看6410。先給大家?guī)讖垐D: 圖1 圖2 圖3我們先
4、看圖2,從圖2我們可以看出6410可以從哪些部分啟動(dòng),而那些部分又被存放在哪兒,我們可以注意到nand flash是被存放在IROM中的。接下來我們看圖2,我們可以看到0地址處放的是一個(gè)最大可達(dá)到128M的存儲(chǔ)器,描述和備注我就不贅述了,可以看出他是個(gè)鏡像存儲(chǔ)器,接下來就是IROM和stepping stone,下面的存儲(chǔ)器我們暫時(shí)不研究,不說了。看完兩張圖,可能最有疑問的是最后一張圖,我們說過上電執(zhí)行的第一條程序應(yīng)該在0地址處,為什么那里不像2440一樣放的是stepping stone,而是一個(gè)鏡像存儲(chǔ)器呢。其實(shí)聰明一些的話,應(yīng)該已經(jīng)注意到了,既然是鏡像存儲(chǔ)器,那當(dāng)上電后,我們的IROM和
5、stepping stone(兩個(gè)最大都能達(dá)到64M),會(huì)被鏡像入0地址處的存儲(chǔ)器(最大可達(dá)128M)中,然后剩下的就和2440一樣了。在這里可能大家還會(huì)有疑問,2440是直接從stepping stone中直接啟動(dòng),6410前面突然多了個(gè)IROM,好象有些不適應(yīng)。我們來看圖1。圖1是6410bootloader的工作原理圖,我們可以看到IROM里存放的是BL0,這個(gè)BL0他會(huì)首先完成對(duì)硬件的初始化,同時(shí)會(huì)將BL1也就是BL的前8k(6410的steeping stone為8K)放入墊腳石中,然后就和2440一樣,將BL放入內(nèi)存繼續(xù)執(zhí)行。至此,bootloader的工作原理講解完畢?,F(xiàn)在必須要
6、分析bootloader啟動(dòng)流程以完成我們自己的bootloader的架構(gòu)設(shè)計(jì)。我們采用分析U-BOOT的方法,來建立屬于我們自己的bootloader。由于分析的過程冗長(zhǎng)耗時(shí),在這里我就不分析了,但我會(huì)給出一張分析出的結(jié)果圖:2.U-BOOT編寫2.1 一些需要知道的知識(shí)概述首先大家必須先要了解的是ARM處理器的七種工作模式:圖1圖2兩張圖表明ARM處理器一共有7種工作模式,在這里我列一張表格來敘述其名稱及作用:用戶模式usr用于普通狀態(tài)下正常執(zhí)行程序系統(tǒng)模式sys運(yùn)行具有特權(quán)的操作系統(tǒng)任務(wù)管理模式svc對(duì)操作系統(tǒng)的保護(hù)模式數(shù)據(jù)訪問中斷模式abt當(dāng)數(shù)據(jù)或指令預(yù)取終止時(shí)進(jìn)入該模式,可用于虛擬存
7、儲(chǔ)或存儲(chǔ)保護(hù)未定義指令終止模式und當(dāng)未定義的指令執(zhí)行時(shí)進(jìn)入該模式,可用于支持硬件外部中斷模式irq用于通用的中斷處理快速中斷模式fiq用于高速數(shù)據(jù)傳輸或信道處理有幾點(diǎn)需要說明普通的應(yīng)用程序是在usr下運(yùn)行,而我們的內(nèi)核和bootloader是在svc下運(yùn)行。至此,7種工作模式交代完畢,而圖1中0bxxxxx,這種東西是用于CPSR,即程序狀態(tài)寄存器使用的。這也是我們接下來要說的,我們的處理器一共有37個(gè)寄存器,如圖2,其中有31個(gè)通用寄存器和6個(gè)程序狀態(tài)寄存器,r0-r7為不分組寄存器,r8-r14為分組寄存器,最后還有個(gè)r15,也就是我們所熟知的程序計(jì)數(shù)器(pc)。其實(shí)這當(dāng)中還有些特殊的寄
8、存器,比如r13(堆棧指針sp),r14(鏈接寄存器)。這個(gè)我們以后會(huì)說的。這部分內(nèi)容相對(duì)簡(jiǎn)單,我也不想細(xì)說,如有疑問,請(qǐng)自己查資料。接下來我們來談?wù)凜PSR(程序狀態(tài)寄存器)和SPSR(程序狀態(tài)保存寄存器),我這里先給出一張表:圖3然后我們?cè)賮碚務(wù)凜PSR和SPSR的作用和工作原理,看完圖2,再查完一些資料,應(yīng)該會(huì)對(duì)這個(gè)有一定的了解,先研究圖2,圖2顯示我們所說的7種工作模式下都有CPSR,而SPSR只有5種工作模式下存在,這5種工作模式被我們稱為異常模式,除usr以外的其他工作模式被稱為特權(quán)模式,那我們就要問,為什么要這樣設(shè)計(jì)?或者說,這樣的設(shè)計(jì)能反映CPSR和SPSR怎樣的工作原理?這個(gè)
9、問題很好回答,首先當(dāng)我們?cè)趗sr下運(yùn)行時(shí),我們的程序會(huì)在CPSR下存有備份,現(xiàn)在可以把它理解成備份,這個(gè)時(shí)候出現(xiàn)中斷,我們這個(gè)時(shí)候就切入了異常模式,我們會(huì)先將狀態(tài)從CPSR轉(zhuǎn)移至SPSR,等處理器處理完了此次中斷,然后在將SPSR的數(shù)據(jù)返還至CPSR,使?fàn)顟B(tài)回復(fù)至之前的狀態(tài)。解釋完了這些,我們現(xiàn)在來看看圖3,它反映的是SPSR和CPSR的寄存器數(shù)據(jù)格式。這里我們我們不需要全部記下來,但有5位需要注意,分別是N,Z,I,F(xiàn),M。我這里只做簡(jiǎn)單敘述,詳情請(qǐng)查閱ARM Architecture Reference Mannual。N位占31位,當(dāng)兩數(shù)相減結(jié)果為負(fù)時(shí)置位。Z位占30位,當(dāng)兩數(shù)相減結(jié)果為
10、0時(shí)置位。I位占7位,當(dāng)被置位時(shí),irq不可用。F位占6位,當(dāng)被置位時(shí),fiq不可用。M位占0-4位,這里是設(shè)置各種模式用的,圖1的0bxxxxx就是用在這里的。到這里我們就把所有的模式及寄存器講完了,接下來我們就需要編程了,編程我是不會(huì)在學(xué)習(xí)筆記中贅述的,但我會(huì)截圖說明,涉及到原理的,我可能會(huì)大篇敘述,如有疑問大家請(qǐng)自己查閱資料。2.1 匯編框架的編寫及異常向量表既然是匯編文件,我們肯定需要一個(gè).S的匯編文件,除此之外,我們編寫的bootloader可能文件有些繁雜,所以我們需要一個(gè)makefile文件,最后還需要一個(gè).lds的匯編器腳本文件。我們先編寫匯編器腳本:然后我們?cè)賮砭帉憁akef
11、ile文件:最后,我們來編寫start.S這個(gè)文件,要編寫這個(gè),我們必須要先查閱一下ARM Architecture Reference Mannual。圖1在這里,我們先來解釋一下異常(Exception)的概念,異常指因?yàn)閮?nèi)部或者外部的一些事件,使處理器不得不停下正在處理的事件,轉(zhuǎn)而去處理這些發(fā)生的事件。我們說ARM處理器共有7種工作模式,其中有5種異常模式,而在這些異常模式下又有7種異常,它們分別是Reset(復(fù)位),Undefined instructions(未定義指令),SWI(軟中斷),Prefetch Abort(指令預(yù)取失?。?,Data Abort(數(shù)據(jù)預(yù)取失敗),IRQ(外
12、部中斷),F(xiàn)IQ(快速中斷)。我們?cè)賮斫忉屢幌率裁唇挟惓O蛄?,?dāng)有異常發(fā)生時(shí),ARM處理器會(huì)自動(dòng)跳轉(zhuǎn)到對(duì)應(yīng)該異常的一個(gè)固定的地址來執(zhí)行異常處理程序,而這個(gè)固定地址就是異常向量。這個(gè)就對(duì)應(yīng)圖1后面的address兩列,第一列是我們通常情況下使用的地址,后面是高位地址,我們可以通過cp15配置,使cpu選擇高位地址還是低位地址,通常我們選用低位的。有了前面這些概念,我們現(xiàn)在再來看異常向量表就非常簡(jiǎn)單了:圖2值得注意的是,我們?cè)诰帉懢幾g器腳本時(shí)里面有一句.=ALIGN(4),這就說明我們接下來的代碼是4字節(jié)對(duì)齊的,所以我們可以看到每一行代碼跳4個(gè)字節(jié),另外由于中間確實(shí)了一部分,所以我們用一個(gè)無用的函
13、數(shù)名not_used補(bǔ)全,這樣就方便了許多。這樣就結(jié)束了,不懂的可以自己在看一遍或查資料。2.2 設(shè)置svc模式我們前面說過普通的應(yīng)用程序是在usr下運(yùn)行的,而內(nèi)核和bootloader是在svc模式下運(yùn)行,所以要運(yùn)行bootloader,我們必須先將處理器設(shè)置為svc模式。我們之前也提過模式的設(shè)置是在CPSR的0-4位,這樣我們就能找到設(shè)置的方向。參照2.1里的圖1和圖3,我們可以清楚的看到svc模式是將CPSR0-4位設(shè)置為10011。另外還有一點(diǎn)也要說明,我們制作的是相對(duì)簡(jiǎn)單的bootloader,所以irq和fiq最好也設(shè)置為不可用,之前在講CPSR時(shí),也同樣提到I位和F位的作用,在這
14、里我們就可以設(shè)置了,我們的目的是將第6,7位設(shè)為1,第0-4位設(shè)為10011,而其他位不變。編程如下:mrs r0, cpsrbic r0, r0, 0x1forr r0, r0, 0b11010011msr r0, cpsrmov pc, lr2.3 關(guān)閉看門狗首先我們先來介紹一下關(guān)門狗是什么,起到什么作用。Watchdog也就是我們所稱的看門狗,一般是一個(gè)硬件模塊,在長(zhǎng)期無人值守的地方,電子器件可能會(huì)出現(xiàn)死機(jī)的情況,這是無人干預(yù),就需要系統(tǒng)自己帶有一個(gè)自動(dòng)重啟的機(jī)制,它在硬件上實(shí)現(xiàn)了計(jì)時(shí)功能,啟動(dòng)計(jì)時(shí)后,需要用戶(軟件)來在其計(jì)時(shí)結(jié)束前重新開始計(jì)時(shí),俗稱“喂狗”,否則watchdog就會(huì)認(rèn)
15、為死機(jī)了,就會(huì)重啟系統(tǒng)。說白了,它的作用就是在死機(jī)時(shí)使系統(tǒng)自動(dòng)重啟。很多人看到這里,可能會(huì)想這看門狗好像很有用,那我們?yōu)槭裁匆P(guān)閉它?這個(gè)結(jié)論是我們之前分析U-BOOT時(shí)得到的,我們認(rèn)為bootloader很簡(jiǎn)單,一般不會(huì)死機(jī),而不關(guān)閉它反而在程序運(yùn)行時(shí)要不斷喂狗,這樣很消耗資源,所以我們就把它直接關(guān)閉了。這里我先給一張看門狗的原理圖:圖1這里的話,我就不對(duì)這個(gè)原理圖多加贅述了。我們直接看如何關(guān)閉看門狗吧。我們?cè)谶@里就得看看門狗的控制寄存器(WTCON)了,我們要關(guān)注一下第0,2位,分別是控制了看門狗超時(shí)后重啟和中斷的功能,我們都將其設(shè)置為0就行。編程如下:#define WTCON 0x7e
16、004000ldr r0, =WTCONmov r1, 0x0str r1, r0mov pc. Lr2.4 關(guān)閉中斷關(guān)閉中斷說白了就是關(guān)閉外部中斷(irq)和快速中斷(fiq),我們先給一張圖:圖1我們從左到右可以在圖中清楚的看到一個(gè)中斷源會(huì)經(jīng)過SRCPND,接下來要達(dá)到真正的中斷還需要MODE和MASK的支持,我們需要做兩件事才能真正地關(guān)閉中斷,分別是設(shè)置CPSR和設(shè)置中斷屏蔽寄存器。第一件事我們?cè)谇懊孢M(jìn)入svc模式時(shí)已經(jīng)做過,忘了的可以回頭看看,第二件就是我們現(xiàn)在將要做的。再給幾張圖(基于6410):圖2圖3圖4圖2我并沒有截全,只截了重要的部分,我們可以看到一個(gè)description是
17、Interrupt Enable Clear Register(中斷使能寄存器)的寄存器,我們把那個(gè)寄存器找到,描述看圖3,后面的備注告訴我們,這個(gè)寄存器只能用以設(shè)置中斷使能,如果要關(guān)閉中斷,需要一個(gè)叫INTENCLEAR的寄存器,我們繼續(xù)找這個(gè)寄存器,如圖4,這個(gè)就是我們要找的寄存器。我們需要把VIC0,VIC1都設(shè)置為1。這樣編程就簡(jiǎn)單了。編程如下:#define INTCLR_VIC0 0x71200014#define INTCLR_VIC1 0x71300014ldr r0, =INTCLR_VIC0mvn r1, 0x0str r1, r0ldr r0, =INTCLR_VIC1s
18、tr r1, r0mov pc, lr2.5 關(guān)閉mmu和cache 我們?cè)诰幊糖埃仨氁續(xù)mu是什么,起什么作用且為什么要關(guān)閉他。但是由于各種考慮,這些東西我覺得應(yīng)該大家自己查閱資料,我這里只做簡(jiǎn)單介紹。 我們先給出百度對(duì)mmu給出的定義。圖1說白了,mmu就是將虛擬地址處理成內(nèi)存中的物理地址,它與虛擬內(nèi)存是緊密相關(guān)的。另外cache,也就是高速緩沖存儲(chǔ)器,或許根本不需要解釋。我們這里只給ARM11核的幾張圖,大家意會(huì)一下,不懂可以去查資料。圖2圖2是計(jì)算機(jī)存儲(chǔ)體系的一張非常有名的金字塔模型,同樣適用于嵌入式系統(tǒng),它反映了不同存儲(chǔ)器與系統(tǒng)的關(guān)系緊密程度,存儲(chǔ)器容量與速度大小與級(jí)別高低。圖
19、3圖3在給出各種需要了解的重要概念的定義的同時(shí)也反映虛擬地址的作用,用它可以再繼續(xù)深入到mmu的作用,方便易記。圖4圖4反映了MMU和cache在虛擬地址轉(zhuǎn)物理地址時(shí)與cpu和主存之間的關(guān)系,上圖是ARM11之前的系統(tǒng),而下圖則是ARM11之后(包括ARM11)的系統(tǒng)。 看完這些,自己再查閱一些資料以后,相信會(huì)對(duì)一些基礎(chǔ)知識(shí)有所了解,我們?cè)趤碚f為什么要關(guān)閉mmu和cache,其實(shí)這兩件東西都是好東西,我們智慧需要的時(shí)候會(huì)在打開,但現(xiàn)在由于系統(tǒng)還未配置好,所以現(xiàn)在打開它,可能會(huì)造成內(nèi)核取址(mmu)和內(nèi)核數(shù)據(jù)往內(nèi)存的下載(cache)上的錯(cuò)誤,所以現(xiàn)在先關(guān)閉它。我們現(xiàn)在來編程吧。我們需要ARM1
20、1的核手冊(cè),因?yàn)橐渲胢mu和cache需要設(shè)置cp15。我們先給幾張圖:圖5圖6我們需要做兩件事,第一件時(shí)使D-cache里的數(shù)據(jù)失效,見圖5,已經(jīng)給出了明確的說明,我們選擇第3行。第二件就是徹底使mmu和cache關(guān)閉,見圖6,我們需要配置0位和2位,1位我們也順便配置了,其實(shí)1位配不配置都無傷大雅。編程如下:mcr p15, 0, r0, c7, c7, 0mrc p15, 0, r0, c1, c0, 0bic r0, r0, #0x00000007mcr p15, 0, r0, c1, c0, 0mov pc, lr2.6 點(diǎn)亮LED 先不說技術(shù)上的問題,我們先來談?wù)劶夹g(shù)上的問題。在
21、我們編程時(shí),我們可能會(huì)因?yàn)楦鞣N原因而犯錯(cuò),但此時(shí)由于是bootloader初期,我們并未對(duì)我們串口等硬件初始化,我們的調(diào)試手段相當(dāng)有限,而我們又不知道哪里犯了錯(cuò),所以我們必須使用一個(gè)可視化的檢查機(jī)制來告訴我們我們之前的程序是否出錯(cuò),這樣每添加一段程序,我們就可以使用此機(jī)制來驗(yàn)證,這樣效率會(huì)提高很多。然后我們來談一下技術(shù)上的事,畢竟LED大家都懂,不需要我來特地浪費(fèi)篇幅解釋。我們要做點(diǎn)亮LED需要做兩件事,不過在此之前,我們需要了解一些概念。我先給幾張圖: 圖1圖2圖3圖1是6410底板LED的原理圖,圖2是核心板cpu上有關(guān)LED的GPIO引腳圖,圖3是圖2所指區(qū)域的放大圖。我們先看圖1,可以
22、看出我們板上有4個(gè)用戶使用的LED,他們所對(duì)應(yīng)的GPIO引腳分別是NLED1,2,3,4。另外我們知道要使LED亮,我們需要在引腳上設(shè)置為輸出低電平。圖2位核心板cpu GPIO的示意圖。在講解這些之前,我們先了解一下什么叫GPIO。 GPIO(General-Perpose Input/Output Ports)也被稱為通用輸入輸出端口,在嵌入式系統(tǒng)中,cpu通常需要控制一些簡(jiǎn)單的外部設(shè)備和電路,這些設(shè)備或電路通常只有開關(guān)兩種狀態(tài),控制這些用USB或串口就顯得復(fù)雜,所以嵌入式微處理器上通常提供了“通用可編程I/O端口”,也就是GPIO。 看完這些我們?cè)賮硎崂硪幌滤悸?,要使LED亮需要使線路輸
23、出低電平,也就是要控制LED的GPIO輸出低電平,而圖3告訴我們,控制LED的GPIO分別是GPM0,1,2,3。 現(xiàn)在我們我們的思路就清楚了,然而我們還需要了解一個(gè)關(guān)于GPIO寄存器的知識(shí),GPIO一般是由至少2個(gè)寄存器控制,6410應(yīng)該是3個(gè),我不確定,第3個(gè)我們暫時(shí)不需要了解。第一個(gè)是控制寄存器,控制引腳的輸入輸出,第二個(gè)是數(shù)據(jù)寄存器,控制高低電平。了解了這些我們就可以編程了。圖4我們需要就GPM0,1,2,3都設(shè)置為輸出,再把它們?cè)O(shè)為低電平。編程如下:#define GPMCON 0x7f008820#define GPMDAT 0x7f008824ldr r0, =GPMCONldr
24、 r1, =0x1111str r1, r0ldr r0, =GPMDATmov r1, #0xfstr r1, r02.7 時(shí)鐘初始化這個(gè)章節(jié)基礎(chǔ)的知識(shí)很多,我們先解析一些概念。我們先來了解一下時(shí)鐘脈沖信號(hào),時(shí)鐘頻率和時(shí)鐘源這三個(gè)概念。時(shí)鐘脈沖信號(hào)按一定的電壓幅度,一定的時(shí)間間隔連續(xù)發(fā)出的脈沖信號(hào)。時(shí)鐘脈沖信號(hào)是時(shí)序邏輯的基礎(chǔ),它用于決定邏輯單元中的狀態(tài)何時(shí)更新。數(shù)字芯片中眾多的晶體管都工作在開關(guān)狀態(tài),它們的導(dǎo)通和關(guān)斷動(dòng)作無不是按照時(shí)鐘信號(hào)的節(jié)奏進(jìn)行的。說白了他們就是一個(gè)時(shí)鐘,告訴系統(tǒng)何時(shí)該做什么事而何時(shí)又結(jié)束。時(shí)鐘脈沖頻率就是單位時(shí)間產(chǎn)生的時(shí)鐘脈沖個(gè)數(shù)。時(shí)鐘源這個(gè)可以分成兩類,一種是晶振,
25、另一種是PLL(鎖相環(huán))。第一種晶振,全稱晶體振蕩器,是將石英進(jìn)行精密切磨然后通電產(chǎn)生,其振動(dòng)頻率與它們的材料,形狀與切割方向密切相關(guān)。是一種簡(jiǎn)單的典型的系統(tǒng)時(shí)鐘振蕩器源。PLL(鎖相環(huán))合成器是一種更加復(fù)雜的系統(tǒng)時(shí)鐘源,它需要一個(gè)外部晶體并包含一個(gè)能對(duì)特定頻率加倍或分頻的PLL(鎖相環(huán))集成電路。PLL比較晶振所需的晶體振動(dòng)頻率更低,但是他能合成符合各種需求的振動(dòng)頻率。它的成本更低,精密程度不落于晶振,是一種優(yōu)秀的系統(tǒng)時(shí)鐘源?,F(xiàn)在,我們需要了解一些關(guān)于6410開發(fā)板的時(shí)鐘體系,首先6410的晶振頻率是12MHZ,然后我們需要知道它有哪些PLL,PLL又產(chǎn)生出了哪些時(shí)鐘,這些時(shí)鐘又有些什么用。
26、圖1從這張圖上我們了解到6410有APLL,MPLL和EPLL三種PLL,而這三種PLL又分別產(chǎn)生ARMCLK,HCLK,PCLK和SCLK。這四種時(shí)鐘有什么用呢?我們來看看。圖2圖3圖2大家了解一下就行,圖3使我們各種時(shí)鐘的作用。圖4我們可以從圖中看出,我們?cè)诔跏蓟瘯r(shí)鐘時(shí)配置完后會(huì)出現(xiàn)Lock time,而在這之中SYSCLK的時(shí)鐘頻率會(huì)歸零,之后會(huì)按照分頻的頻率運(yùn)行,SYSCLK也就是我們這里的ACLK,畢竟系統(tǒng)時(shí)鐘,會(huì)和內(nèi)核聯(lián)系在一起。現(xiàn)在我們來看看初始化時(shí)鐘需要哪些步驟。第一步是設(shè)置Lock Time第二步是設(shè)置分頻系數(shù)。第三步是設(shè)置cpu到異步工作模式。最后是設(shè)置PCLK和MCLK(
27、見圖5) 有人可能會(huì)對(duì)上面的步驟抱有異議,那我們現(xiàn)在來看看為什么要這樣設(shè)置。第一步設(shè)置Lock Time,大家應(yīng)該是不會(huì)說什么的,但是我們這里不設(shè)置,我們保持它的默認(rèn)值不動(dòng)。第二步,我們之前說過PLL可以通過分頻來滿足一個(gè)系統(tǒng)中不同時(shí)鐘體系的需求,很顯然我們要用它,所以我們需要設(shè)置分頻系數(shù)。第三步,當(dāng)ARMCLK(核的時(shí)鐘)和HCLK(系統(tǒng)總線時(shí)鐘)分頻系數(shù)不同時(shí),需要設(shè)置為異步模式。第四步,分完頻,至少我們需要設(shè)置其中某個(gè)量為基準(zhǔn)值。而圖5也告訴我們APLL和MPLL似乎是基準(zhǔn)值。這樣似乎就合理了,下面我們來編程吧。圖5圖6圖7圖8圖9圖10這里我已經(jīng)給出了所有信息,但是這里我不講(其實(shí)是偷
28、懶),我希望大家能根據(jù)我的編程來理清自己的思路,另外大家要注意的是圖5中很多選擇器,它所需的寄存器(CLK_SRC,OTHERS等)甚至已在圖中列出,大家也需要去設(shè)置。就這樣,我們直接來編程。編程如下:#define CLK_DIV0 0x7e00f020#define OTHERS 0x7e00f900#define MPLL_CON 0x7e00f010#define APLL_CON 0x7e00f00c#define CLK_SRC 0x7e00f01c#define DIV_VAL (0x0<<0)|(0x1<<9)|(0x1<<8)|(0x3&l
29、t;<12)#define PLL_VAL (1<<31)|(266<<16)|(3<<8)|(1<<0)ldr r0, =CLK_DIV0ldr r1, =DIV_VALstr r1, r0ldr r0, =OTHERSldr r1, r0bic r1,r1,#0xc0str r1, r0ldr r0, =APLL_CONldr r1, =PLL_VALstr r1, r0ldr r0, =MPLL_CONldr r1, =PLL_VALstr r1, r0ldr r0, =CLK_SRCmov r1, #0x3str r1, r0mov
30、 pc,lr2.8 內(nèi)存初始化 既然講到內(nèi)存初始化,那就必須先講與內(nèi)存相關(guān)的一些知識(shí)。 我們先來談?wù)剝?nèi)存的分類,內(nèi)存一般分為SRAM和DRAM,SRAM即靜態(tài)隨機(jī)存儲(chǔ)器,它是具有靜止存取功能的內(nèi)存,它不需要定期刷新就可保存內(nèi)部數(shù)據(jù),因此存取速度較快,但是成本較高,一般用在存儲(chǔ)容量要求不高,但速度要求很快的場(chǎng)合,比如stepping stone。 而DRAM(動(dòng)態(tài)隨機(jī)存儲(chǔ)器)是由許許多多個(gè)小電容組成,電容可以在兩個(gè)極板上保存電荷,它不具備靜止存取數(shù)據(jù)的功能,它需要不停地刷新(充能),才能保存數(shù)據(jù),因此它的速度較慢。DRAM有幾種需要分成幾類講:1.SDRAM 2.DDR 3.DDR2圖1圖2圖1
31、和圖2講的很好,這里需要補(bǔ)充一下,SDRAM和DDR的傳輸速度理論是1:2的關(guān)系,是因?yàn)樵谝粋€(gè)時(shí)鐘周期內(nèi)SDRAM只能傳輸或接收一次數(shù)據(jù),而DDR則2次。這里就引出了時(shí)鐘周期,可以聯(lián)想到我們之前所說的時(shí)鐘脈沖信號(hào),這個(gè)和那個(gè)有些關(guān)系,大家可以去引申一下,時(shí)鐘周期是一個(gè)時(shí)鐘的量,它反映了SDRAM所能運(yùn)行的最高速率,更小的周期代表更高的運(yùn)行速率。大家有興趣可以去查閱一下資料。 現(xiàn)在我們?cè)僬f一下內(nèi)存的內(nèi)部結(jié)構(gòu)。 實(shí)際上我們可以把內(nèi)存的內(nèi)部當(dāng)成一個(gè)表結(jié)構(gòu),如圖3,當(dāng)我們存取數(shù)據(jù)時(shí)我們先指定行地址,再指定列地址,這樣我們就能準(zhǔn)確地找到我們所需的數(shù)據(jù)。而這張表我們稱為L(zhǎng)ogical Bank(L-Ban
32、k)。圖3然而由于技術(shù)等各種原因,我們的一塊內(nèi)存不可能只用一個(gè)L-Bank,我們一般把它分成4個(gè)L-Bank,這樣我們的尋址信息就變成先指定L-Bank,再指定行地址,最后確定列地址,而我們內(nèi)存大小就等于4*行*列*一個(gè)單元格所能容納的數(shù)據(jù)大小?,F(xiàn)在就該講到編程了,我們決定先從2440講起,這樣在原理上深入會(huì)比較簡(jiǎn)單。圖4 從圖4我們可以看出2440的芯片一共27根地址線,27根地址線對(duì)應(yīng)了128M的內(nèi)存,然而我們說內(nèi)存不可能只有128M,那生產(chǎn)廠商用了什么方法使它的外設(shè)空間變?yōu)?G呢?在這里我們需要引出片選信號(hào)這種說法。 片選信號(hào),也就是說不止這一塊內(nèi)存芯片,片選信號(hào)可以指定從不同的芯片中存
33、取數(shù)據(jù)??磮D5圖5其實(shí)細(xì)心一點(diǎn)可以在圖4中觀察到8個(gè)片選信號(hào)nGCS0-7,現(xiàn)在我們來看一張更加早期的圖:大家都應(yīng)該知道2440的內(nèi)存是從0x30000000開始的,為什么他要從這地方開始,現(xiàn)在我們應(yīng)該有答案,內(nèi)存是處于bank6和bank7的,bank6的起始地址就是0x30000000。 我們轉(zhuǎn)而看6410的內(nèi)存地址0x50000000,這個(gè)比2440要大,為什么呢?我們來看看6410的地址分布。圖6保留區(qū)我們就不說了,外設(shè)區(qū)說白了就是我們之前那些寄存器的放置空間,而主存儲(chǔ)區(qū)似乎我們應(yīng)該更深入的去看一下。圖7這樣,我們就能明白為什么6410內(nèi)存是從0x50000000開始了,因?yàn)閮?nèi)存是在D
34、ynamic memory里的。另外還有一點(diǎn)要提:圖8我們?cè)谥翱梢钥吹?440cpu有32根地址線,而內(nèi)存的兩塊芯片每塊只有16根地址線,這要怎么連呢,很簡(jiǎn)單,就是16+16=32的問題,存取數(shù)據(jù)時(shí),兩塊芯片個(gè)存取一半數(shù)據(jù)。6410在這方面也是同樣的原理。 最后我們還需要了解一個(gè)非常重要的東西-存儲(chǔ)控制器,當(dāng)我們?cè)L問某一塊內(nèi)存空間時(shí),我們往往就是輸入地址,我們并沒有用到之前學(xué)的尋址方式,先L-Bank啊,行列地址之類的,這完全歸因于存儲(chǔ)控制器,當(dāng)cpu拿到我們的地址時(shí),他并不知道該去哪找數(shù)據(jù),這是存儲(chǔ)控制器就會(huì)進(jìn)行轉(zhuǎn)化,使cpu能找到數(shù)據(jù)。如圖9:圖9所以,我們要控制內(nèi)存,要初始化內(nèi)存,實(shí)際
35、上就是要對(duì)我們的存儲(chǔ)控制器進(jìn)行初始化,2440只要初始化存儲(chǔ)控制器就可以了,但6410還須對(duì)我們的DDR進(jìn)行初始化。不過也很簡(jiǎn)單,它已經(jīng)把所有的步驟列出來了,我們只要照做就行。圖10照著步驟一步步做就行,有些東西參照一下U-BOOT,具體的寄存器大家請(qǐng)參照6410的芯片手冊(cè),這里由于篇幅原因我就不列了。另外由于此程序篇幅很長(zhǎng),所以我們另起一個(gè)匯編文件,用.global定義一下全局符號(hào)。編程如下:.text.global mem_initmem_init: ldr r0, =0x7e00f120 mov r1, #0x8 str r1, r0 ldr r0, =0x7e001004 mov r1
36、, #0x4 str r1, r0 ldr r0, =0x7e001010 ldr r1, =( ( 7800 / ( 1000000000/133000000 ) + 1 ) ) str r1, r0 ldr r0, =0x7e001014 mov r1, #(3 << 1) str r1, r0 ldr r0, =0x7e001018 mov r1, #0x1 str r1, r0 ldr r0, =0x7e00101c mov r1, #0x2 str r1, r0 ldr r0, =0x7e001020 ldr r1, =( ( 45 / ( 1000000000 / 13
37、3000000 ) + 1 ) ) str r1, r0 ldr r0, =0x7e001024 ldr r1, =( ( 68 / ( 1000000000 / 133000000 ) + 1 ) ) str r1, r0 ldr r0, =0x7e001028 ldr r1, =( ( 23 / ( 1000000000 / 133000000 ) + 1 ) ) str r1, r0 ldr r0, =0x7e00102c ldr r1, =( ( 80 / ( 1000000000 / 133000000 ) + 1 ) ) str r1, r0 ldr r0, =0x7e001030
38、 ldr r1, =( ( 23 / ( 1000000000 / 133000000 ) + 1 ) ) str r1, r0 ldr r0, =0x7e001034 ldr r1, =( ( 15 / ( 1000000000 / 133000000 ) + 1 ) ) str r1, r0 ldr r0, =0x7e001038 ldr r1, =( ( 15 / ( 1000000000 / 133000000 ) + 1 ) ) ldr r2, r0 str r1, r0 ldr r0, =0x7e00103c mov r1, #0x07 str r1, r0 ldr r0, =0x
39、7e001040 mov r1, #0x02 str r1, r0 ldr r0, =0x7e001044 ldr r1, =( ( 120 / ( 1000000000 / 133000000 ) + 1 ) ) str r1, r0 ldr r0, =0x7e001048 ldr r1, =( ( 120 / ( 1000000000 / 133000000 ) + 1 ) ) str r1, r0 ldr r0, =0x7e00100c ldr r1, =0x00010012 str r1, r0 ldr r0, =0x7e00104c ldr r1, =0x0b45 str r1, r
40、0 ldr r0, =0x7e001200 ldr r1, =0x150f8 str r1, r0 ldr r0, =0x7e001304 mov r1, #0x0 str r1, r0 ldr r0, =0x7e001008 ldr r1, =0x000c0000 str r1, r0 ldr r1, =0x00000000 str r1, r0 ldr r1, =0x00040000 str r1, r0 ldr r1, =0x000a0000 str r1, r0 ldr r1, =0x00080032 str r1, r0 ldr r0, =0x7e001004 mov r1, #0x
41、0 str r1, r0check_dmc1_ready: ldr r0, =0x7e001000 ldr r1, r0 mov r2, #0x3 and r1, r1, r2 cmp r1, #0x1 bne check_dmc1_ready nop mov pc, lr最后我們還得了解一點(diǎn),第一段匯編中的寄存器0x7e00f120,那個(gè)是什么寄存器呢?我們?cè)谛酒謨?cè)搜一下看看。圖11圖12圖11和圖12我們可以看到這個(gè)寄存器各位的描述都不短,但我們現(xiàn)在只研究其中的第七位,我們應(yīng)該設(shè)成0還是1。描述中Xm1是什么?其實(shí)他對(duì)應(yīng)的是6410的Dynamic memory的數(shù)據(jù)線,也就是我們的DR
42、AM的數(shù)據(jù)線,我們選0,是將他設(shè)為數(shù)據(jù)傳輸,選1是將他用于SROMC,明顯應(yīng)該選0。最后再附上6410的兩塊內(nèi)存的圖,以免有人看不清楚。圖132.9 代碼搬移(基于6410)事先說明一下,因?yàn)槲覀冞€沒接觸到nand flash,所以我們現(xiàn)在編寫的代碼只是先熱個(gè)身,日后等我們了解到了nand flash,會(huì)在回頭看這段代碼。在前面講到bootloader的工作原理時(shí),我們提到了代碼的搬移,即當(dāng)上電后,bootloader的前幾K(6410為8K,2440為4K)會(huì)被放入墊腳石中運(yùn)行,這個(gè)我們不去管它,他是自動(dòng)的,但是接下來整段代碼從nand flash搬移到內(nèi)存中,這個(gè)我們就需要進(jìn)行干預(yù)了,我們
43、需要通過代碼來完成它。但有一點(diǎn)我們要注意,我們現(xiàn)在還沒學(xué)到nand flash,而且我們現(xiàn)在的bootloader還遠(yuǎn)未達(dá)到4k或8k,所以我們現(xiàn)在不從nand flash搬移,而從我們的墊腳石中搬移代碼。等日后學(xué)習(xí)了nand flash,我們?cè)倩仡^改這段代碼。要搬移代碼,我們需要注意3點(diǎn):1. 搬移起點(diǎn)2. 搬移終點(diǎn)3. 搬移方式先說搬移起點(diǎn),既然我們是從墊腳石搬移的,那我們就看墊腳石的起始地址。圖1從圖1中,我們可以看出墊腳石的起始地址是0x0c000000,這樣我們第一個(gè)問題就解決了。第二個(gè)問題是搬移終點(diǎn)的問題,這個(gè)其實(shí)不是問題,我們之前編寫過了編譯器腳本文件里就有答案,我們?cè)谄渲性O(shè)置過程需的起始地址,也就是鏈接地址-. = 0x500
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年五年級(jí)班級(jí)管理工作總結(jié)(3篇)
- 2025年代理權(quán)轉(zhuǎn)讓協(xié)議范文(2篇)
- 2025年五年級(jí)下學(xué)期語(yǔ)文教師工作總結(jié)模版(三篇)
- 2025年鄉(xiāng)村中學(xué)教師七年級(jí)語(yǔ)文教學(xué)工作總結(jié)(3篇)
- 2025年個(gè)人擔(dān)保貸款合同參考樣本(2篇)
- 互聯(lián)網(wǎng)企業(yè)調(diào)研居間合同
- 教育實(shí)驗(yàn)室裝修項(xiàng)目協(xié)議
- 疫情封閉小區(qū)大門施工方案
- 健身房裝修合同范本版
- 咖啡館裝飾設(shè)計(jì)合同
- 《數(shù)學(xué)課程標(biāo)準(zhǔn)》義務(wù)教育2022年修訂版(原版)
- 各種標(biāo)本采集的技術(shù)-痰標(biāo)本的采集(護(hù)理技術(shù))
- 2024年湖南中考道德與法治試卷真題答案解析(精校打?。?/a>
- 實(shí)驗(yàn)室的設(shè)計(jì)規(guī)劃
- 注冊(cè)安全工程師《安全生產(chǎn)管理知識(shí)》科目知識(shí)要點(diǎn)
- 《新時(shí)代公民道德建設(shè)實(shí)施綱要》、《新時(shí)代愛國(guó)主義教育實(shí)施綱要》知識(shí)競(jìng)賽試題庫(kù)55題(含答案)
- 2024-2030年中國(guó)假睫毛行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略分析報(bào)告
- 2019-2020學(xué)年七年級(jí)(上)期末數(shù)學(xué)試卷2附解析
- 電話接聽技巧與服務(wù)質(zhì)量提升方案三篇
- 德國(guó)職業(yè)學(xué)校教育質(zhì)量保障體系研究
- 2023-2024學(xué)年北師大版數(shù)學(xué)八年級(jí)上冊(cè) 期末測(cè)試卷
評(píng)論
0/150
提交評(píng)論