在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > S3C2410啟動(dòng)代碼詳解(3)

            S3C2410啟動(dòng)代碼詳解(3)

            作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò) 收藏
            ;================================================================================

            ; ENTRY 系統(tǒng)上電后經(jīng)過(guò)一個(gè)b ResetHandler就跳轉(zhuǎn)到此處來(lái)。在此完成一些相關(guān)的軟硬件配置工作

            本文引用地址:http://www.biyoush.com/article/201611/316602.htm

            1. 屏蔽所有中斷,關(guān)看門狗。
            2. 根據(jù)工作頻率設(shè)置PLL寄存器
            3. 初始化存儲(chǔ)控制相關(guān)寄存器
            4. 初始化各模式下的棧指針
            5. 設(shè)置缺省中斷處理函數(shù)
            6. 將數(shù)據(jù)段拷貝到RAM中,將零初始化數(shù)據(jù)段清零
            7. 跳轉(zhuǎn)到C 語(yǔ)言Main入口函數(shù)中
            ;================================================================================
            ResetHandler
            ldrr0,=WTCON ;watch dog disable關(guān)看門狗
            ldrr1,=0x0
            strr1,[r0]

            ldrr0,=INTMSK
            ldrr1,=0xffffffff ;all interrupt disable屏蔽所有中斷
            strr1,[r0]

            ldrr0,=INTSUBMSK
            ldrr1,=0x3ff ;all sub interrupt disable屏蔽所有子中斷
            strr1,[r0]

            [ {FALSE}//;是得有些表示了,該點(diǎn)點(diǎn)LED燈了,不過(guò)被FALSE掉了.
            ; rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);
            ; Led_Display
            ldrr0,=GPFCON
            ldrr1,=0x5500
            strr1,[r0]
            ldrr0,=GPFDAT
            ldrr1,=0x10
            strr1,[r0]
            ]

            ;To reduce PLL lock time, adjust the LOCKTIME register. 為了減少PLL的lock time, 調(diào)整LOCKTIME寄存器.
            ldrr0,=LOCKTIME//LOCKTIME為鎖定計(jì)數(shù)定時(shí)器,即設(shè)置PLL穩(wěn)定過(guò)渡時(shí)間,一般大于150uS
            ldrr1,=0xffffff
            strr1,[r0]

            ;=================================================================================

            上電復(fù)位時(shí)的時(shí)鐘行為。晶振在幾毫秒內(nèi)開始振蕩。當(dāng)OSC時(shí)鐘穩(wěn)定后,PLL根據(jù)默認(rèn)PLL設(shè)置開始生效,但是通常這個(gè)時(shí)候是不穩(wěn)定的,因此在軟件重新配置PLLCON寄存器之前FCLK直接使用Fin而不是MPLL,即使用戶不希望改變PLLCON的默認(rèn)值,用戶也應(yīng)該執(zhí)行一邊寫PLLCON操作。

            ;這里介紹一下計(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中M_DIV=0x5c=92 P_DIV=0x4 S_DIV=0x2

            所以Fpllo=(m*Fin)/(p*2^s)=(92+8)*12M/(4+2)*2^2=50M

            ;==================================================================================
            [ PLL_ON_START
            ;Configure MPLL
            ldrr0,=MPLLCON//M_DIV=0x5c=92 P_DIV=0x4 S_DIV=0x2
            ldrr1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV) ;Fin=12MHz,Fout=50MHz
            strr1,[r0]
            ;Configure UPLL
            ldrr0,=UPLLCON
            ldrr1,=((U_MDIV<<12)+(U_PDIV<<4)+U_SDIV) ;Fin=12MHz,UPLLout=48MHz
            strr1,[r0]
            ]

            ;Check if the boot is caused by the wake-up from POWER_OFF mode.
            ldrr1,=GSTATUS2
            ldrr0,[r1]
            tstr0,#0x2
            ;In case of the wake-up from POWER_OFF mode, go to POWER_OFF_WAKEUP handler.
            bneWAKEUP_POWER_OFF

            EXPORT StartPointAfterPowerOffWakeUp
            StartPointAfterPowerOffWakeUp

            ;====================================================================================

            //設(shè)置內(nèi)存控制器等寄存器的值,因?yàn)檫@些寄存器是連續(xù)排列的,所以采用如下辦法對(duì)這些 ;寄存器進(jìn)行連續(xù)設(shè)置.其中用到了SMRDATA的數(shù)據(jù),這在代碼后面有定義;Set memory control registers

            ;=====================================================================================

            ldrr0,=SMRDATA
            ldrr1,=BWSCON ;BWSCON Address
            addr2, r0, #52 ;End address of SMRDATA,共13個(gè)DCD,52個(gè)字節(jié)
            0
            ldrr3, [r0], #4
            strr3, [r1], #4
            cmpr2, r0
            bne%B0 //上面這段小程序?qū)⒑竺娑x的數(shù)據(jù)復(fù)制到相關(guān)內(nèi)存控制寄存器

            ;Initialize stacks
            blInitStacks//調(diào)用堆棧初始化子程序
            ;==================================================================================

            關(guān)于異常中斷系統(tǒng):異常中斷矢量表(每個(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開始
            ;中斷向量表中某個(gè)中斷表項(xiàng)(依據(jù)中斷類型)開始執(zhí)行;具體中斷向量布局請(qǐng)參考s3c44b0 spec 例如 adc中斷向量為 0x000000c0下面對(duì)應(yīng)表中第49項(xiàng)位置 向量地址0x0+4*(49-1)=0x000000c0
            2410異常中斷系統(tǒng)中有兩張中斷轉(zhuǎn)移表,經(jīng)過(guò)二重轉(zhuǎn)移才跳到中斷處理程序。第一張中斷向量表由硬件決定,所在區(qū)域?yàn)镽OM(flash),地址空間從0X00開始,其中0X00-0X1C為異常向量入口地址。另一張中斷向量表在RAM 中,可以隨便改,其位置在程序連接后才定。ARM7的內(nèi)核實(shí)際上只有8個(gè)(1個(gè)保留)異常向量,對(duì)于其他所有眾多的中斷源,ARM7 的內(nèi)核是通過(guò)IRQ或FRQ的軟件查詢中斷狀態(tài)寄存器的位來(lái)獲得ISR的起始地址。
            ;===================================================================================
            ; Setup IRQ handler //;設(shè)置缺省中斷處理函數(shù)
            ldrr0,=HandleIRQ //;This routine is needed;//使用ldr偽指令裝載HandleIRQ的地址到r0中
            ldrr1,=IsrIRQ //If there isnt subs pc,lr,#4 at 0x18, 0x1c;//使用ldr偽指令裝載IsrIRQ的地址到r1中
            strr1,[r0] //把r1的值寫到r0指向的存儲(chǔ)地址中,把IsrIRQ這個(gè)函數(shù)的地址寫入到HandleIRQ存儲(chǔ)單元里面

            ;======================================================================================

            ;Copy and paste RW data/zero initialized data

            //以下程序段將加載哉中的數(shù)據(jù)段RW拷貝到運(yùn)行域的ram中 將ZI段中的零初始化數(shù)據(jù)段清零

            //跳入C語(yǔ)言的main函數(shù)執(zhí)行到這步結(jié)束bootloader初步引導(dǎo)結(jié)束

            程序先把 ROM 里|Image$$RO$$Limt|開始的 RW 初始數(shù)據(jù)拷貝到 RAM 里面|Image$$RW$$Base|開始的地址,當(dāng)RAM這邊的目標(biāo)地址到達(dá)|Image$$ZI$$Base|后就表示RW區(qū)的結(jié)束和ZI區(qū)的開始,接下去就對(duì)這片ZI區(qū)進(jìn)行清零操作,直到遇到結(jié)束地址|Image$$ZI$$Limit|。

            ;======================================================================================
            ldrr0, =|Image$$RO$$Limit| //Get pointer to ROM data,rom中的RW數(shù)據(jù)源的起始地址
            ldrr1, =|Image$$RW$$Base| //and RAM copyRW區(qū)在RAM里的執(zhí)行區(qū)起始地址
            ldrr3, =|Image$$ZI$$Base|//ZI區(qū)在RAM里面的起始地址

            ;Zero init base => top of initialised data檢查裝載地址和執(zhí)行地址是否相同
            cmpr0, r1 ; Check that they are different
            beq%F2 ;//若相等則跳轉(zhuǎn)到2,相同,則不拷貝該區(qū)間,初始化零數(shù)據(jù)區(qū)
            1
            cmpr1, r3 ; Copy init data;//如果r0不等于r1,r1和r3比較,Copy init data,不相同,將裝載區(qū)拷貝到執(zhí)行區(qū)
            ldrccr2, [r0], #4 ;--> LDRCC r2, [r0] + ADD r0, r0, #4當(dāng)無(wú)符號(hào)數(shù)r1strccr2, [r1], #4 ;--> STRCC r2, [r1] + ADD r1, r1, #4
            bcc%B1 ;//若相等則跳轉(zhuǎn)到1,相同,則不拷貝該區(qū)間,初始化零數(shù)據(jù)區(qū)

            2
            ldrr1, =|Image$$ZI$$Limit| ; Top of zero init segment,ZI區(qū)在RAM里面的結(jié)束地址后面的一個(gè)地址
            movr2, #0
            3
            cmpr3, r1 ; Zero init
            strccr2, [r3], #4 //當(dāng)ZI區(qū)的起始地址未達(dá)等于結(jié)束地址時(shí),繼續(xù)清0
            bcc%B3 ;//當(dāng)無(wú)符號(hào)數(shù)r3

            [ :LNOT:THUMBCODE
            blMain ;Dont usemain()because......跳到Main()主函數(shù),注意大小寫
            b.
            ]

            [ THUMBCODE ;for start-up code for Thumb mode
            orrlr,pc,#1
            bxlr
            CODE16
            blMain ;Dont use main() because ......
            b.
            CODE32
            ]


            ;function initializing stacks
            InitStacks
            ;Dont use DRAM,such as stmfd,ldmfd......
            ;SVCstack is initialized before
            ;Under toolkit ver 2.5, msr cpsr,r1 can be used instead of msr cpsr_cxsf,r1
            mrsr0,cpsr;//讀取CPSR的值,R0=CPSR,CPSR為當(dāng)前程序狀態(tài)寄存器
            bicr0,r0,#MODEMASK;//R0=R0&(~MODEMASK),MODEMASK=0X1F,也就是低五位清0
            orrr1,r0,#UNDEFMODE|NOINT;//R1=R0|(MODEMASK|NONINT),R1為未定義模式,也就是低八位為11X11011
            msrcpsr_cxsf,r1;UndefMode;//寫把R1的值寫到狀態(tài)寄存器cpsr_cxsf(也就是CPSR),UndefMode
            ldrsp,=UndefStack;//設(shè)置未定義模式下的堆棧指針

            orrr1,r0,#ABORTMODE|NOINT
            msrcpsr_cxsf,r1;AbortMode
            ldrsp,=AbortStack

            orrr1,r0,#IRQMODE|NOINT
            msrcpsr_cxsf,r1;IRQMode
            ldrsp,=IRQStack

            orrr1,r0,#FIQMODE|NOINT
            msrcpsr_cxsf,r1;FIQMode
            ldrsp,=FIQStack

            bicr0,r0,#MODEMASK|NOINT
            orrr1,r0,#SVCMODE
            msrcpsr_cxsf,r1;SVCMode
            ldrsp,=SVCStack

            //USER mode has not be initialized.注意:不要切換到User模式進(jìn)行User模式的堆棧設(shè)置,因?yàn)檫M(jìn)入U(xiǎn)ser模式后就

            //不能再操作CPSR回到別的模式了,可能會(huì)對(duì)接下去的程序執(zhí)行造成影響

            movpc,lr //堆棧初始化完成返回
            ;The LR register wont be valid if the current mode is not SVC mode.

            ;以下是上面提到的對(duì)存儲(chǔ)寄存器初始化的數(shù)據(jù)map,共13個(gè)DCD

            LTORG

            SMRDATA DATA
            ; Memory configuration should be optimized for best performance
            ; 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<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))//BAN1,6,7為32位數(shù)據(jù)完,其他除0外為16
            DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC));GCS0;BANK0的相關(guān)訪問(wèn)模式及各訪問(wèn)周期設(shè)置, 各位定義可參考memcfg.inc文件
            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)//;設(shè)置刷新周期

            DCD 0x32 ; ;SCLK power saving mode, ARM core burst disable, BANKSIZE 128M/128M

            DCD 0x30 ;MRSR6 CL=3clk CL:CAS latency
            DCD 0x30 ;MRSR7
            ; DCD 0x20 ;MRSR6 CL=2clk
            ; DCD 0x20 ;MRSR7

            //下面是對(duì)ram區(qū)域map的定義;這里定義了處理器工作于各模式的堆棧區(qū)在ram中map.

            ALIGN//字對(duì)齊
            AREA RamData, DATA, READWRITE

            ^ _ISR_STARTADDRESS //^=map
            HandleReset # 4 //#=field
            HandleUndef # 4
            HandleSWI # 4
            HandlePabort # 4
            HandleDabort # 4
            HandleReserved # 4
            HandleIRQ # 4
            HandleFIQ # 4

            ;Dont use the label IntVectorTable,
            ;The value of IntVectorTable is different with the address you think it may be.
            ;IntVectorTable
            HandleEINT0 # 4
            HandleEINT1 # 4
            HandleEINT2 # 4
            HandleEINT3 # 4
            HandleEINT4_7# 4
            HandleEINT8_23# 4
            HandleRSV6# 4
            HandleBATFLT # 4
            HandleTICK # 4
            HandleWDT# 4
            HandleTIMER0 # 4
            HandleTIMER1 # 4
            HandleTIMER2 # 4
            HandleTIMER3 # 4
            HandleTIMER4 # 4
            HandleUART2 # 4
            HandleLCD # 4
            HandleDMA0# 4
            HandleDMA1# 4
            HandleDMA2# 4
            HandleDMA3# 4
            HandleMMC# 4
            HandleSPI0# 4
            HandleUART1# 4
            HandleRSV24# 4
            HandleUSBD# 4
            HandleUSBH# 4
            HandleIIC # 4
            HandleUART0 # 4
            HandleSPI1 # 4
            HandleRTC # 4
            HandleADC # 4

            END



            關(guān)鍵詞: S3C2410啟動(dòng)代

            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉