<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM的44binit.s文件的詳細(xì)注釋

          ARM的44binit.s文件的詳細(xì)注釋

          作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò) 收藏
          ARM44binit.s文件詳細(xì)注釋

          2009-07-31 00:30
          ; *******************************************************
          ; * NAME : 44BINIT.S *
          ; * Version : 10.JAn.2003 *
          ; * Description: *
          ; * C start up codes *
          ; * Configure memory, Initialize ISR ,stacks *
          ; * Initialize C-variables *
          ; * Fill zeros into zero-initialized C-variables *
          ; *******************************************************

          本文引用地址:http://www.ex-cimer.com/article/201611/318896.htm

          GET option.s ;相當(dāng)于c語(yǔ)言中的#include "option.s"
          GET memcfg.s

          ;Interrupt Control
          ;聲明一些符號(hào)常量,這些符號(hào)常量和相應(yīng)寄存器的地址對(duì)應(yīng)
          INTPND EQU 0x01e00004 ;指示中斷請(qǐng)求狀態(tài)寄存器 每一位代變一種中斷請(qǐng)求具體表示哪一種中斷請(qǐng)參考44b0 spec
          INTMOD EQU 0x01e00008 ;中斷模式寄存器 有兩種中斷模式對(duì)應(yīng)位為1代表fip mode 0代表riq mode
          INTMSK EQU 0x01e0000c ;確定哪個(gè)中斷源被屏蔽 屏蔽的中斷源將不被服務(wù)
          I_ISPR EQU 0x01e00020 ;中斷服務(wù)掛起寄存器
          I_CMST EQU 0x01e0001c ;當(dāng)前主寄存器irq優(yōu)先級(jí)

          ;Watchdog timer
          WTCON EQU 0x01d30000 ;看門(mén)狗定時(shí)器控制寄存器

          ;Clock Controller
          PLLCON EQU 0x01d80000 ;pll控制寄存器
          CLKCON EQU 0x01d80004 ;時(shí)鐘控制寄存器
          LOCKTIME EQU 0x01d8000c ;鎖定時(shí)間計(jì)數(shù)值寄存器

          ;Memory Controller
          REFRESH EQU 0x01c80024 ;Dram/sdram刷新控制寄存器
          ;下面是對(duì)arm處理器模式寄存器對(duì)應(yīng)值的常數(shù)定義,arm處理器中有一個(gè)CPSR程序狀態(tài)寄存器它的后五位決定目前的處理器模式
          ;Pre-defined constants
          USERMODE EQU 0x10 ;用戶(hù)模式
          FIQMODE EQU 0x11 ;FIQ模式
          IRQMODE EQU 0x12 ;IRQ模式
          SVCMODE EQU 0x13 ;管理模式
          ABORTMODE EQU 0x17 ;中止模式
          UNDEFMODE EQU 0x1b ;未定義
          MODEMASK EQU 0x1f ;系統(tǒng)模式
          NOINT EQU 0xc0 ;

          ;check if tasm.exe is used.
          ;arm處理器有兩種工作狀態(tài) 1.arm:32位 這種工作狀態(tài)下執(zhí)行字對(duì)準(zhǔn)的arm指令 2.Thumb:16位這種工作狀態(tài)執(zhí)行半字對(duì)準(zhǔn)的Thumb指令
          ;因?yàn)樘幚砥鞣譃?6位 32位兩種工作狀態(tài)程序的編譯器也是分16位和32兩種編譯方式所以下面的程序用于根據(jù)處理器工作狀態(tài)確定編譯器編譯方式
          ;code16偽指令指示匯編編譯器后面的指令為16位的thumb指令
          ;code32偽指令指示匯編編譯器后面的指令為32位的arm指令
          ;這段是為了統(tǒng)一目前的處理器工作狀態(tài)和軟件編譯方式(16位編譯環(huán)境使用tasm.exe編譯)
          GBLL THUMBCODE ;設(shè)置一個(gè)全局邏輯變量
          [ {CONFIG} = 16 ;if config==16 這里表示你的目前處于領(lǐng)先地16位編譯方式
          THUMBCODE SETL {TRUE} ;設(shè)置THUMBCODE 為 true
          CODE32 ;轉(zhuǎn)入32位編譯模式
          | ;else
          THUMBCODE SETL {FALSE} ;設(shè)置THUMBCODE 為 false
          ]

          [ THUMBCODE ;if THUMBCODE==TRUE
          CODE32 ;for start-up code for Thumb mode;轉(zhuǎn)入32位編譯方式
          ]
          ;注意下面這段程序是個(gè)宏定義 很多人對(duì)這段程序不理解 我再次強(qiáng)調(diào)這是一個(gè)宏定義 所以大家要注意了下面包含的HandlerXXX HANDLER HandleXXX將都被下面這段程序展開(kāi)
          ;這段程序用于把中斷服務(wù)程序的首地址裝載到pc中,有人稱(chēng)之為“加載程序”。
          ;本初始化程序定義了一個(gè)數(shù)據(jù)區(qū)(在文件最后),34個(gè)字空間,存放相應(yīng)中斷服務(wù)程序的首地址。每個(gè)字空間都有一個(gè)標(biāo)號(hào),以Handle***命名。
          ;在向量中斷模式下使用“加載程序”來(lái)執(zhí)行中斷服務(wù)程序。
          ;這里就必須講一下向量中斷模式和非向量中斷模式的概念
          ;向量中斷模式是當(dāng)cpu讀取位于0x18處的IRQ中斷指令的時(shí)候,系統(tǒng)自動(dòng)讀取對(duì)應(yīng)于該中斷源確定地址上的指令取代0x18處的指令,通過(guò)跳轉(zhuǎn)指令系統(tǒng)就直接跳轉(zhuǎn)到對(duì)應(yīng)地址
          ;函數(shù)中 節(jié)省了中斷處理時(shí)間提高了中斷處理速度標(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)將interrupt 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)中斷源的處理代碼中
          MACRO
          $HandlerLabel HANDLER $HandleLabel

          $HandlerLabel
          sub sp,sp,#4 ;decrement sp(to store jump address)
          stmfd sp!,{r0} ;ADS僅支持FD(滿(mǎn)遞減)型堆棧;將要使用的r0寄存器入棧
          ldr r0,=$HandleLabel;load the address of HandleXXX to r0
          ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX
          str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack;將對(duì)應(yīng)的中斷函數(shù)首地址入棧
          ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)
          ;將中斷函數(shù)首地址出棧,放入PC中,系統(tǒng)將跳轉(zhuǎn)到對(duì)應(yīng)中斷處理函數(shù)
          MEND
          ;一個(gè)arm由RO,RW,ZI三個(gè)斷組成其中RO為代碼段,RW是已經(jīng)初始化的全局變量,ZI是未初始化的全局變量(對(duì)于GNU工具對(duì)應(yīng)的概念是TEXT ,DATA,BSS)bootloader
          ;bootloader要將RW段復(fù)制到ram中并將ZI段清零 編譯器使用下列段來(lái)記錄各段的起始和結(jié)束地址
          ; |Image$$RO$$Base| ; RO段起始地址
          ; |Image$$RO$$Limit| ; RO段結(jié)束地址加1
          ; |Image$$RW$$Base| ; RW段起始地址
          ; |Image$$RW$$Limit| ; RW段結(jié)束地址加1
          ; |Image$$ZI$$Base| ; ZI段起始地址
          ; |Image$$ZI$$Limit| ; ZI段結(jié)束地址加1
          ;這些標(biāo)號(hào)的值是通過(guò)編譯器的設(shè)定來(lái)確定的 如編譯軟件中對(duì)ro-base和rw-base的設(shè)定,例如 ro-base=0xc000000 rw-base=0xc5f0000

          IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)
          IMPORT |Image$$RW$$Base| ; Base of RAM to initialise
          IMPORT |Image$$ZI$$Base| ; Base and limit of area
          IMPORT |Image$$ZI$$Limit| ; to zero initialise

          IMPORT Main ; The main entry of mon program
          ;下面為代碼段
          AREA Init,CODE,READONLY ;聲明一個(gè)代碼段,名稱(chēng)為Init,屬性為只讀 ;異常中斷矢量表(每個(gè)表項(xiàng)占4個(gè)字節(jié)) 下面是中斷向量表 一旦系統(tǒng)運(yùn)行時(shí)有中斷發(fā)生 即使移植了操作系統(tǒng) 如linux 處理器已經(jīng)把控制權(quán)交給了操作系統(tǒng) 一旦發(fā)生中斷 處理器還是會(huì)跳轉(zhuǎn)到從0x0開(kāi)始
          ;中斷向量表中某個(gè)中斷表項(xiàng)(依據(jù)中斷類(lèi)型)開(kāi)始執(zhí)行
          ;具體中斷向量布局請(qǐng)參考s3c44b0 spec 例如 adc中斷向量為 0x000000c0下面對(duì)應(yīng)表中第49項(xiàng)位置向量地址0x0+4*(49-1)=0x000000c0
          ENTRY
          ;扳子上電和復(fù)位后程序開(kāi)始從位于0x0處開(kāi)始執(zhí)行硬件剛剛上電復(fù)位后程序從這里開(kāi)始執(zhí)行跳轉(zhuǎn)到標(biāo)號(hào)為ResetHandler處執(zhí)行

          1、從代碼看Init段就是要寫(xiě)入0x00地址的原始中斷向量,因此把這個(gè)文件編譯生成的44binit.O和Init填入ADS的Linker-Layout頁(yè)對(duì)應(yīng)項(xiàng)中(這樣編譯器會(huì)把該段代碼編譯到0X0地址。

          一、 關(guān)于44B0中斷系統(tǒng)
          44B0 中斷系統(tǒng)中有兩張中斷轉(zhuǎn)移表,經(jīng)過(guò)二重轉(zhuǎn)移才跳到中斷處理程序。第一張中斷向量表由硬件決定,所在區(qū)域?yàn)镽OM(flash),地址空間從0X00開(kāi)始,其中0X00-0X1C為異常向量入口地址,0X20-0XC0為中斷向量入口地址。另一張中斷向量表在RAM 中,可以隨便改,其位置在程序連接后才定。

          b ResetHandler ;for debug
          b HandlerUndef ;handlerUndef
          b HandlerSWI ;SWI interrupt handler
          b HandlerPabort ;handlerPAbort
          b HandlerDabort ;handlerDAbort
          b . ;handlerReserved
          b HandlerIRQ
          b HandlerFIQ
          ;***IMPORTANT NOTE***
          ;If the H/W vectored interrutp mode is enabled, The above two instructions should
          ;be changed like below, to work-around with H/W bug of S3C44B0X interrupt controller.
          ; b HandlerIRQ -> subs pc,lr,#4
          ; b HandlerIRQ -> subs pc,lr,#4

          二、 如何從第一張中斷向量表跳到第二張中斷向量表
          由于 RAM 放在地址空間的高端(距離中斷向量超過(guò)了 32M),故在第一張中斷向量表對(duì)應(yīng)位置上寫(xiě)上 ldr PC,# interrupt_service 如:ldr PC,=HandlerEINT4567。其實(shí)異常向量就是中斷向量,ARM7的內(nèi)核實(shí)際上只有8個(gè)(1個(gè)保留)異常向量,對(duì)于眾多的中斷源,ARM7 的內(nèi)核是通過(guò) IRQ、FRQ 的軟件查詢(xún)中斷狀態(tài)寄存器的位來(lái)獲得ISR的起始地址。
          44B0為了克服這種方式所帶來(lái)的中斷延遲,就加入了更多的中斷向量表(0x20到0xc0),要使用這種方式,必須在中斷控制寄存器中設(shè)置每個(gè)中斷源的方式為IRQ 方式,且使用向量中斷。
          VECTOR_BRANCH
          ldr pc,=HandlerEINT0 ;mGA H/W interrupt vector table
          ldr pc,=HandlerEINT1 ;
          ldr pc,=HandlerEINT2 ;
          ldr pc,=HandlerEINT3 ;
          ldr pc,=HandlerEINT4567 ;
          ldr pc,=HandlerTICK ;mGA
          b .
          b .
          ldr pc,=HandlerZDMA0 ;mGB
          ldr pc,=HandlerZDMA1 ;
          ldr pc,=HandlerBDMA0 ;
          ldr pc,=HandlerBDMA1 ;
          ldr pc,=HandlerWDT ;
          ldr pc,=HandlerUERR01 ;mGB
          b .
          b .
          ldr pc,=HandlerTIMER0 ;mGC
          ldr pc,=HandlerTIMER1 ;
          ldr pc,=HandlerTIMER2 ;
          ldr pc,=HandlerTIMER3 ;
          ldr pc,=HandlerTIMER4 ;
          ldr pc,=HandlerTIMER5 ;mGC
          b .
          b .
          ldr pc,=HandlerURXD0 ;mGD
          ldr pc,=HandlerURXD1 ;
          ldr pc,=HandlerIIC ;
          ldr pc,=HandlerSIO ;
          ldr pc,=HandlerUTXD0 ;
          ldr pc,=HandlerUTXD1 ;mGD
          b .
          b .
          ldr pc,=HandlerRTC ;mGKA
          b . ;
          b . ;
          b . ;
          b . ;
          b . ;mGKA
          b .
          b .
          ldr pc,=HandlerADC ;mGKB
          b . ;
          b . ;
          b . ;
          b . ;
          b . ;mGKB
          b .
          b .
          ldr pc,=EnterPWDN ;0xe0=EnterPWDN


          2、通過(guò)這段代碼,就在44B0的ROM中以0x00為起始地址的地方建立起了一張中斷向量表,而且這個(gè)表的順序完全符合44B0數(shù)據(jù)手冊(cè)中對(duì)中斷向量地址的定義要求。

          LTORG ;LTORG用于聲明一個(gè)數(shù)據(jù)緩沖池
          ;下面是具體的中斷處理函數(shù)跳轉(zhuǎn)的宏,通過(guò)上面的$HandlerLabel的宏定義展開(kāi)后跳轉(zhuǎn)到對(duì)應(yīng)的中斷處理函數(shù)(對(duì)于向量中斷)
          HandlerFIQ HANDLER HandleFIQ
          HandlerIRQ HANDLER HandleIRQ
          HandlerUndef HANDLER HandleUndef
          HandlerSWI HANDLER HandleSWI
          HandlerDabort HANDLER HandleDabort
          HandlerPabort HANDLER HandlePabort

          HandlerADC HANDLER HandleADC
          HandlerRTC HANDLER HandleRTC
          HandlerUTXD1 HANDLER HandleUTXD1
          HandlerUTXD0 HANDLER HandleUTXD0
          HandlerSIO HANDLER HandleSIO
          HandlerIIC HANDLER HandleIIC
          HandlerURXD1 HANDLER HandleURXD1
          HandlerURXD0 HANDLER HandleURXD0
          HandlerTIMER5 HANDLER HandleTIMER5
          HandlerTIMER4 HANDLER HandleTIMER4
          HandlerTIMER3 HANDLER HandleTIMER3
          HandlerTIMER2 HANDLER HandleTIMER2
          HandlerTIMER1 HANDLER HandleTIMER1
          HandlerTIMER0 HANDLER HandleTIMER0
          HandlerUERR01 HANDLER HandleUERR01
          HandlerWDT HANDLER HandleWDT
          HandlerBDMA1 HANDLER HandleBDMA1
          HandlerBDMA0 HANDLER HandleBDMA0
          HandlerZDMA1 HANDLER HandleZDMA1
          HandlerZDMA0 HANDLER HandleZDMA0
          HandlerTICK HANDLER HandleTICK
          HandlerEINT4567 HANDLER HandleEINT4567
          HandlerEINT3 HANDLER HandleEINT3
          HandlerEINT2 HANDLER HandleEINT2
          HandlerEINT1 HANDLER HandleEINT1
          HandlerEINT0 HANDLER HandleEINT0

          ;One of the following two routines can be used for non-vectored interrupt.
          ;下面這段程序是用來(lái)處理非向量中斷,具體判斷I_ISPR中各位是否置1 置1表示目前此中斷等待響應(yīng)(每次只能有一位置1),從最高優(yōu)先級(jí)中斷位開(kāi)始判斷,檢測(cè)到等待服務(wù)
          ;中斷就將pc置為中斷服務(wù)函數(shù)首地址
          IsrIRQ ;using I_ISPR register.
          sub sp,sp,#4 ;reserved for PC,為PC留下空位
          stmfd sp!,{r8-r9} ;把r8,r9先入棧

          ;IMPORTANT CAUTION
          ;if I_ISPC isnt used properly, I_ISPR can be 0 in this routine.

          ldr r9,=I_ISPR ;讀入I_ISPR中的值
          ldr r9,[r9]
          mov r8,#0x0
          0
          movs r9,r9,lsr #1 ;邏輯右移,得到中斷源的編號(hào)
          bcs ?
          add r8,r8,#4
          b ? ;往后跳轉(zhuǎn)到0這個(gè)標(biāo)簽的地方

          1
          ldr r9,=HandleADC
          add r9,r9,r8 ;得到偏移地址
          ldr r9,[r9] ;得到相應(yīng)的IRQ程序地址
          str r9,[sp,#8] ;把IRQ程序的地址當(dāng)成PC值入棧
          ldmfd sp!,{r8-r9,pc} ;出棧,轉(zhuǎn)到新的中斷程序處

          ;****************************************************
          ;* START *
          ;****************************************************
          ;扳子上電和復(fù)位后 程序開(kāi)始從位于0x0執(zhí)行b ResetHandler 程序從跳轉(zhuǎn)到這里執(zhí)行
          ;板子上電復(fù)位后 執(zhí)行幾個(gè)步驟這里通過(guò)標(biāo)號(hào)在注釋中加1,2,3....標(biāo)示 標(biāo)號(hào)表示執(zhí)行順序
          ;1.禁止看門(mén)狗 屏蔽所有中斷
          ResetHandler
          ldr r0,=WTCON ;watch dog disable
          ldr r1,=0x0
          str r1,[r0]

          ldr r0,=INTMSK
          ldr r1,=0x07ffffff ;all interrupt disable
          str r1,[r0]
          ;2.根據(jù)工作頻率設(shè)置pll
          ;這里介紹一下計(jì)算公式
          ;Fpllo=(m*Fin)/(p*2^s)
          ;m=MDIV+8,p=PDIV+2,s=SDIV
          ;Fpllo必須大于20Mhz小于66Mhz
          ;Fpllo*2^s必須小于170Mhz
          ;如下面的PLLCON設(shè)定中的M_DIV P_DIV S_DIV是取自option.h中
          ;#elif (MCLK==40000000)
          ;#define PLL_M (0x48)
          ;#define PLL_P (0x3)
          ;#define PLL_S (0x2)
          ;所以m=MDIV+8=80,p=PDIV+2=5,s=SDIV=2
          ;硬件使用晶振為10Mhz,即Fin=10Mhz
          ;Fpllo=80*10/5*2^2=40Mhz

          ;****************************************************
          ;* Set clock control registers *
          ;****************************************************
          ldr r0,=LOCKTIME
          ldr r1,=800 ; count = t_lock * Fin (t_lock=200us, Fin=4MHz) = 800
          str r1,[r0]

          [ PLLONSTART
          ldr r0,=PLLCON ;temporary setting of PLL
          ldr r1,=((M_DIV<<12)+(P_DIV<<4)+S_DIV) ;Fin=10MHz,Fout=40MHz
          str r1,[r0]
          ]

          ldr r0,=CLKCON
          ldr r1,=0x7ff8 ;All unit block CLK enable
          str r1,[r0]
          ;3.置存儲(chǔ)相關(guān)寄存器的程序
          ;這是設(shè)置SDRAM,flash ROM 存儲(chǔ)器連接和工作時(shí)序的程序,片選定義的程序
          ;SMRDATA map在下面的程序中定義
          ;SMRDATA中涉及的值請(qǐng)參考memcfg.s程序
          ;具體寄存器各位含義請(qǐng)參考s3c44b0 spec

          ;****************************************************
          ;* Set memory control registers *
          ;****************************************************
          ldr r0,=SMRDATA
          ldmia r0,{r1-r13}
          ldr r0,=0x01c80000 ;BWSCON Address
          stmia r0,{r1-r13}

          ;****************************************************
          ;* Initialize stacks *
          ;****************************************************
          ldr sp, =SVCStack ;Why?
          bl InitStacks
          ;5.設(shè)置缺省中斷處理函數(shù)
          ;****************************************************
          ;* Setup IRQ handler *
          ;****************************************************
          ldr r0,=HandleIRQ ;This routine is needed
          ldr r1,=IsrIRQ ;if there isnt subs pc,lr,#4 at 0x18, 0x1c
          str r1,[r0]
          ;6.將數(shù)據(jù)段拷貝到ram中 將零初始化數(shù)據(jù)段清零 跳入C語(yǔ)言的main函數(shù)執(zhí)行到這步結(jié)束bootloader初步引導(dǎo)結(jié)束
          ;********************************************************
          ;* Copy and paste RW data/zero initialized data *
          ;********************************************************
          LDR r0, =|Image$$RO$$Limit| ; Get pointer to ROM data
          LDR r1, =|Image$$RW$$Base| ; and RAM copy
          LDR r3, =|Image$$ZI$$Base|
          ;Zero init base => top of initialised data

          程序先把 ROM 里|Image$$RO$$Limt|開(kāi)始的 RW 初始數(shù)據(jù)拷貝到 RAM 里面|Image$$RW$$Base|開(kāi)始的地址,當(dāng)RAM這邊的目標(biāo)地址到達(dá)|Image$$ZI$$Base|后就表示RW區(qū)的結(jié)束和ZI區(qū)的開(kāi)始,接下去就對(duì)這片ZI區(qū)進(jìn)行清零操作,直到遇到結(jié)束地址|Image$$ZI$$Limit|。
          CMP r0, r1 ; Check that they are different
          BEQ ?
          0
          CMP r1, r3 ; Copy init data
          LDRCC r2, [r0], #4 ;--> LDRCC r2, [r0] + ADD r0, r0, #4
          STRCC r2, [r1], #4 ;--> STRCC r2, [r1] + ADD r1, r1, #4
          BCC ?
          1
          LDR r1, =|Image$$ZI$$Limit| ; Top of zero init segment
          MOV r2, #0
          2
          CMP r3, r1 ; Zero init
          STRCC r2, [r3], #4
          BCC ?

          [ :LNOT:THUMBCODE
          BL Main ;Dont use main() because ......;跳入main函數(shù)
          B .
          ]

          [ THUMBCODE ;for start-up code for Thumb mode
          orr lr,pc,#1
          bx lr
          CODE16
          bl Main ;Dont use main() because ......;跳入main函數(shù)
          b .
          CODE32
          ]
          ;4.初始化各模式下的棧指針
          ;****************************************************
          ;* The function for initializing stack *
          ;****************************************************
          InitStacks
          ;Dont use DRAM,such as stmfd,ldmfd......
          ;SVCstack is initialized before
          ;Under toolkit ver 2.50, msr cpsr,r1 can be used instead of msr cpsr_cxsf,r1

          mrs r0,cpsr
          bic r0,r0,#MODEMASK
          orr r1,r0,#UNDEFMODE|NOINT
          msr cpsr_cxsf,r1 ;UndefMode
          ldr sp,=UndefStack

          orr r1,r0,#ABORTMODE|NOINT
          msr cpsr_cxsf,r1 ;AbortMode
          ldr sp,=AbortStack

          orr r1,r0,#IRQMODE|NOINT
          msr cpsr_cxsf,r1 ;IRQMode
          ldr sp,=IRQStack

          orr r1,r0,#FIQMODE|NOINT
          msr cpsr_cxsf,r1 ;FIQMode
          ldr sp,=FIQStack

          bic r0,r0,#MODEMASK|NOINT
          orr r1,r0,#SVCMODE
          msr cpsr_cxsf,r1 ;SVCMode
          ldr sp,=SVCStack

          ;USER mode is not initialized.
          mov pc,lr ;The LR register may be not valid for the mode changes.
          ;下面是pwdn模式下的相關(guān)寄存器的定義
          ;****************************************************
          ;* The function for entering power down mode *
          ;****************************************************
          ;void EnterPWDN(int CLKCON);
          EnterPWDN
          mov r2,r0 ;r0=CLKCON
          ldr r0,=REFRESH
          ldr r3,[r0]
          mov r1, r3
          orr r1, r1, #0x400000 ;self-refresh enable
          str r1, [r0]

          nop ;Wait until self-refresh is issued. May not be needed.
          nop ;If the other bus master holds the bus, ...
          nop ; mov r0, r0
          nop
          nop
          nop
          nop

          ;enter POWERDN mode
          ldr r0,=CLKCON
          str r2,[r0]

          ;wait until enter SL_IDLE,STOP mode and until wake-up
          mov r0,#0xff
          0 subs r0,r0,#1
          bne ?

          ;exit from DRAM/SDRAM self refresh mode.
          ldr r0,=REFRESH
          str r3,[r0]

          mov pc,lr

          LTORG
          ;這是上面提到的對(duì)存儲(chǔ)寄存器初始化的數(shù)據(jù)map
          SMRDATA DATA
          ;*****************************************************************
          ;* Memory configuration has to be optimized for best performance *
          ;* The following parameter is not optimized. *
          ;*****************************************************************

          ;*** memory access cycle parameter strategy ***
          ; 1) Even FP-DRAM, EDO setting has more late fetch point by half-clock
          ; 2) The memory settings,here, are made the safe parameters even at 66Mhz.
          ; 3) FP-DRAM Parameters:tRCD=3 for tRAC, tcas=2 for pad delay, tcp=2 for bus load.
          ; 4) DRAM refresh rate is for 40Mhz.


          DCD 0x11110090 ;Bank0=OM[1:0], Bank1~Bank7=16bit, bank2=8bit;
          DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC)) ;GCS0
          DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC)) ;GCS1
          DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC)) ;GCS2
          DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC)) ;GCS3
          DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC)) ;GCS4
          DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC)) ;GCS5
          DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN)) ;GCS6
          DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN)) ;GCS7
          DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT) ;REFRESH RFEN=1, TREFMD=0, trp=3clk, trc=5clk, tchr=3clk,count=1019
          DCD 0x16 ;SCLK power mode, BANKSIZE 32M/32M
          DCD 0x20 ;MRSR6 CL=2clk
          DCD 0x20 ;MRSR7

          ALIGN

          ;下面是對(duì)ram區(qū)域map的定義
          AREA RamData, DATA, READWRITE
          ;這里定義了處理器工作于各模式的堆棧區(qū)在ram中map
          ^ (_ISR_STARTADDRESS-0x500) ;map

          ;field

          UserStack # 256 ;c1(c7)ffa00
          SVCStack # 256 ;c1(c7)ffb00
          UndefStack # 256 ;c1(c7)ffc00
          AbortStack # 256 ;c1(c7)ffd00
          IRQStack # 256 ;c1(c7)ffe00
          FIQStack # 0 ;c1(c7)fff00

          ;這里將中斷異常向量建立在sdram中
          ^ _ISR_STARTADDRESS
          HandleReset # 4
          HandleUndef # 4
          HandleSWI # 4
          HandlePabort # 4
          HandleDabort # 4
          HandleReserved # 4
          HandleIRQ # 4
          HandleFIQ # 4

          ;Dont use the label IntVectorTable,
          ;because armasm.exe cannt recognize this label correctly.
          ;the value is different with an address you think it may be.
          ;IntVectorTable
          HandleADC # 4
          HandleRTC # 4
          HandleUTXD1 # 4
          HandleUTXD0 # 4
          HandleSIO # 4
          HandleIIC # 4
          HandleURXD1 # 4
          HandleURXD0 # 4
          HandleTIMER5 # 4
          HandleTIMER4 # 4
          HandleTIMER3 # 4
          HandleTIMER2 # 4
          HandleTIMER1 # 4
          HandleTIMER0 # 4
          HandleUERR01 # 4
          HandleWDT # 4
          HandleBDMA1 # 4
          HandleBDMA0 # 4
          HandleZDMA1 # 4
          HandleZDMA0 # 4
          HandleTICK # 4
          HandleEINT4567 # 4
          HandleEINT3 # 4
          HandleEINT2 # 4
          HandleEINT1 # 4
          HandleEINT0 # 4 ;0xc1(c7)fff84

          END



          評(píng)論


          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();