⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 startup.s

📁 周立功ARM9 2410试验平台的uCOS-II基础实验代码
💻 S
📖 第 1 页 / 共 2 页
字号:
; 快速中断
FIQ_Handler
        STMFD   SP!, {R0-R3, LR}        
        ; /* FIQ中断处理 */        
        LDMFD   SP!, {R0-R3, LR}
        SUBS    PC,  LR,  #4                
                
        
        
;/*********************************************************************************************************
;** 函数名称: Reset
;** 功能描述: 复位入口
;** 输 入: 无
;** 输 出: 无
;********************************************************************************************************/
ResetInit
        BL      TargetInitReset         ; 针对目标板的系统初始化        
        BL      EnableICache
        BL      InitStack               ; 初始化堆栈                                              
        BL      Remap                   ; 重映射操作
        B       __main                  ; 跳转到c语言入口  


;/*********************************************************************************************************
;** 函数名称: Remap
;** 功能描述: 重映射向量表操作。
;** 输 入: 无
;** 输 出: 无
;** 说明:将向量表复制到0x0000000地址,所以要求系统为NAND Flash启动方式。
;**       占用R0--R9寄存器。
;********************************************************************************************************/ 
Remap
    IF :DEF: Release
        MOV     PC, LR
    ELSE        
        MOV     R0, #0x00000000
        LDR     R1, =Reset
        LDMIA   R1!, {R2-R9}
        STMIA   R0!, {R2-R9}
        LDMIA   R1!, {R2-R9}
        STMIA   R0!, {R2-R9}     
        MOV     PC, LR
    ENDIF       
 
;/*********************************************************************************************************
;** 函数名称: TargetInitReset
;** 功能描述: 针对目标板的系统初始化,包括WDT、中断、PLL、SDRAM控制器等等。
;** 输 入: 无
;** 输 出: 无
;** 说明:占用R0--R8寄存器
;********************************************************************************************************/ 
TargetInitReset
        LDR     R0, =WTCON                  ; 关闭WDT 
        LDR     R1, =0x0000         
        STR     R1,[R0]                     ; WTCON=0x0000

        LDR     R0, =INTMSK                 ; 禁止所有中断 (中断控制器)
        LDR     R1, =0xFFFFFFFF  
        STR     R1, [R0]                    ; INTMSK=0xFFFFFFFF

        LDR     R0, =INTSUBMSK
        LDR     R1, =0x07FF                 ; INTSUBMSK=0x07FF
        STR     R1, [R0]
        
        LDR     R0, =SRCPND                 ; 清除中断标志 (add)
        LDR     R1, =0xFFFFFFFF
        STR     R1, [R0]
        
        LDR     R0, =INTPND      
        LDR     R1, =0xFFFFFFFF  
        STR     R1, [R0]
        
    IF :DEF: Release    
        ; 系统时钟设置,启用PLL
        LDR     R0, =LOCKTIME
        LDR     R1, =0x00FFFFFF             ; 锁定时间设置U_LTIME=0xFFF,M_LTIME=0xFFF
        STR     R1, [R0]
        
        LDR     R0, =CLKDIVN     
        MOV     R1, #0x03                   ; HCLK=FCLK/2,PCLK=HCLK/2
        STR     R1, [R0]             
        
        MRC     p15, 0, R1, c1, c0, 0       ; (MMU设置) 读控制寄存器 
        ORR     R1, R1, #0xC0000000   
        MRC     p15, 0, R1, c1, c0, 0    

        LDR     R0, =MPLLCON     
        LDR     R1, =MPLLCON_200            ; 设置CPU时钟为200Mhz (FCLK)
        STR     R1, [R0]                             
            
        ; 总线设置,初始化SDRAM
        LDR     R0, =BUS_INIT
        LDR     R1, =BWSCON
        LDMIA   R0!, {R2-R8}
        STMIA   R1!, {R2-R8}
        LDMIA   R0!, {R2-R7}
        STMIA   R1!, {R2-R7}         
    ENDIF                                           
    
        MOV     PC, LR               ; 返回

;/*********************************************************************************************************
;** 函数名称: DisableMMU
;** 功能描述: 禁止MMU
;** 输 入: 无
;**
;** 输 出: 无
;**         
;** 全局变量: 无
;** 调用模块: 无
;**
;** 作 者: 黄绍斌
;** 日 期: 2005年11月30日
;**-------------------------------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/ 
DisableMMU
        MRC     p15,0,R0,c1,c0,0
        BIC     R0,R0,#(1<<0)
        MCR     p15,0,R0,c1,c0,0
        MOV     PC, LR
        

;/*********************************************************************************************************
;** 函数名称: EnableICache
;** 功能描述: 使能指令CACHE
;** 输 入: 无
;**
;** 输 出: 无
;**         
;** 全局变量: 无
;** 调用模块: 无
;**
;** 作 者: 黄绍斌
;** 日 期: 2005年11月30日
;**-------------------------------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/ 
EnableICache        
        MRC     p15,0,R0,c1,c0,0
        ORR     r0,R0,#(1<<12)
        MCR     p15,0,R0,c1,c0,0
        MOV     PC, LR
        

;/*********************************************************************************************************
;** 函数名称: DisableICache
;** 功能描述: 禁止指令CACHE
;** 输 入: 无
;**
;** 输 出: 无
;**         
;** 全局变量: 无
;** 调用模块: 无
;**
;** 作 者: 黄绍斌
;** 日 期: 2005年11月30日
;**-------------------------------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
DisableICache       
        MRC     p15,0,R0,c1,c0,0
        BIC     R0,R0,#(1<<12)
        MCR     p15,0,R0,c1,c0,0
        MOV     PC, LR
   
   
;/*********************************************************************************************************
;** 函数名称: EnableDCache
;** 功能描述: 使能数据CACHE
;** 输 入: 无
;**
;** 输 出: 无
;**         
;** 全局变量: 无
;** 调用模块: 无
;**
;** 作 者: 黄绍斌
;** 日 期: 2005年11月30日
;**-------------------------------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
EnableDCache        
        MRC     p15,0,R0,c1,c0,0
        ORR     R0,R0,#(1<<2)
        MCR     p15,0,R0,c1,c0,0
        MOV     PC, LR

;/*********************************************************************************************************
;** 函数名称: DisableDCache
;** 功能描述: 禁止数据CACHE
;** 输 入: 无
;**
;** 输 出: 无
;**         
;** 全局变量: 无
;** 调用模块: 无
;**
;** 作 者: 黄绍斌
;** 日 期: 2005年11月30日
;**-------------------------------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
DisableDCache       
        MRC     p15,0,R0,c1,c0,0
        BIC     R0,R0,#(1<<2)
        MCR     p15,0,R0,c1,c0,0
        MOV     PC,LR
        
; 总线配置数据表        
BUS_INIT    DCD (B7_BWCON<<28)|(B6_BWCON<<24)|(B5_BWCON<<20)|(B4_BWCON<<16)|(B3_BWCON<<12)|(B2_BWCON<<8)|(B1_BWCON<<4)  ; BWSCON寄存器
            DCD (1<<13)|(1<<11)|(7<<8)|(1<<6)|(1<<4)|(1<<2)|(0<<0)          ; BANKCON0寄存器
            DCD (1<<13)|(1<<11)|(7<<8)|(1<<6)|(1<<4)|(1<<2)|(0<<0)          ; BANKCON1寄存器    
            DCD (1<<13)|(1<<11)|(7<<8)|(1<<6)|(1<<4)|(1<<2)|(0<<0)          ; BANKCON2寄存器
            DCD (1<<13)|(1<<11)|(7<<8)|(1<<6)|(1<<4)|(1<<2)|(0<<0)          ; BANKCON3寄存器
            DCD (1<<13)|(1<<11)|(7<<8)|(1<<6)|(1<<4)|(1<<2)|(0<<0)          ; BANKCON4寄存器
            DCD (1<<13)|(1<<11)|(7<<8)|(1<<6)|(1<<4)|(1<<2)|(0<<0)          ; BANKCON5寄存器
            DCD 0x00018001  ; (3<<15)|(1<<2)|(1<<0)                                       ; BANKCON6寄存器 (SDRAM)
            DCD 0x00018001  ; (0<<15)|(1<<13)|(1<<11)|(7<<8)|(1<<6)|(1<<4)|(1<<2)|(0<<0)  ; BANKCON7寄存器 (SRAM)
            DCD 0x008e01e9  ; (1<<23)|(0<<22)|(0<<20)|(3<<18)|(1113)                      ; REFRESH寄存器(SDRAM) ,period=15.6us, HCLK=60Mhz, (2048+1-15.6*60)
            DCD (1<<7)|(1<<5)|(1<<4)|(2<<0)                                 ; BANKSIZE寄存器,128MB
            DCD 0x20        ; (3<<4)                                                      ; MRSRB6寄存器
            DCD 0x20        ; (3<<4)                                                      ; MRSRB7寄存器
               
               
;/*********************************************************************************************************
;** 函数名称: InitStack
;** 功能描述: 初始化堆栈。最后返回时,处理器工作在系统模式。
;** 输 入:   无
;** 输 出:   无
;** 说  明:   由本文件开头的USR_STACK_LEGTH、SVC_STACK_LEGTH等定义各工作模式的堆栈大小。
;********************************************************************************************************/
InitStack    
        MOV     R0, LR

;设置管理模式堆栈
        MSR     CPSR_c, #(Mode_SVC | I_BIT | F_BIT)     ; 0xd3
        LDR     SP, StackSvc
;设置中断模式堆栈
        MSR     CPSR_c, #(Mode_IRQ | I_BIT | F_BIT)     ; 0xd2
        LDR     SP, StackIrq
;设置快速中断模式堆栈
        MSR     CPSR_c, #(Mode_FIQ | I_BIT | F_BIT)     ; 0xd1
        LDR     SP, StackFiq
;设置中止模式堆栈
        MSR     CPSR_c, #(Mode_ABT | I_BIT | F_BIT)     ; 0xd7
        LDR     SP, StackAbt
;设置未定义模式堆栈
        MSR     CPSR_c, #(Mode_UND | I_BIT | F_BIT)     ; 0xdb
        LDR     SP, StackUnd
;设置系统模式堆栈
        MSR     CPSR_c, #(Mode_SYS | I_BIT | F_BIT)     ; 0xdf
        LDR     SP, =StackUsr

        MOV     PC, R0

StackSvc           DCD     SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4
StackIrq           DCD     IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4
StackFiq           DCD     FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4
StackAbt           DCD     AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4
StackUnd           DCD     UndtStackSpace + (UND_STACK_LEGTH - 1)* 4

    
;/*********************************************************************************************************
;** 函数名称: __user_initial_stackheap 
;** 功能描述: 库函数初始化堆和栈,不能删除
;** 输 入: 参考库函数手册
;** 输 出: 参考库函数手册
;********************************************************************************************************/
__user_initial_stackheap    
    LDR   R0, =bottom_of_heap
;    LDR   R1, =StackUsr
    LDR   R2, =StackUsr
    LDR   R3, =bottom_of_heap
    MOV   PC, LR

; /* 分配堆栈空间 */
        AREA    MyStacks, DATA, NOINIT, ALIGN=2
SvcStackSpace      SPACE   SVC_STACK_LEGTH * 4  ;管理模式堆栈空间
IrqStackSpace      SPACE   IRQ_STACK_LEGTH * 4  ;中断模式堆栈空间
FiqStackSpace      SPACE   FIQ_STACK_LEGTH * 4  ;快速中断模式堆栈空间
AbtStackSpace      SPACE   ABT_STACK_LEGTH * 4  ;中止义模式堆栈空间
UndtStackSpace     SPACE   UND_STACK_LEGTH * 4  ;未定义模式堆栈

; /* IRQ中断向量地址表定义 */
VICVectAddr        SPACE   32*4  

        AREA    Heap, DATA, NOINIT
bottom_of_heap    SPACE   1

        AREA    Stacks, DATA, NOINIT
StackUsr
        END
;/*********************************************************************************************************
;**                            End Of File
;********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -