新聞中心

        ARM移植之BootLoader(2)

        作者: 時間:2016-11-10 來源:網(wǎng)絡(luò) 收藏
        3.BootLoader第一階段

          3.1硬件設(shè)備初始化

          基本的硬件初始化工作包括:

          ·屏蔽所有的中斷;

          ·設(shè)置CPU的速度和時鐘頻率;

          ·RAM初始化;

          ·初始化LED

          ARM的中斷向量表設(shè)置在0地址開始的8個字空間中,如下表:


          每當其中的某個異常發(fā)生后即將PC值置到相應(yīng)的中斷向量處,每個中斷向量處放置一個跳轉(zhuǎn)指令到相應(yīng)的中斷服務(wù)程序去進行處理,中斷向量表的程序如下:

        @ 0x00: Reset
        b Reset
        @ 0x04: Undefined instruction exception
        UndefEntryPoint:
        b HandleUndef
        @ 0x08: Software interrupt exception
        SWIEntryPoint:
        b HandleSWI
        @ 0x0c: Prefetch Abort (Instruction Fetch Memory Abort)
        PrefetchAbortEnteryPoint:
        b HandlePrefetchAbort
        @ 0x10: Data Access Memory Abort
        DataAbortEntryPoint:
        b HandleDataAbort
        @ 0x14: Not used
        NotUsedEntryPoint:
        b HandleNotUsed
        @ 0x18: IRQ(Interrupt Request) exception
        IRQEntryPoint:
        b HandleIRQ
        @ 0x1c: FIQ(Fast Interrupt Request) exception
        FIQEntryPoint:
        b HandleFIQ

          復(fù)位時關(guān)閉看門狗定時器、屏蔽所有中斷:

        Reset:
        @ disable watch dog timer
        mov r1, #0x53000000
        mov r2, #0x0
        str r2, [r1]
        @ disable all interrupts
        mov r1, #INT_CTL_BASE
        mov r2, #0xffffffff
        str r2, [r1, #oINTMSK]
        ldr r2, =0x7ff
        str r2, [r1, #oINTSUBMSK]

          設(shè)置系統(tǒng)時鐘:

        @init clk
        @ 1:2:4
        mov r1, #CLK_CTL_BASE
        mov r2, #0x3
        str r2, [r1, #oCLKDIVN]
        mrc p15, 0, r1, c1, c0, 0 @ read ctrl register
        orr r1, r1, #0xc0000000 @ Asynchronous
        mcr p15, 0, r1, c1, c0, 0 @ write ctrl register
        @ now, CPU clock is 200 Mhz
        mov r1, #CLK_CTL_BASE
        ldr r2, mpll_200mhz
        str r2, [r1, #oMPLLCON]

          點亮所有的用戶LED:

        @ All LED on
        mov r1, #GPIO_CTL_BASE
        add r1, r1, #oGPIO_F
        ldr r2,=0x55aa
        str r2, [r1, #oGPIO_CON]
        mov r2, #0xff
        str r2, [r1, #oGPIO_UP]
        mov r2, #0x00
        str r2, [r1, #oGPIO_DAT]

          設(shè)置(初始化)內(nèi)存映射:

        ENTRY(memsetup)
        @ initialise the static memory

        @ set memory control registers
        mov r1, #MEM_CTL_BASE
        adrl r2, mem_cfg_val
        add r3, r1, #52
        1: ldr r4, [r2], #4
        str r4, [r1], #4
        cmp r1, r3
        bne 1b

        mov pc, lr

          設(shè)置(初始化)UART:

        @ set GPIO for UART
        mov r1, #GPIO_CTL_BASE
        add r1, r1, #oGPIO_H
        ldr r2, gpio_con_uart
        str r2, [r1, #oGPIO_CON]
        ldr r2, gpio_up_uart
        str r2, [r1, #oGPIO_UP]
        bl InitUART

        @ Initialize UART
        @
        @ r0 = number of UART port
        InitUART:
        ldr r1, SerBase
        mov r2, #0x0
        str r2, [r1, #oUFCON]
        str r2, [r1, #oUMCON]
        mov r2, #0x3
        str r2, [r1, #oULCON]
        ldr r2, =0x245
        str r2, [r1, #oUCON]
        #define UART_BRD ((50000000 / (UART_BAUD_RATE * 16)) - 1)
        mov r2, #UART_BRD
        str r2, [r1, #oUBRDIV]
        mov r3, #100
        mov r2, #0x0
        1: sub r3, r3, #0x1
        tst r2, r3
        bne 1b

        #if 0
        mov r2, #U
        str r2, [r1, #oUTXHL]

        1: ldr r3, [r1, #oUTRSTAT]
        and r3, r3, #UTRSTAT_TX_EMPTY
        tst r3, #UTRSTAT_TX_EMPTY
        bne 1b

        mov r2, #0
        str r2, [r1, #oUTXHL]

        1: ldr r3, [r1, #oUTRSTAT]
        and r3, r3, #UTRSTAT_TX_EMPTY
        tst r3, #UTRSTAT_TX_EMPTY
        bne 1b
        #endif

        mov pc, lr

          此外,vivi還提供了幾個匯編情況下通過串口打印字符的函數(shù)PrintChar、PrintWord和PrintHexWord:

        @ PrintChar : prints the character in R0
        @ r0 contains the character
        @ r1 contains base of serial port
        @ writes ro with XXX, modifies r0,r1,r2
        @ TODO : write ro with XXX reg to error handling
        PrintChar:
        TXBusy:
        ldr r2, [r1, #oUTRSTAT]
        and r2, r2, #UTRSTAT_TX_EMPTY
        tst r2, #UTRSTAT_TX_EMPTY
        beq TXBusy
        str r0, [r1, #oUTXHL]
        mov pc, lr

        @ PrintWord : prints the 4 characters in R0
        @ r0 contains the binary word
        @ r1 contains the base of the serial port
        @ writes ro with XXX, modifies r0,r1,r2
        @ TODO : write ro with XXX reg to error handling
        PrintWord:
        mov r3, r0
        mov r4, lr
        bl PrintChar

        mov r0, r3, LSR #8 /* shift word right 8 bits */
        bl PrintChar

        mov r0, r3, LSR #16 /* shift word right 16 bits */
        bl PrintChar

        mov r0, r3, LSR #24 /* shift word right 24 bits */
        bl PrintChar

        mov r0, #r
        bl PrintChar

        mov r0, #n
        bl PrintChar

        mov pc, r4

        @ PrintHexWord : prints the 4 bytes in R0 as 8 hex ascii characters
        @ followed by a newline
        @ r0 contains the binary word
        @ r1 contains the base of the serial port
        @ writes ro with XXX, modifies r0,r1,r2
        @ TODO : write ro with XXX reg to error handling
        PrintHexWord:
        mov r4, lr
        mov r3, r0
        mov r0, r3, LSR #28
        bl PrintHexNibble
        mov r0, r3, LSR #24
        bl PrintHexNibble
        mov r0, r3, LSR #20
        bl PrintHexNibble
        mov r0, r3, LSR #16
        bl PrintHexNibble
        mov r0, r3, LSR #12
        bl PrintHexNibble
        mov r0, r3, LSR #8
        bl PrintHexNibble
        mov r0, r3, LSR #4
        bl PrintHexNibble
        mov r0, r3
        bl PrintHexNibble

        mov r0, #r
        bl PrintChar

        mov r0, #n
        bl PrintChar

        mov pc, r4



        關(guān)鍵詞: ARM移植BootLoade

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 肇东市| 墨竹工卡县| 余庆县| 惠来县| 彭阳县| 祁阳县| 承德县| 呈贡县| 尚义县| 敦化市| 天柱县| 陕西省| 承德县| 临西县| 始兴县| 龙川县| 册亨县| 兴仁县| 南宁市| 新竹市| 深泽县| 石楼县| 梨树县| 东海县| 司法| 昭通市| 连平县| 含山县| 清河县| 云龙县| 宣恩县| 鹿泉市| 凤山县| 洪洞县| 云南省| 台湾省| 林西县| 兖州市| 呈贡县| 马公市| 太原市|