實(shí)驗(yàn)一ARM匯編程序的編寫(xiě)以及啟動(dòng)代碼的分析_第1頁(yè)
實(shí)驗(yàn)一ARM匯編程序的編寫(xiě)以及啟動(dòng)代碼的分析_第2頁(yè)
實(shí)驗(yàn)一ARM匯編程序的編寫(xiě)以及啟動(dòng)代碼的分析_第3頁(yè)
實(shí)驗(yàn)一ARM匯編程序的編寫(xiě)以及啟動(dòng)代碼的分析_第4頁(yè)
實(shí)驗(yàn)一ARM匯編程序的編寫(xiě)以及啟動(dòng)代碼的分析_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、實(shí)驗(yàn) ARM 匯編程序的編寫(xiě)以及啟動(dòng)代碼的分析一、實(shí)驗(yàn)?zāi)康模壕毩?xí)ARM 匯編程序的編寫(xiě),對(duì)提供的程序的啟動(dòng)代碼進(jìn)行分析,了解S3C2410初始化過(guò)程, 初始化代碼主要是包含在start.s 中。二、實(shí)驗(yàn)原理:啟動(dòng)程序要完成的任務(wù)包括:硬件初始化,系統(tǒng)存儲(chǔ)系統(tǒng)的配置,復(fù)制二級(jí)中斷向量表。啟動(dòng)程序過(guò)程 系統(tǒng)硬件初始化系統(tǒng)上電或復(fù)位后,程序從位于地址0x0的Reset Exception Vector 處開(kāi)始執(zhí)行,因此需要在這里放置Bootloader 的第一條指令:b ResetHandler,跳轉(zhuǎn)到標(biāo)號(hào)為ResetHandler 處進(jìn)行第一階段的硬件初始化,執(zhí)行完,系統(tǒng)進(jìn)行堆棧和存儲(chǔ)器的初始化。

2、使用了外設(shè),則需要設(shè)置相關(guān)的寄存器,確定其刷新頻率、總線寬度等信息。 代碼段復(fù)制到RAM 中運(yùn)行需要把系統(tǒng)的代碼復(fù)制到RAM 中運(yùn)行。映像文件內(nèi)部共有三種輸出段:RO 段、RW 段和ZI 段。ARMLink 同時(shí)還產(chǎn)生了這三種輸出段的起始和終止定位信息:Image$RO$Base、Image$RO$Limit、Image$RW$Base、Image$RW$Limit、Image$ZI$Base和Image$ZI$Limit??梢栽诔绦蛑惺褂眠@些定位信息。將ROM 中的代碼和數(shù)據(jù)搬移到RAM 中。 建立二級(jí)中斷向量表在ARM 系統(tǒng)中,中斷向量表位于0X0開(kāi)始的地址處,意味著無(wú)論運(yùn)行什么樣的上層軟

3、件,一旦發(fā)生中斷,程序就得到Flash 存儲(chǔ)器中的中斷向量表里去,降低系統(tǒng)的運(yùn)行效率。因此在RAM 中建立自己的二級(jí)中斷向量表,當(dāng)中斷發(fā)生后,程序直接從RAM 中取中斷向量進(jìn)入中斷子程序。尤其是在中斷頻繁發(fā)生的系統(tǒng)里,這種方法可以大大提高系統(tǒng)的運(yùn)行效率。三、實(shí)驗(yàn)內(nèi)容:1運(yùn)行一個(gè)簡(jiǎn)單的串口程序,單步執(zhí)行初始化代碼, 觀察寄存器變化。2分析系統(tǒng)上電后的初始化工作包括哪些內(nèi)容。3分析中斷的處理過(guò)程,包括中斷向量表的建立、中斷源的識(shí)別及中斷IRQ 服務(wù)程序是如何進(jìn)入的。4分析應(yīng)用程序的結(jié)構(gòu)。四、實(shí)驗(yàn)代碼:在系統(tǒng)上電后,初始化部分的工作注意包含以下部分:1、 關(guān)看門(mén)狗定時(shí)器2、 屏蔽所有中斷3、 設(shè)置C

4、PU 時(shí)鐘頻率。4、 設(shè)置存儲(chǔ)器控制寄存器,對(duì)外部存儲(chǔ)器的參數(shù)進(jìn)行設(shè)置。5、 初始化各模式下的堆棧6、 建立IRQ 中斷的總的入口地址7、 初始化應(yīng)用程序的執(zhí)行環(huán)境8、 跳入Main 函數(shù),進(jìn)入C 程序;=; NAME: 2410INIT.S; DESC: C start up codes; Configure memory, ISR ,stacks; Initialize C-variables; HISTORY:;=GET option.s ;GET 相當(dāng)INCLUDE 將一個(gè)源文件包含到當(dāng)前源文件,這里表示包含option.s ,并在當(dāng)前位置進(jìn)行匯編GET memcfg.sGET 241

5、0addr.sBIT_SELFREFRESH EQU (1<<22 ; 定義了一些符號(hào)常量;ARM 異常模式的定義;SDRAM/DRAM 刷新控制器 bit22 REFMD位 0:CBR/AUTO REFRESH 1:SHIF REFRESH ; 下面是對(duì)arm 處理器模式寄存器對(duì)應(yīng)值的常數(shù)定義,arm 處理器中有一個(gè)CPSR 程序狀 ; 態(tài)寄存器,CPSR 后五位決定目前的處理器模式。;Pre-defined constantsUSERMODEEQU 0x10 ; 用戶模式 FIQMODEEQU 0x11 ;FIQ 快速中斷模式 IRQMODEEQU 0x12 ; 中斷模式 SV

6、CMODE EQU 0x13 ; 管理模式ABORTMODE EQU0x17 ; 中止模式 UNDEFMODE EQU0x1b ; 未定義指令模式 MODEMASK EQU0x1f ; 系統(tǒng)模式 NOINTEQU 0xc0 ; 禁止IRQ 和FIQ 中斷;ARM 各異常模式堆棧,定義各模式堆棧地址;_STACK_BASEADDRESS在option.s 中,;The location of stacks_STACK_BASEADDRESS EQU (SDRAM_END-0x8000;0x33ff8000 UserStackEQU (_STACK_BASEADDRESS-0x3800 ;0x33

7、ff4800 ; 用戶模式堆棧SVCStack EQU (_STACK_BASEADDRESS-0x2800;0x33ff5800 0x3ff47ff ; 管理模式堆棧 4kUndefStack EQU (_STACK_BASEADDRESS-0x2400 ;0x33ff5c00 0x3ff57ff ; 未定義指令模式堆棧 1kAbortStack EQU (_STACK_BASEADDRESS-0x2000 ;0x33ff6000 0x3ff5bff ; 中止模式堆棧 1kIRQStack EQU (_STACK_BASEADDRESS-0x1000;0x33ff7000 0x3ff5fff

8、 ; 中斷模式堆棧 4kFIQStack EQU (_STACK_BASEADDRESS-0x0;0x33ff8000 0x33ff6fff ; 快速中斷模式堆棧 4k ;arm 處理器有兩種工作狀態(tài);1.arm:32位 這種工作狀態(tài)下執(zhí)行字對(duì)齊的arm 指令;2.Thumb:16位 這種工作狀; 態(tài)執(zhí)行半字對(duì)齊的Thumb 指令; 因?yàn)樘幚砥鞣譃?6位 32位兩種工作狀態(tài) 程序的編譯器也是分16位和32兩種編譯方式 ; 所以下面的程序用于根據(jù)處理器工作狀態(tài)確定編譯器編譯方式;code16偽指令指示匯編編譯器,后面的指令為16位的thumb 指令;code32偽指令指示匯編編譯器,后面的指令為

9、32位的arm 指令; 這段是為了統(tǒng)一目前的處理器工作狀態(tài)和軟件編譯方式(16位編譯環(huán)境使用tasm.exe 編譯) ;Check if tasm.exe(armasm -16 .ADS 1.0 is used. 檢查是否是用tasm.exe 進(jìn)行16位編譯 GBLL THUMBCODE ; 聲明一個(gè)全局變量 并初始化為FALSE CONFIG = 16 ;if config=16這里表示用16位編譯方式THUMBCODE SETL TRUE ;SETL 給全局變量賦值,設(shè)置THUMBCODE 為 trueCODE32 ;CODE32表明一下操作都在ARM 狀態(tài),轉(zhuǎn)入32位編譯模式| ; |=

10、ELSE | 等同 ELSETHUMBCODE SETL FALSE ; 設(shè)置THUMBCODE 為 false ,THUMBCODE=FALSE;endif 等同 ENDIF ; 宏定義MOV_PC_LRMACRO ;MACRO 定義宏,宏定義開(kāi)始 MOV_PC_LR ; 宏將被下面定義部分展開(kāi),宏名 MOV_PC_LR THUMBCODE ;if THUMBCODE=truebx lr ;THUMBCODE 模式上返回ARM 狀態(tài)|;else mov pc,lr ;ARM 狀態(tài)下返回 ;end ifMEND ; 宏結(jié)束MACRO ; 宏定義開(kāi)始 MOVEQ_PC_LR; 宏名為MOVEQ_

11、PC_LR,與上面部分相同 THUMBCODE ;if THUMBCODE=truebxeq lr ;EQ 相等 則跳轉(zhuǎn)回ARM 狀態(tài)|;else moveq pc,lr; 同上位置相同部分,不同的是如果相等才跳回ARM 狀態(tài) ;end ifMEND; 宏結(jié)束 ; 宏定義進(jìn)入異常流程;HANDLER 宏的名稱;$HandleLabel宏的參數(shù) ; 這個(gè)宏的作用是把各個(gè)中斷程序的地址裝入當(dāng)前的PC ,2410有兩種裝斷模式:一種是沒(méi)有; 中斷向量表,一種是使用中斷向量表的; 使用中斷向量表只能是IRQ 方式,當(dāng)使用中斷向量表的時(shí)候,中斷發(fā)生時(shí)由2410的中斷控 ; 制器自動(dòng)跳轉(zhuǎn)到; 相應(yīng)的位置。

12、; 注意下面這段宏定義程序; 下面包含的HandlerXXX HANDLER HandleXXX 將都被下面這段程序展開(kāi); 本初始化程序定義了一個(gè)數(shù)據(jù)區(qū)(在文件最后),34個(gè)字空間,存放相應(yīng)中斷服務(wù)程序的首 ; 地址。每個(gè)字,即4字節(jié); 空間都有一個(gè)標(biāo)號(hào),以Handle*命名。; 在向量中斷模式下使用“加載程序”來(lái)執(zhí)行中斷服務(wù)程序。; 向量中斷模式和非向量中斷模式的區(qū)別是: 向量中斷模式是當(dāng)cpu 讀取位于0x18處的IR ;Q 中斷指令的時(shí)候,系統(tǒng)自動(dòng)讀取對(duì)應(yīng)于該中斷源確定地址上的指令取代0x18處的指令, ; 通過(guò)跳轉(zhuǎn)指令系統(tǒng)就直接跳轉(zhuǎn)到對(duì)應(yīng)地址; 函數(shù)中 節(jié)省了中斷處理時(shí)間提高了中斷處理

13、速度標(biāo) 例如 ADC 中斷的向量地址為0xC0, ; 在0xC0處放如下代碼:;ldr PC,=HandlerADC 當(dāng)ADC 中斷產(chǎn)生的時(shí)候系統(tǒng)會(huì)自動(dòng)跳轉(zhuǎn)到HandlerADC 函數(shù)中; 非向量中斷模式處理方式是一種傳統(tǒng)的中斷處理方法,當(dāng)系統(tǒng)產(chǎn)生中斷的時(shí)候,系統(tǒng)將int ;errupt pending 寄存器中對(duì)應(yīng)標(biāo)志位置位; 然后跳轉(zhuǎn)到位于0x18處的統(tǒng)一中斷; 函數(shù)中; 該函數(shù)通過(guò)讀取interrupt pending 寄存器中對(duì)應(yīng)標(biāo)志位來(lái)判斷中斷源,并根據(jù)優(yōu)先級(jí)關(guān)系 ; 再跳到; 對(duì)應(yīng)中斷源的處理代碼中; 大致作用是把宏的第一個(gè)參數(shù)$HandlerLabel轉(zhuǎn)變?yōu)橐粋€(gè)標(biāo)號(hào),然后讓程序跳

14、轉(zhuǎn)到第二個(gè)參 ; 數(shù)$HandleLabel(為一個(gè)地址 對(duì)應(yīng)的值的地址去。; 所以,通過(guò)上面的分析可以看出,$HandlerLabel HANDLER $HandleLabel是讓PC 跳轉(zhuǎn)到$H ;andleLabel 中存放的地址執(zhí)行。MACRO ; 宏定義$HandlerLabel HANDLER $HandleLabel ; 宏名字叫HANDLER,$HandleLabel是 ; 行參,定義了一個(gè)標(biāo)號(hào)$HandlerLabel,展開(kāi)時(shí)可替換成相應(yīng)的符號(hào)$HandlerLabelsub sp,sp,#4 ;sp-sp-4, 空出的空間用于存放跳轉(zhuǎn)地址stmfd sp!,r0 ;sp=s

15、p-4,并將r0入棧ldr r0,=$HandleLabel ; 獲取存放跳轉(zhuǎn)地址的標(biāo)號(hào)HandleLabel 到r0ldr r0,r0 ; 將HandleLabel 中存放的跳轉(zhuǎn)地址送給r0 str r0,sp,#4 ; 將r0存放到sp+4的地方,ldmfd sp!,r0,pc ; 彈出棧頂2個(gè)字,分別保存到r0和pc 中,系統(tǒng)將跳; 轉(zhuǎn)到對(duì)應(yīng)中斷處理函數(shù),由上r0和pc 都沒(méi)變,但程序已跳轉(zhuǎn)MEND ; 宏定義結(jié)束; 連接器生成的輸出段相關(guān)的符號(hào); 引入連接器生成的映象文件的各個(gè)部分地址。;OR 只讀區(qū)域、RW 讀寫(xiě)區(qū)域、ZI 初始化為0的區(qū)域。IMPORT |Image$RO$Limi

16、t| ; End of ROM code (=start of ROM data ,RO 結(jié)束 ; 地址+1IMPORT |Image$RW$Base| ; Base of RAM to initialise,RW 起始IMPORT |Image$ZI$Base| ; Base and limit of area,RW 段結(jié)束+1IMPORT |Image$ZI$Limit| ; to zero initialise,ZI 段起始地址; 引入外部函數(shù)Main ,進(jìn)入C 程序。IMPORT Main ; The main entry of mon program;IMPORT LEDTEST;

17、定義ARM 匯編程序段,段名為SelfBoot ,程序段為只讀的代碼段。AREA SelfBoot,CODE,READONLY ;Selfboot 初始化程序; 板子上電和復(fù)位后程序開(kāi)始從位于0x0處開(kāi)始執(zhí)行,硬件剛剛上電復(fù)位后程序從這里開(kāi)始 ; 執(zhí)行跳轉(zhuǎn)到標(biāo)為ResetHandler 處執(zhí)行;DCD 用于分配一段字內(nèi)存單片,并用后面的偽指令初始化,分配字節(jié)由expr 個(gè)數(shù)決定 ; 程序入口地址ENTRYResetEntry;1The code, which converts to Big-endian, should be in little endian code. ;2The follo

18、wing little endian code will be compiled in Big-Endian mode. The code byte order should be changed as the memory bus width.;3The pseudo instruction,DCD can't be used here because the linker generates error.ASSERT :DEF:ENDIAN_CHANGE ;ASSERT 斷言錯(cuò)誤偽指令,這里表示是否定義過(guò)ENDIAN_CHANGE ENDIAN_CHANGE ; 如果定義了ENDI

19、AN_CHANGEASSERT :DEF:ENTRY_BUS_WIDTH ; 這里表示是否定義過(guò)ENTRY_BUS_WIDTH ENTRY_BUS_WIDTH=32 ;if ENTRY_BUS_WIDTH=32 b ChangeBigEndian ;DCD 0xea000007,跳轉(zhuǎn)到ChangeBigEndian , ; 執(zhí)行DCD 0xea000007 改變大小端數(shù)據(jù)模式 ;end if ENTRY_BUS_WIDTH=16 ;if ENTRY_BUS_WIDTH=16 andeq r14,r7,r0,lsl #20 ; DCD 0x0007ea00,標(biāo)志狀態(tài)寄存器CPSR 的Z ;=1時(shí)

20、,r14=r7+r0邏輯左移20位,執(zhí)行DCD 0x0007ea00改變大小端模式 ;end if ENTRY_BUS_WIDTH=8 ;if ENTRY_BUS_WIDTH=8 streq r0,r0,-r10,ror #1 ; DCD 0x070000e,當(dāng)標(biāo)志狀態(tài)寄存器CPSR 的Z ;=1時(shí),執(zhí)行DCD 0x070000ea 改變大小端模式;end if| ;ELSE 即如果沒(méi)定義 ENDIAN_CHANGE bResetHandler ; 復(fù)位處理模式b HandlerUndef ;handler for Undefined mode 處理為定義模式b HandlerSWI ;han

21、dler for SWI interrupt 處理軟中斷模式b HandlerPabort ;handler for PAbort 處理終止程序訪問(wèn)終止模式b HandlerDabort ;handler for DAbort 處理數(shù)據(jù)訪問(wèn)終止模式 b . ;reserved保留,"." 代表指令的地址 ,即表示進(jìn)行死循環(huán)b HandlerIRQ ;handler for IRQ interrupt 處理中斷模式b HandlerFIQ ;handler for FIQ interrupt 處理快速中斷模式;0x20"" 存儲(chǔ)區(qū)位置計(jì)數(shù)器的當(dāng)前值 b E

22、nterPWDN; 進(jìn)入掉電模式,見(jiàn)下面的標(biāo)號(hào)ChangeBigEndian ; 上面提到的ChangeBigEndian, 改變大小端數(shù)據(jù)模式;0x24 ENTRY_BUS_WIDTH=32 ;if ENTRY_BUS_WIDTH=32DCD 0xee110f10 ;0xee110f10 => mrc p15,0,r0,c1,c0,0DCD 0xe3800080 ;0xe3800080 => orr r0,r0,#0x80; /Big-endianDCD 0xee010f10 ;0xee010f10 => mcr p15,0,r0,c1,c0,0 ENTRY_BUS_WID

23、TH=16 ;if ENTRY_BUS_WIDTH=16DCD 0x0f10ee11DCD 0x0080e380DCD 0x0f10ee01 ENTRY_BUS_WIDTH=8 ;if ENTRY_BUS_WIDTH=8DCD 0x100f11eeDCD 0x800080e3 DCD 0x100f01eeDCD 0xffffffff;swinv 0xffffff is similar with NOP and run well in both endian mode.DCD 0xffffffffDCD 0xffffffffDCD 0xffffffffDCD 0xffffffffb ResetH

24、andler; 復(fù)位處理程式;Function for entering power down mode; 1. SDRAM should be in self-refresh mode.; 2. All interrupt should be maksked for SDRAM/DRAM self-refresh.; 3. LCD controller should be disabled for SDRAM/DRAM self-refresh.; 4. The I-cache may have to be turned on.; 5. The location of the followi

25、ng code may have not to be changed. ; 進(jìn)入掉電模式功能; 1. SDRAM 必須在自刷新模式.; 2. 所有中斷必須屏蔽 for SDRAM/DRAM self-refresh.; 3. LCD 關(guān)閉for SDRAM/DRAM self-refresh.; 4. The I-cache 可能需要開(kāi)啟.; 5. The location of the following code may have not to be changed.;void EnterPWDN(int CLKCON; ; 進(jìn)入掉電模式EnterPWDNmov r2,r0;r2=rCLK

26、CON CLKCON3掉電模式控制位 0:關(guān)閉 1:進(jìn)入掉電模式 tst r0,#0x8 ; POWER_OFF mode?判斷POWER_OFF 是否為0 。r0和 #0X8相與,更新CPSR 位bne ENTER_POWER_OFF ;NE 不相等(則表示power_off不為O 標(biāo)志位Z=0ENTER_STOP ; 不進(jìn)入掉電模式ldr r0,=REFRESH ;0x48000024 ;DRAM/SDRAM refresh DRAM/SDRAM 刷新控制器,刷新DRAM/SDRAMldr r3,r0 ;r3=rREFRESHmov r1, r3 ;r1=r3 orr r1, r1, #B

27、IT_SELFREFRESH ;BIT_SELFREFRESH EQU (1<<22 bit22 TREFMD位 0:CBR/AUTO REFRESH 1:SHIF REFRESHstr r1, r0 ;R1->R0 Enable SDRAM self-refresh; B 是向后搜索局部標(biāo)號(hào), %F是向前搜索局部標(biāo)號(hào)。mov r1,#16 ; 延時(shí) wait until self-refresh is issued. may not be needed.subs r1,r1,#1 ;0為局部標(biāo)號(hào)(延時(shí)) bne %B0ldr r0,=CLKCON;enter STOP mo

28、de. CLKCON ;Clock generator controlstr r2,r0mov r1,#32 0subs r1,r1,#1 ;1 延時(shí) wait until the STOP mode is in effect. bne %B0 ;2 Or wait here until the CPU&Peripherals will be turned-off ; Entering POWER_OFF mode, only the reset by wake-up is available.ldr r0,=REFRESH ;exit from SDRAM self refresh

29、mode.str r3,r0MOV_PC_LR ; 調(diào)用宏MOV_PC_LRENTER_POWER_OFF; 進(jìn)入掉電模式 ;NOTE.;1 rGSTATUS3 should have the return address after wake-up from POWER_OFF mode.ldr r0,=REFRESHldr r1,r0 ;r1=rREFRESHorr r1, r1, #BIT_SELFREFRESHstr r1, r0 ;Enable SDRAM self-refreshmov r1,#16 ;Wait until self-refresh is issued,which

30、may not be needed. 0subs r1,r1,#1 ; 延時(shí)bne %B0ldr r1,=MISCCR ; ;Miscellaneous control,混雜控制模式ldr r0,r1 orr r0,r0,#(7<<17 ;Make sure that SCLK0:SCLK->0, SCLK1:SCLK->0, SCKE=L during ;boot-upstr r0,r1ldr r0,=CLKCON str r2,r0b .;CPU will die here. "." 當(dāng)前指令的地址 CPU 死在這WAKEUP_POWER_OFF

31、 ; 掉電喚醒;Release SCLKn after wake-up from the POWER_OFF mode.ldr r1,=MISCCR ;Miscellaneous control,混雜模式ldr r0,r1bic r0,r0,#(7<<17 ;SCLK0:0->SCLK, SCLK1:0->SCLK, SCKE:L->Hstr r0,r1;Set memory control registersldr r0,=SMRDATAldr r1,=BWSCON;BWSCON Address 起始位置 依次為BANKCON0 BANKCON1 BANKCON

32、2 .add r2, r0, #52 ;End address of SMRDATAldr r3, r0, #4 ; 讀取R0地址的數(shù)據(jù)到R3 R0=R0+4 讀取SMRDATA 數(shù)組(BWSCON BANKCON0 .的值str r3, r1, #4 ; 讀取R3的數(shù)據(jù)到 R1地址內(nèi)存中 R1=R1+4 賦給BWSON BANKCON0 .寄存器cmp r2, r0bne %B0 ; 判斷是否賦完值mov r1,#256 0subs r1,r1,#1 ;1 wait until the SelfRefresh is released.bne %B0; 延時(shí)ldr r1,=GSTATUS3 ;

33、GSTATUS3 has the start address just after POWER_OFF wake-upldr r0,r1 ;Saved data0(32-bit before entering POWER_OFF mode,在進(jìn) ; 入掉電模式之前(POWER=OFFMODE),保存data0mov pc,r0LTORG ; 文字池, 聲明一個(gè)數(shù)據(jù)緩沖池的開(kāi)始 ; 下面是具體的中斷處理函數(shù)跳轉(zhuǎn)的宏,通過(guò)上面的$HandlerLabel的宏定義展開(kāi)后跳轉(zhuǎn)到對(duì) ; 應(yīng)的中斷處理; 函數(shù)(對(duì)于向量中斷)HandlerFIQ HANDLER HandleFIQ ; 調(diào)用宏HANDLER

34、HandlerIRQ HANDLER HandleIRQ ;HandlerIRQ 行號(hào) HANDLER 宏名 ;HandleIRQ 導(dǎo)入的形參HandlerUndef HANDLER HandleUndefHandlerSWI HANDLER HandleSWIHandlerDabort HANDLER HandleDabortHandlerPabort HANDLER HandlePabort; 下面這段程序是用來(lái)處理非向量中斷,具體判斷I_ISPR中各位是否置1 ,置1表示目前此 ; 中斷等待響應(yīng)(每次只能有一位置1),; 從最高優(yōu)先級(jí)中斷位開(kāi)始判斷,檢測(cè)到等待服務(wù)中斷就將pc 置為中斷服

35、務(wù)函數(shù)首地址IsrIRQ ;IRQ 模式中斷(片內(nèi)外設(shè)中斷 引腳中斷)sub sp,sp,#4 ; reserved for PC,中斷分發(fā)例程入口地址預(yù)留棧空間, 預(yù)留 ;pc 返回指針的存儲(chǔ)位置stmfd sp!,r8-r9 ; 將R8R9 放入堆棧;INTOFFSET 寄存器各位表明發(fā)生了應(yīng)該調(diào)用那個(gè)中斷子程序。; 不過(guò)這個(gè)寄存器只能用在IRQ 中斷模式。ldr r9,=INTOFFSET ; 中斷請(qǐng)求源偏移寄存器ldr r9,r9 ;r9中存放INTOFFSET 的內(nèi)容ldr r8,=HandleEINT0 ; 取EINT0的地址,即IRQ 中斷首址 add r8,r8,r9,lsl

36、#2 ;r8=r8+ r9<<2 r9<<2(乘4 ,4字節(jié)對(duì)齊ldr r8,r8 ; 取r8地址的數(shù)據(jù)放入R8,加載中斷服務(wù)函數(shù)地址到r8 str r8,sp,#8 ; 將R8中的數(shù)據(jù)放入sp+8的地址中,保存到sp ,作為新的 ;PCldmfd sp!,r8-r9,pc ; 將堆棧內(nèi)空恢復(fù)到 R8 R9 PC,跳轉(zhuǎn)到新的PC 運(yùn)行;=; ENTRY;= ; 板子上電和復(fù)位后 程序開(kāi)始從位于0x0執(zhí)行,b ResetHandler 程序從跳轉(zhuǎn)到這 ; 里執(zhí)行; 板子上電復(fù)位后 執(zhí)行幾個(gè)步驟。; 初始化程序入口指令ResetHandler ; 復(fù)位處理程式ldr r0,

37、=WTCON ; watch dog disable 關(guān)閉看門(mén)狗ldr r1,=0x0 str r1,r0 ;r1->r0 禁止看門(mén)狗;1 ldr r0, =0x300; ldr r1, r0;b %B1ldr r0,=INTMSKldr r1,=0xffffffff ;all interrupt disable,關(guān)中斷,全部置1str r1,r0 ;r1->r0 禁止所有中斷l(xiāng)dr r0,=INTSUBMSKldr r1,=0x7ff ;all sub interrupt disable, 關(guān)所有子中斷str r1,r0 ; 測(cè)試外部LED 等 FALSE ;if; rGPFDA

38、T = (rGPFDAT & (0xf<<4 | (data & 0xf<<4; Led_Displayldr r0,=GPFCON ;F 口控制寄存器ldr r1,=0x5500str r1,r0ldr r0,=GPFDAT ;F 口數(shù)據(jù)寄存器ldr r1,=0x10str r1,r0; 計(jì)算公式;Fpllo=(m*Fin/(p*2s;m=MDIV+8,p=PDIV+2,s=SDIV;Fpllo 必須大于20Mhz 小于66Mhz;Fpllo*2s必須小于170Mhz;To reduce PLL lock time, adjust the LOCKTI

39、ME register.ldr r0,=LOCKTIMEldr r1,=0xffffff str r1,r0 PLL_ON_START;Configure MPLLldr r0,=MPLLCONldr r1,=(M_MDIV<<12+(M_PDIV<<4+M_SDIV ;Fin=12MHz,Fout=50MHzstr r1,r0;Check if the boot is caused by the wake-up from POWER_OFF mode.ldr r1,=GSTATUS2 ; GSTATUS2 復(fù)位狀態(tài)寄存器ldr r0,r1 tst r0,#0x2 ;

40、判斷R0 的第二位是否為0;In case of the wake-up from POWER_OFF mode, go to POWER_OFF_WAKEUP ;handler.nop;bne WAKEUP_POWER_OFFEXPORT StartPointAfterPowerOffWakeUp ; 聲明全局函數(shù) StartPointAfterPowerOffWakeUp; 設(shè)置存儲(chǔ)器控制寄存器。; 是設(shè)置SDRAM,flash ROM 存儲(chǔ)器連接和工作時(shí)序的程序, 片選定義的程序;SMRDATA map 在下面的程序中定義;Set memory control registersldr

41、r0,=SMRDATA ldr r1,=BWSCON ;BWSCON Address ;BWSCON Address 起始位置依次為BANKCON0 ;BANKCON1 BANKCON2 .add r2, r0, #52 ;End address of SMRDATA 一共13個(gè)寄存器ldr r3, r0, #4 ; 讀取R0地址的數(shù)據(jù)到R3,R0=R0+4 讀取SMRDATA 數(shù)組 (BWSCON BANKCON0 .的值str r3, r1, #4 ; 讀取R3的數(shù)據(jù)到 R1地址內(nèi)存中 R1=R1+4 賦給BWSON BANKCON0 .寄存器cmp r2, r0bne %B0; 禁止Ic

42、ache 和Dcache ,禁止MMU ;IMPORT MMU_DisableICache;bl MMU_DisableICache ;IMPORT MMU_DisableDCache;bl MMU_DisableDCache ;IMPORT MMU_InvalidateICache;bl MMU_InvalidateICache ;IMPORT MMU_DisableMMU;bl MMU_DisableMMU ; 初始化堆棧;Initialize stacksbl InitStacks ; Setup IRQ handlerldr r0,=HandleIRQ ;This routine is

43、 neededldr r1,=IsrIRQ ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c str r1,r0 adr r0, ResetEntry ;adr 也是取值,但這時(shí)程序在哪運(yùn)行就取那時(shí)的地址ldr r2, BaseOfROMcmp r0, r2ldreq r0, TopOfROMbeq InitRam ldr r3, TopOfROM; 將RO 區(qū)域的代碼copy 到RW 域中并且將ZI 區(qū)域初始化為0。行到這步結(jié)束bootloader 初步引導(dǎo)結(jié)束ldmia r0!, r4-r7stmia r2!, r4-r7c

44、mp r2, r3bcc %B0sub r2, r2, r3sub r0, r0, r2InitRam ; 將RW 內(nèi)容從FLASH 拷貝到SDRAMldr r2, BaseOfBSSldr r3, BaseOfZero 0cmp r2, r3 ;copy 初始化代碼ldrcc r 1, r0, #4 ; 沒(méi)有設(shè)置C 標(biāo)志位的時(shí)候執(zhí)行,即無(wú)符號(hào)數(shù)小于strcc r1, r2, #4 bcc %B0;ZI 段全部清零mov r0, #0 ; 初始化ZI 區(qū)域?yàn)?ldr r3, EndOfBSS 1cmp r2, r3strcc r0, r2, #4bcc %B1 :LNOT:THUMBCODE;

45、 將THUMBCODE 做邏輯非操作 bl Main ; Don't use main( because . 轉(zhuǎn)入C 程序 ;bl LEDTESTb . ; 死循環(huán) THUMBCODE ;for start-up code for Thumb modeorr lr,pc,#1bx lrCODE16bl Main ; Don't use main( because . 轉(zhuǎn)入C 程序b .CODE32; 堆棧初始化; 這是上面提到的對(duì)存儲(chǔ)寄存器初始化的數(shù)據(jù)map;function initializing stacksInitStacks;Don't use DRAM,su

46、ch as stmfd,ldmfd.;SVCstack is initialized before;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'mrs r0,cpsr ;r0<-cpsrbic r0,r0,#MODEMASK ;MODEMASK=0x1f 清除CPSR 中的PSR 位(5bitorr r1,r0,#UNDEFMODE|NOINT ;NOINT=0XC0 禁止IRQ 和FIQ 中斷msr cpsr_cxsf,r1 ;UndefMod

47、e cpsr_cxsf<-r1ldr sp,=UndefStackorr r1,r0,#ABORTMODE|NOINTmsr cpsr_cxsf,r1 ;AbortModeldr sp,=AbortStackorr r1,r0,#IRQMODE|NOINTmsr cpsr_cxsf,r1 ;IRQMode ldr sp,=IRQStackorr r1,r0,#FIQMODE|NOINTmsr cpsr_cxsf,r1 ;FIQModeldr sp,=FIQStackbic r0,r0,#MODEMASK|NOINTorr r1,r0,#SVCMODEmsr cpsr_cxsf,r1 ;S

48、VCModeldr sp,=SVCStack;USER mode has not be initialized. 用戶模式不初始化堆棧mov pc,lr;The LR register won't be valid if the current mode is not SVC mode.LTORG ; 聲明一個(gè)數(shù)據(jù)緩沖池的開(kāi)始。聲明一個(gè)緩沖池常放在無(wú)條件; 跳轉(zhuǎn)指令后,或子程序返回后,; 這樣處理器就不會(huì)將文字池中的數(shù)據(jù)當(dāng)指令來(lái)處理SMRDATA DATA ; 定義存儲(chǔ)器控制器; Memory configuration should be optimized for best per

49、formance; The following parameter is not optimized.; Memory access cycle parameter strategy; 1 The memory settings is safe parameters even at HCLK=75Mhz.; 2 SDRAM refresh period is for HCLK=75Mhz.DCD(0+(B1_BWSCON<<4+(B2_BWSCON<<8+(B3_BWSCON<<12+(B4_BWSCON<<16+(B5_BWSCON<&l

50、t;20+(B6_BWSCON<<24+(B7_BWSCON<<28 ; BWSCON=0x2211D110定義BWSCON DCD(B0_Tacs<<13+(B0_Tcos<<11+(B0_Tacc<<8+(B0_Tcoh<<6+(B0_Tah<<4+(B0_Tacp<<2+(B0_PMC ;GCS0 BANK0CON=0x0700定義BANKCON0,下同DCD(B1_Tacs<<13+(B1_Tcos<<11+(B1_Tacc<<8+(B1_Tcoh<

51、<6+(B1_Tah<<4+(B1_Tacp<<2+(B1_PMC ;GCS1 BANKCON1=0x7FFCDCD(B2_Tacs<<13+(B2_Tcos<<11+(B2_Tacc<<8+(B2_Tcoh<<6+(B2_Tah<<4+(B2_Tacp<<2+(B2_PMC ;GCS2 BANKCON2=0x0700DCD(B3_Tacs<<13+(B3_Tcos<<11+(B3_Tacc<<8+(B3_Tcoh<<6+(B3_Tah<&

52、lt;4+(B3_Tacp<<2+(B3_PMC ;GCS3 BANKCON3=0x0700DCD(B4_Tacs<<13+(B4_Tcos<<11+(B4_Tacc<<8+(B4_Tcoh<<6+(B4_Tah<<4+(B4_Tacp<<2+(B4_PMC ;GCS4 BANKCON4=0x0700DCD(B5_Tacs<<13+(B5_Tcos<<11+(B5_Tacc<<8+(B5_Tcoh<<6+(B5_Tah<<4+(B5_Tacp<&

53、lt;2+(B5_PMC ;GCS5 BANKCON5=0x0700DCD (B6_MT<<15+(B6_Trcd<<2+(B6_SCAN ;GCS6 BANKCON6=0x18005DCD (B7_MT<<15+(B7_Trcd<<2+(B7_SCAN ;GCS7 BANKCON7=0x18005DCD (REFEN<<23+(TREFMD<<22+(Trp<<20+(Trc<<18+(Tchr<<16+REFCNT ;REFR ESH ;REFRESH=0x008E0459 DRAM

54、/SDRAM refresh 設(shè)置刷新周期DCD 0x32 ;SCLK power saving mode, BANKSIZE 128M/128MDCD 0x30 ;MRSR6 CL=3clk ;Mode register set for SDRAMDCD 0x30 ;MRSR7 ;Mode register set for SDRAM ;DCD 0x20 ;MRSR6 CL=2clk ;DCD 0x20 ;MRSR7ALIGN ; 通過(guò)添加補(bǔ)丁字節(jié)使當(dāng)前位置滿足一定的對(duì)齊方式,聲明字對(duì)齊; 這里將中斷異常向量建立在sdram 中; 可讀寫(xiě)的數(shù)據(jù)段AREA RamData, DATA, READWRITE ; 異常中斷向量(矢量) _ISR_STARTADDRESS=MAP:定義一個(gè)結(jié)構(gòu)化的內(nèi)存表(storage map)的首地址,地址為0x33ff8000HandleReset # 4 ; #-Field:定義一個(gè)結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域,該域?yàn)?個(gè); 字節(jié)HandleUndef # 4HandleSWI HandlePabort HandleD

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論