在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 7732|回复: 12

ARM板bios的一些疑问

[复制链接]
发表于 2006-7-12 22:33:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
从我买的ARM(44B0)开发板来看, 新做好的ARM开发板都会先烧入bios程序。粗看了一下bios的源代码,都是对ARM板各部分的初始化,里面的vector.s 、boot.s、SysInit.s三个源文件由ARM的汇编指令编写,其它均是C编程。买开发板的同时还提供了很多例程,而每个例程中都包括一个不变的由汇编写的44BINIT.S程序,这应该是系统上电后最早执行的那段汇编指令;我的理解是,嵌入式系统的运行总是从ARM汇编指令开始,其中对CPU进行初始化以及中断向量表,在汇编最后有一个跳转指令,使程序跳转至C语言的main()函数,然后执行应用程序。
        
        那么上述的bios程序在整个过程中到底起什么作用呢?如果仅仅是一个初始化程序,在各种应用程序中,也都包括了初始化语句,那么这个bios程序岂不是多余的?烧写完bios程序后,开发板上的几个LED会连续的亮灭两次,难道bios仅仅是用来测试几个发光二极管的好坏吗?上述三个汇编编写的源程序不同于开发板给出的44BINIT.S程序,它们的作用是什么?如果它们也是上电后首先执行的代码,那么为什么又会不同于44BINIT.S程序,从初始化来看,bios里的语句也要多得多,为什么会有这种差别?这个bios程序在系统中是怎么被执行的呢?

        思路有点乱,不知道大家能不能看明白。
 楼主| 发表于 2006-7-13 11:19:06 | 显示全部楼层
以下是几个文件的内容:
/*boot.s*/
        AREA        boot, CODE, READONLY

VECTORS        EQU        0x0c000000

        ENTRY
       
        mov        pc, #VECTORS
        ldr        pc, =VECTORS+4
        ldr        pc, =VECTORS+8
        ldr        pc, =VECTORS+0x0c
        ldr        pc, =VECTORS+0x10
        ldr        pc, =VECTORS+0x14
        ldr        pc, =VECTORS+0x18
        ldr        pc, =VECTORS+0x1c
       
        END
 楼主| 发表于 2006-7-13 11:20:07 | 显示全部楼层
/*vector.s*/
ModeMask                 EQU        0x1F
SVC32Mode                EQU        0x13
IRQ32Mode                EQU        0x12
FIQ32Mode                EQU        0x11
User32Mode                EQU        0x10
Abort32Mode                EQU        0x17
Undef32Mode                EQU        0x1B
IRQ_BIT                        EQU        0x80
FIQ_BIT                        EQU        0x40

        GBLS        MainEntry
MainEntry        SETS        "main"
        IMPORT        $MainEntry

;**********************************************************
;检查是否使用tasm.exe进行编译
       
GBLL    THUMBCODE
    [ {CONFIG} = 16       
THUMBCODE SETL        {TRUE}
    CODE32
    |   
THUMBCODE SETL        {FALSE}
    ]

    [ THUMBCODE
    CODE32   ;for start-up code for Thumb mode
    ]   
            
;******************************************************
        AREA        SelfBoot,        CODE,        READONLY
       
        IMPORT        UDF_INS_VECTOR
        IMPORT        SWI_SVC_VECTOR
        IMPORT        INS_ABT_VECTOR
        IMPORT        DAT_ABT_VECTOR
        IMPORT        IRQ_SVC_VECTOR
        IMPORT        FIQ_SVC_VECTOR                               
       
        ENTRY       
        IF EF: |ads$version|
        ELSE
        EXPORT        __main
__main
        ENDIF               
ResetEntry
        b        SYS_RST_HANDLER
        b        UDF_INS_HANDLER
        b        SWI_SVC_HANDLER
        b        INS_ABT_HANDLER
        b        DAT_ABT_HANDLER
        b        .
        b        IRQ_SVC_HANDLER
        b        FIQ_SVC_HANDLER

;******************************************************
        MACRO       
$Label        HANDLER        $Vector
$Label
        sub                lr, lr, #4                       
        stmfd        sp!, {r0-r3, lr}       
        ldr        r0, =$Vector
        ldr        pc, [r0]
        ldmfd        sp!, {r0-r3, pc}^               
        MEND
       
UDF_INS_HANDLER
        stmfd        sp!, {r0-r3, lr}
        ldr        r0, =UDF_INS_VECTOR
        mov        lr, pc
        ldr        pc, [r0]
        ldmfd        sp!, {r0-r3, pc}^
SWI_SVC_HANDLER
        stmfd        sp!, {r0-r3, lr}
        ldr        r0, =SWI_SVC_VECTOR
        mov        lr, pc
        ldr        pc, [r0]
        ldmfd        sp!, {r0-r3, pc}^
INS_ABT_HANDLER
        sub        lr, lr, #4
        stmfd        sp!, {r0-r3, lr}
        ldr        r0, =INS_ABT_VECTOR
        mov        lr, pc
        ldr        pc, [r0]
        ldmfd        sp!, {r0-r3, pc}^
DAT_ABT_HANDLER
        sub        lr, lr, #4
        stmfd        sp!, {r0-r3, lr}
        ldr        r0, =DAT_ABT_VECTOR
        mov        lr, pc
        ldr        pc, [r0]
        ldmfd        sp!, {r0-r3, pc}^
IRQ_SVC_HANDLER
        sub                lr, lr, #4
        stmfd        sp!, {r0-r12, lr}       
        mrs                r0, spsr
        stmfd        sp!, {r0}
        ldr                r0, =IRQ_SVC_VECTOR
        ldr                pc, [r0]       
FIQ_SVC_HANDLER
        sub        lr, lr, #4
        stmfd        sp!, {r0-r12, lr}       
        mrs        r0, spsr
        stmfd        sp!, {r0}
        ldr        r0, =IRQ_SVC_VECTOR
        ldr        pc, [r0]
                               
;*******************************************************
SYS_RST_HANDLER
        mrs        r0, cpsr                                ;enter svc mode and disable irq,fiq
        bic        r0, r0, #ModeMask
        orr        r0, r0, #(SVC32Mode :OR: IRQ_BIT :OR: FIQ_BIT)
        msr        cpsr_c, r0
       
        IMPORT        InitSystem
        bl        InitSystem       
       
        adr        r0, ResetEntry
        ldr        r1,        BaseOfROM
        cmp        r0,        r1
        ldreq        r0, TopOfROM
        beq        InitRamData
                       
        ldr        r2,        =CopyProcBeg
        sub        r1, r2, r1
        add        r0, r0, r1       
        ldr        r3,        =CopyProcEnd       
0       
        ldmia        r0!, {r4-r7}
        stmia        r2!, {r4-r7}
        cmp        r2, r3
        bcc        %B0       
       
        ldr        r3, TopOfROM               
        ldr        pc, =CopyProcBeg
       
;***********************************************
CopyProcBeg       
0       
        ldmia        r0!, {r4-r11}
        stmia        r2!, {r4-r11}
        cmp        r2, r3
        bcc        %B0       
CopyProcEnd
       
        sub        r1, r2, r3
        sub        r0, r0, r1               
       
InitRamData       
        ldr        r2, BaseOfBSS
        ldr        r3, BaseOfZero       
0
        cmp        r2, r3
        ldrcc        r1, [r0], #4
        strcc        r1, [r2], #4
        bcc        %B0       

        mov        r0,        #0
        ldr        r3,        EndOfBSS
1       
        cmp        r2,        r3
        strcc        r0, [r2], #4
        bcc        %B1                       
                                                 
        ldr        pc,        GotoMain       

GotoMain        DCD        $MainEntry

;***********************************************
        IMPORT        |Image$$RO$$Base|        ; ROM code start       
        IMPORT        |Image$$RO$$Limit|        ; RAM data starts after ROM program
        IMPORT        |Image$$RW$$Base|        ; Pre-initialised variables
        IMPORT        |Image$$ZI$$Base|        ; uninitialised variables
        IMPORT        |Image$$ZI$$Limit|        ; End of variable RAM space


BaseOfROM        DCD        |Image$$RO$$Base|
TopOfROM        DCD        |Image$$RO$$Limit|
BaseOfBSS        DCD        |Image$$RW$$Base|
BaseOfZero        DCD        |Image$$ZI$$Base|
EndOfBSS        DCD        |Image$$ZI$$Limit|

        EXPORT        GetBaseOfROM
        EXPORT        GetEndOfROM
        EXPORT        GetBaseOfBSS
        EXPORT        GetBaseOfZero
        EXPORT        GetEndOfBSS
       
GetBaseOfROM
        ldr        r0, BaseOfROM
        mov        pc, lr       
GetEndOfROM
        ldr        r0, TopOfROM
        mov        pc,        lr
GetBaseOfBSS
        ldr        r0,        BaseOfBSS
        mov        pc,        lr
GetBaseOfZero
        ldr        r0,        BaseOfZero
        mov        pc,        lr
GetEndOfBSS
        ldr        r0,        EndOfBSS
        mov        pc,        lr
       
;***********************************************       
       
        END
 楼主| 发表于 2006-7-13 11:21:16 | 显示全部楼层
/*SysInit.s*/

        INCLUDE        inc\option.s
        INCLUDE        inc\memcfg.s
;****************************************************************************
;存储器空间
;GCS6 64M 16bit(8MB) DRAM/SDRAM(0xc000000-0xc7fffff)
;APP    RAM=0xc000000~0xc7effff
;44BMON RAM=0xc7f0000-0xc7fffff
;STACK           =0xc7ffa00                  

;****************************************************************************
;中断控制预定义
INTPND            EQU        0x01e00004
INTMOD            EQU        0x01e00008
INTMSK            EQU        0x01e0000c
I_ISPR            EQU        0x01e00020
I_CMST            EQU        0x01e0001c
I_ISPC        EQU        0x01e00024                       

;****************************************************************************
;看门狗定时器预定义
WTCON            EQU        0x01d30000

;****************************************************************************
;系统时钟预定义
PLLCON            EQU        0x01d80000
CLKCON            EQU        0x01d80004
LOCKTIME    EQU        0x01d8000c
       
;****************************************************************************
;存储器控制预定义
REFRESH            EQU 0x01c80024

;****************************************************************************
;BDMA目的寄存器
BDIDES0     EQU 0x1f80008
BDIDES1     EQU 0x1f80028

;****************************************************************************
;预定义常数(常量)
USERMODE    EQU        0x10
FIQMODE            EQU        0x11
IRQMODE            EQU        0x12
SVCMODE            EQU        0x13
ABORTMODE   EQU        0x17
UNDEFMODE   EQU        0x1b
MODEMASK    EQU        0x1f
NOINT            EQU        0xc0

;*****************************************************************        
   
    AREA    InitSystemBlk,        CODE,        READONLY                   

;*****************************************************************
;初始化程序开始

        EXPORT        InitSystem
InitSystem

;禁止看门狗       
        ldr        r0, =WTCON                       
        ldr        r1, =0                
        str        r1,[r0]
;禁止所有中断
        ldr            r0,=INTMSK
        ldr            r1,=0x07ffffff               
        str            r1,[r0]
;设定时钟控制寄存器
        ldr        r0, =LOCKTIME
        ldr        r1, =0xfff
        str        r1, [r0]

    ;[ PLLONSTART
        ldr        r0, =PLLCON                        ;锁相环倍频设定
        ldr        r1, =((M_DIV<<12)+(P_DIV<<4)+S_DIV)                ;设定系统主时钟频率, 倍频为((P_DIV+2)*(2的S_DIV次方))/(M_DIV+8)
        str        r1, [r0]
    ;]

        ldr        r0, =CLKCON                 
        ldr        r1, =0x7ff8            ;所有功能单元块时钟使能
        str        r1, [r0]
;****************************************************************************
;为BDMA改变BDMACON的复位值
        ldr        r0, =BDIDES0      
        ldr        r1, =0x40000000   ;BDIDESn reset value should be 0x40000000         
        str        r1, [r0]

        ldr        r0, =BDIDES1      
        ldr        r1, =0x40000000   ;BDIDESn reset value should be 0x40000000         
        str        r1, [r0]
;****************************************************
;设定存储器控制寄存器                       
        adr        r0, InitSystem
        ldr        r1, =InitSystem
        sub        r0, r1, r0               
        ldr        r1, =SMRDATA
        sub        r0, r1, r0
        ldmia   r0, {r1-r13}
        ldr            r0, =0x01c80000                        ;BWSCON Address
        stmia   r0, {r1-r13}       
;****************************************************       
;初始化堆栈
        ;Don't 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       
               
        orr        r1, r0, #SVCMODE|NOINT
        msr        cpsr_cxsf, r1                ;SVCMode
        ldr        sp, =SVCStack

        ;USER mode is not initialized.
       
;***********************************************
;设置IQR处理程序入口, 在配置好RAM后设置               
        ldr        r0, =IRQ_SVC_VECTOR       
        ldr        r1, =IRQ_SERVICE               
        str        r1, [r0]       
;***********************************************       
        mov        pc, lr                        ;返回                   
       
;*****************************************************************       
SMRDATA DATA
;*****************************************************************
;存储器最好配置成最优的性能,下面的参数不是最优化的
;*****************************************************************

;*** 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.

;bank0        16bit BOOT ROM
;bank1        8bit NandFlash
;bank2        16bit IDE
;bank3        rtl8019
;bank4       
;bank5        ext
;bank6        16bit SDRAM
;bank7        16bit SDRAM
;LZ44B0X        rtl8019 buswide = 16 !
    [ BUSWIDTH=16                       
        DCD 0x11110002        ;Bank0=16bit BootRom(AT29C010A*2) :0x0
    | ;BUSWIDTH=32
        DCD 0x22222220        ;Bank0=OM[1:0], Bank1~Bank7=32bit
    ]
       
        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
       
        [ BDRAMTYPE="DRAM"
        DCD         ((B6_MT<<15)+(B6_Trcd<<4)+(B6_Tcas<<3)+(B6_Tcp<<2)+(B6_CAN))        ;GCS6 check the MT value in parameter.a
        DCD         ((B7_MT<<15)+(B7_Trcd<<4)+(B7_Tcas<<3)+(B7_Tcp<<2)+(B7_CAN))        ;GCS7
        | ;"SDRAM"
        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         0x10                        ;SCLK power down mode, BANKSIZE 32M/32M
        DCD         0x20                        ;MRSR6 CL=2clk
        DCD         0x20                        ;MRSR7

        ALIGN       

;****************************************************
;本函数用来进入掉电模式
;****************************************************
;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
    ldr            r0,=0x10
0   subs    r0,r0,#1
    bne            %B0

;exit from DRAM/SDRAM self refresh mode.
    ldr            r0,=REFRESH
    str            r3,[r0]
    mov            pc,lr  
   
;*******************************************************
IRQ_SERVICE                                ;using I_ISPR register.                          
        IMPORT        pIrqStart
        IMPORT        pIrqFinish
        IMPORT        pIrqHandler       
                                                ;IMPORTANT CAUTION!!!
                                                ;if I_ISPC isn't used properly, I_ISPR can be 0 in this routine.
        ldr        r4, =I_ISPR
           ldr        r4, [r4]
        cmp        r4, #0x0                ;If the IDLE mode work-around is used, r0 may be 0 sometimes.
        beq        %F3               
       
        ldr        r5, =I_ISPC
           str        r4, [r5]                ;clear interrupt pending bit
           ldr        r5, =pIrqStart
           ldr        r5, [r5]
           cmp        r5, #0
           movne        lr, pc                ; .+8
           movne        pc, r5                                    
           
        mov        r0, #0x0       
0           
           movs        r4, r4, lsr #1
           bcs        %F1
           add        r0, r0, #1
           b            %B0
1
           ldr        r1, =pIrqHandler
           ldr        r1, [r1]
           cmp        r1, #0
           movne        lr, pc
           movne        pc, r1                                   
2       
        ldr        r0, =pIrqFinish
        ldr        r0, [r0]
        cmp        r0, #0
        movne        lr, pc                ; .+8
        movne        pc, r0
        cmp        r0, #0
        movne        lr, pc
        movne        pc, r0                                        
3       
        ldmfd        sp!, {r0}        ;从IRQ返回
        msr        spsr_cxsf, r0
        ldmfd        sp!, {r0-r12, pc}^       
       
;***********************************************
        EXPORT        IrqHandlerTab
IrqHandlerTab        DCD        HandleADC

;***********************************************

        AREA RamData, DATA, READWRITE       

        ^        (_ISR_STARTADDRESS-0x500)                               
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


        MAP        _ISR_STARTADDRESS
SYS_RST_VECTOR        #        4       
UDF_INS_VECTOR        #        4       
SWI_SVC_VECTOR        #        4
INS_ABT_VECTOR        #        4
DAT_ABT_VECTOR        #        4
RESERVED_VECTOR        #        4
IRQ_SVC_VECTOR        #        4
FIQ_SVC_VECTOR        #        4
        EXPORT        SYS_RST_VECTOR
        EXPORT        UDF_INS_VECTOR
        EXPORT        SWI_SVC_VECTOR
        EXPORT        INS_ABT_VECTOR
        EXPORT        DAT_ABT_VECTOR
        EXPORT        RESERVED_VECTOR
        EXPORT        IRQ_SVC_VECTOR
        EXPORT        FIQ_SVC_VECTOR

;Don't use the label 'IntVectorTable',
;because armasm.exe cann't 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
 楼主| 发表于 2006-7-13 11:23:44 | 显示全部楼层
/*44BINIT.S*/

   INCLUDE ..\inc\option.inc
    INCLUDE ..\inc\memcfg.inc

;Memory Area
;GCS6 16M 16bit(2MB) DRAM/SDRAM(0xc000000-0xc7fffff)
;APP    RAM=0xc000000~0xc1effff
;44BMON RAM=0xc7f0000-0xc7fffff
;STACK           =0xc7ffa00                  

;Interrupt Control
INTPND            EQU        0x01e00004
INTMOD            EQU        0x01e00008
INTMSK            EQU        0x01e0000c
I_ISPR            EQU        0x01e00020
I_CMST            EQU        0x01e0001c

;Watchdog timer
WTCON            EQU        0x01d30000

;Clock Controller
PLLCON            EQU        0x01d80000
CLKCON            EQU        0x01d80004
LOCKTIME    EQU        0x01d8000c
       
;Memory Controller
REFRESH            EQU 0x01c80024

;BDMA destination register
BDIDES0                EQU 0x1f80008
BDIDES1                EQU 0x1f80028

re-defined constants
USERMODE    EQU        0x10
FIQMODE            EQU        0x11
IRQMODE            EQU        0x12
SVCMODE            EQU        0x13
ABORTMODE   EQU        0x17
UNDEFMODE   EQU        0x1b
MODEMASK    EQU        0x1f
NOINT            EQU        0xc0

;check if tasm.exe is used.
        GBLL    THUMBCODE
        [ {CONFIG} = 16       
THUMBCODE SETL        {TRUE}
                CODE32
        |   
THUMBCODE SETL        {FALSE}
        ]

        [ THUMBCODE
                CODE32   ;for start-up code for Thumb mode
        ]

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Vector Macro;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    MACRO
$HandlerLabel HANDLER $HandleLabel

$HandlerLabel
    sub            sp,sp,#4                        ;decrement sp(to store jump address)
    stmfd   sp!,{r0}                        USH the work register to stack(lr does't push because it return to original address)
    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
    ldmfd   sp!,{r0,pc}                        OP the work register and pc(jump to ISR)
    MEND
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Code Begin;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    AREA    Init,CODE,READONLY

    ENTRY
    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                                                                       ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;中断向量表
VECTOR_BRANCH
    ldr pc,=HandlerEINT0        ;mGA        0x20
    ldr pc,=HandlerEINT1        ;       
    ldr pc,=HandlerEINT2        ;
    ldr pc,=HandlerEINT3        ;
    ldr pc,=HandlerEINT4567        ;
    ldr pc,=HandlerTICK                ;mGA        0x34
        b .
        b .
    ldr pc,=HandlerZDMA0        ;mGB        0x40
    ldr pc,=HandlerZDMA1        ;
    ldr pc,=HandlerBDMA0        ;
    ldr pc,=HandlerBDMA1        ;
    ldr pc,=HandlerWDT                ;
    ldr pc,=HandlerUERR01        ;mGB        0x54
    b .
    b .
    ldr pc,=HandlerTIMER0        ;mGC        0x60
    ldr pc,=HandlerTIMER1        ;
    ldr pc,=HandlerTIMER2        ;
    ldr pc,=HandlerTIMER3        ;
    ldr pc,=HandlerTIMER4        ;
    ldr pc,=HandlerTIMER5        ;mGC        0x74
    b .
    b .
    ldr pc,=HandlerURXD0        ;mGD        0x80
    ldr pc,=HandlerURXD1        ;
    ldr pc,=HandlerIIC                ;
    ldr pc,=HandlerSIO                ;
    ldr pc,=HandlerUTXD0        ;
    ldr pc,=HandlerUTXD1        ;mGD        0x94
    b .
    b .
    ldr pc,=HandlerRTC                ;mGKA        0xa0
    b .
    b .
    b .
    b .
    b .                                                ;mGKA
    b .
    b .
    ldr pc,=HandlerADC            ;mGKB        0xc0
    b .                                                ;
    b .                                                ;
    b .                                                ;
    b .                                                ;
    b .                                                ;mGKB
    b .
    b .
    ldr pc,=EnterPWDN                ;0xe0=EnterPWDN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;向量中断的处理方法                                                                                             ;
;Example: HandlerADC        HANDLE HandleADC 解为                                                                                                                        ;
;HandlerADC                                                ;HandlerADC为中断向量表的入口                                                                                                ;
;   sub            sp,sp,#4                        ;将sp减少一个字节,使其在堆栈高端留出存储返回地址,因为pc在寄存器组中的                        ;
;                                                                ;的位置大于r0,出栈时装入的是栈的高端的内容                                                                        ;
;   stmfd   sp!,{r0}                        ;保存r0                                                                                                                                        ;
;   ldr            r0,=HandleADC                ;装载中断处理函数的指针                                                                                                        ;
;   ldr            r0,[r0]                                ;装载中断处理函数的地址                                                                                                        ;
;   str            r0,[sp,#4]                        ;将中断处理函数的地址存入刚才预留的位置,r0的上面                                                                ;
;   ldmfd   sp!,{r0,pc}                        ;出栈后,pc指向的既是中断处理函数的地址                                                                                 ;
;                                                                                                       ;
;        INTCON^2 == 0时,vector table使能                                                                                                                                                ;
;        发生中断->HandlerADC->HandleADC(pISR_ADC,即:_ISR_STARTADDRESS+0x20);                                                                        ;                          
;        若要在程序中处理此中断,只要将中断服务函数的指针赋给pISR_ADC,如:pISR_ADC = (int)ADCIsr                          ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    LTORG       

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


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;非向量中断的处理                                                                                                                                                                                  ;
;如果I_ISPC的使用不正确,此时I_ISPR可能为零                                                                                                                              ;
;堆栈内容的变化                                                                                                                                                                                          ;
;                                                                                                       ;
;H        sp        |--|                |--|                |--|                |--|         sp        |--|                                            ;
;                |  |         sp        |  |                 |  |                 |ad|->pc        |  |                                            ;
;                |  |            |  |                |r9|                |r9|->r9        |  |                                            ;
;L                |  |            |  |         sp |r8|         sp        |r8|->r8        |  |                                            ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IsrIRQ                                                        ;using I_ISPR register.
    sub            sp,sp,#4                        ;预留返回指针的存储位置
    stmfd   sp!,{r8-r9}   

    ldr            r9,=I_ISPR
    ldr            r9,[r9]                                ;载入I_ISPR

        cmp                r9, #0x0                        ;If the IDLE mode work-around is used,r9 may be 0 sometimes.
        beq                %F2                                        ;无可处理中断,返回

    mov            r8,#0x0                                ;r8为偏移量,清零

0
    movs    r9,r9,lsr #1                ;从右向左逐位检验
    bcs            %F1
    add            r8,r8,#4                        ;偏移量累加
    b            %B0                               

1
    ldr            r9,=HandleADC                ;中断处理表的首址
    add            r9,r9,r8                        ;计算中断处理表的入口地址 r9+r8,即装载中断处理函数的指针
    ldr            r9,[r9]                                ;装载中断处理函数的地址
    str            r9,[sp,#8]                        ;将中断处理函数的地址存入刚才预留的位置,r8和r9的上面
    ldmfd   sp!,{r8-r9,pc}                ;出栈后,pc指向的既是中断处理函数的地址

2
        ldmfd        sp!,{r8-r9}                        ;恢复r8,r9
        add                sp,sp,#4                        ;恢复栈指针
        subs        pc,lr,#4                        ;返回

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;复位中断处理函数                                                                                                                                                                                        ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ResetHandler
    ldr            r0,=WTCON                    ;禁止看门狗
    ldr            r1,=0x0               
    str            r1,[r0]

    ldr            r0,=INTMSK
    ldr            r1,=0x07ffffff          ;禁止所有中断
    str            r1,[r0]

    ;以下三段设置时钟控制寄存器
   
    ldr        r0,=LOCKTIME
    ldr        r1,=0xfff                       
    str        r1,[r0]

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

    ldr            r0,=CLKCON                 
    ldr            r1,=0x7ff8                    ;All unit block CLK enable       
    str            r1,[r0]
       
        ;****************************************************
        ;change BDMACON reset value for BDMA                *
        ;****************************************************

    ldr     r0,=BDIDES0      
    ldr     r1,=0x40000000                ;BDIDESn reset value should be 0x40000000         
    str     r1,[r0]

    ldr     r0,=BDIDES1      
    ldr     r1,=0x40000000                ;BDIDESn reset value should be 0x40000000         
    str     r1,[r0]

    ;****************************************************
    ;设定存储器控制寄存器                                                    *        
    ;****************************************************
    ldr            r0,=SMRDATA
    ldmia   r0,{r1-r13}
    ldr            r0,=0x01c80000                ;BWSCON Address
    stmia   r0,{r1-r13}
 楼主| 发表于 2006-7-13 11:24:06 | 显示全部楼层
;****************************************************
    ;初始化堆栈                                                                      *
    ;****************************************************
    ldr            sp, =SVCStack                ;复位后位SVC模式
    bl            InitStacks

    ;****************************************************
    ;设置中断处理                                                                        *
    ;****************************************************
    ldr            r0,=HandleIRQ                ;This routine is needed
    ldr            r1,=IsrIRQ                        ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c
    str            r1,[r0]

    ;****************************************************
    ;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
                       
    CMP            r0, r1                            ; Check that they are different
    BEQ            %F1
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            %B0
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            %B2

    [ NOT:THUMBCODE
                bl        Main                            ;Don't use main() because ......
                b        .                                               
    ]

    [ THUMBCODE                                    ;for start-up code for Thumb mode
                orr        lr,pc,#1
                bx        lr
                CODE16
                bl        Main                    ;Don't use main() because ......
                b        .
                CODE32
    ]

;****************************************************
;*        The function for initializing stack                                *
;****************************************************
InitStacks
        ;Don't 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.

;****************************************************
;*        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            %B0

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

    LTORG

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.

    [ BUSWIDTH=16
                DCD 0x11111001        ;Bank0=OM[1:0], Bank1~Bank7=16bit
    | ;BUSWIDTH=32
                DCD 0x22222220        ;Bank0=OM[1:0], Bank1~Bank7=32bit
    ]
        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
        [ BDRAMTYPE="DRAM"
            DCD ((B6_MT<<15)+(B6_Trcd<<4)+(B6_Tcas<<3)+(B6_Tcp<<2)+(B6_CAN))        ;GCS6 check the MT value in parameter.a
            DCD ((B7_MT<<15)+(B7_Trcd<<4)+(B7_Tcas<<3)+(B7_Tcp<<2)+(B7_CAN))        ;GCS7
        | ;"SDRAM"
                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 0x10                        ;SCLK power down mode, BANKSIZE 32M/32M
        DCD 0x20                        ;MRSR6 CL=2clk
        DCD 0x20                        ;MRSR7

        ALIGN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;RW BEGIN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        AREA RamData, DATA, READWRITE

        ^        (_ISR_STARTADDRESS-0x500)
                               
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


                ^        _ISR_STARTADDRESS
HandleReset                #        4
HandleUndef                #        4
HandleSWI                #        4
HandlePabort        #        4
HandleDabort        #        4
HandleReserved        #        4
HandleIRQ                #        4
HandleFIQ                #        4

;Don't use the label 'IntVectorTable',
;because armasm.exe cann't 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
 楼主| 发表于 2006-7-13 11:25:49 | 显示全部楼层
希望各位朋友能够指点一下!谢谢了:)
发表于 2006-7-23 01:31:49 | 显示全部楼层
强!!!!!!!!!!!!!!!!!!!!1
发表于 2006-7-27 16:44:48 | 显示全部楼层
没有人说呢?这个不是网上的源码还是搂住自己写的?
发表于 2006-8-21 08:52:18 | 显示全部楼层
厉害 !!!!!!!!!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-23 23:59 , Processed in 0.045583 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表