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

📄 startup.s

📁 经过检验的4510B的BOOT启动代码
💻 S
字号:
;******************************************************************************
; File:         startup.s
; Discription:  Startup code 
; Copyright:    
; Author:       houwb
;******************************************************************************

        IMPORT  |Image$$RO$$Base|    
        IMPORT  |Image$$RO$$Limit|   
        IMPORT  |Image$$RW$$Base|   
        IMPORT  |Image$$RW$$Limit|
        IMPORT  |Image$$ZI$$Base|   
        IMPORT  |Image$$ZI$$Limit|

        IMPORT  sys_init
        IMPORT  shell
        IMPORT  __main
        
        IMPORT  OS_CPU_IRQ_ISR
        IMPORT  OS_CPU_FIQ_ISR
        
        IMPORT  do_irq
        IMPORT  do_fiq   
        
;******************************************************************************       
; Vector Table
;******************************************************************************
        CODE32
        AREA    STARTUP,CODE,READONLY
        
        GET     settings.s                      ;Get system default settings
        
        ENTRY
start
        LDR     PC, reset_entry
        LDR     PC, undefined_entry
        LDR     PC, swi_entry
        LDR     PC, prefetch_abort_entry
        LDR     PC, data_abort_entry
        NOP
        LDR     PC, irq_entry
        LDR     PC, fiq_entry

reset_entry             DCD     sys_reset
undefined_entry         DCD     undefined
swi_entry               DCD     software_interrupt
prefetch_abort_entry    DCD     prefetch_abort
data_abort_entry        DCD     data_abort
no_use                  DCD     0
irq_entry               DCD     OS_CPU_IRQ_ISR          ;irq_handler
fiq_entry               DCD     OS_CPU_FIQ_ISR          ;fiq_handler



;******************************************************************************       
; Exception handler        
;******************************************************************************
undefined
        B       undefined
        
software_interrupt
        B       software_interrupt

prefetch_abort
        B       prefetch_abort

data_abort
        B       data_abort
        
        

;******************************************************************************       
; Interrupt handler  
; Note: not used in ucos mode      
;******************************************************************************        
irq_handler
        STMFD   SP!, {R0-R3, R12, LR}
        BL      do_irq
        LDMFD   SP!, {R0-R3, R12, LR}
        SUBS    PC, LR, #4

fiq_handler
        STMFD   SP!, {R0-R3, R12, LR}
        BL      do_fiq
        LDMFD   SP!, {R0-R3, R12, LR}
        SUBS    PC, LR, #4
        
        
        
        
;******************************************************************************
; Function:     sys_reset
; Discription:  reset the value of the system
;               manager registers and init stack
; Entry:        none
; Return:       none
;******************************************************************************     

sys_reset


;******************************************************************************        
;disable all interrupts

        MSR     CPSR_c, #MOD_SVC:OR:BIT_I:OR:BIT_F      ;Disable all interrupts
        
        LDR     r2, =aINTMSK                            ;R2->interrupt controller
        MVN     R1, #0                                  ;&FFFFFFFF
        STR     R1, [R2]                                ;disable all interrupt soucres

        LDR     R2, =aINTPND                            ;R2->interrupt pend register.
        MVN     R1, #0                                  ;&FFFFFFFF
        STR     R1, [R2]
        
;******************************************************************************         
;Initialize sys config registers
        
        LDR     R0, =aSYSCFG
        LDR     R1, =vSYSCFG
        STR     R1, [R0, #0]
        
        LDR     R0, =aEXTACON0
        LDR     R1, =vEXTACON0
        STR     R1, [R0, #0]
        
        LDR     R0, =aEXTACON1
        LDR     R1, =vEXTACON1
        STR     R1, [R0, #0]
        
        
;******************************************************************************
;Initalize the memory as follows:
;       FLASH           @ 0x000000  ~ 0x080000
;       SDRAM           @ 0x080000  ~ 0x480000


        LDR     R0, =aEXTDBWTH
        LDR     R1, =vEXTDBWTH
        LDR     R2, =vROMCON0
        LDR     R3, =vROMCON1
        LDR     R4, =vROMCON2
        LDR     R5, =vROMCON3
        LDR     R6, =vROMCON4
        LDR     R7, =vROMCON5
        LDR     R8, =vDRAMCON0
        LDR     R9, =vDRAMCON1
        LDR     R10, =vDRAMCON2
        LDR     R11, =vDRAMCON3
        LDR     R12, =vREFEXTCON
        
        ;STMIA   R0, {R1-R12}
        
;******************************************************************************        
;copy flash to sdram  
        
        LDR     R0, =|Image$$RO$$Base|
        LDR     R1, =|Image$$RO$$Limit| 
        LDR     R2, =|Image$$RW$$Base|
        LDR     R3, =|Image$$ZI$$Base|
        
        SUB     R1, R1, R0
        SUB     R3, R3, R2
        
        ADD     R2, R1, R3                              ;IMAGE SIZE    
        LDR     R1, =(DRAMBase_DRC0:SHL:6)              ;SDRAM BASE        

0        
        ;LDR     R3, [R0], #4
        ;STR     R3, [R1], #4
        ;SUBS    R2, R2, #4
        ;BNE     %B0
        
;******************************************************************************
;Remap the memory
;       FLASH           @ 0x400000 ~ 0x480000 
;       SDRAM           @ 0x000000 ~ 0x400000   
        

        LDR     R0, =aEXTDBWTH
        LDR     R1, =vEXTDBWTH
        LDR     R2, =vROMCON0_REMAP
        LDR     R3, =vROMCON1_REMAP
        LDR     R4, =vROMCON2_REMAP
        LDR     R5, =vROMCON3_REMAP
        LDR     R6, =vROMCON4_REMAP
        LDR     R7, =vROMCON5_REMAP
        LDR     R8, =vDRAMCON0_REMAP
        LDR     R9, =vDRAMCON1_REMAP
        LDR     R10, =vDRAMCON2_REMAP
        LDR     R11, =vDRAMCON3_REMAP
        LDR     R12, =vREFEXTCON
        
        STMIA   R0, {R1-R12}
        
;******************************************************************************
; Initialize Stacks

        BL      init_stack  
        
;******************************************************************************
; Copy RW & ZI to SDRAM

        LDR     R0, =|Image$$RO$$Limit|         
        LDR     R1, =|Image$$RW$$Base|          
        LDR     R3, =|Image$$ZI$$Base|          

        CMP     R0, R1 
        BEQ     %F2
 
1       CMP     R1, R3                          ; Copy init data
        LDRCC   R2, [R0], #4
        STRCC   R2, [R1], #4
        BCC     %B1

2       LDR     R1, =|Image$$ZI$$Limit|         ; Top of zero init segment
        MOV     R2, #0

3       CMP     R3, R1                          ; Zero init
        STRCC   R2, [R3], #4
        BCC     %B3
        

;******************************************************************************
; Goto C Code
        
        BL      sys_init 
        BL      shell  
        BL      __main
        B       .       
        
             

;******************************************************************************
; Function:     init_stack
; Discription:  Initialize stack
; Entry:        none
; Return:       none 
;******************************************************************************
      
init_stack    
        MOV     R0, LR
        
        LDR     R1, =|Image$$ZI$$Limit|        
        
;setup irq mode stack
        MSR     CPSR_c, #MOD_IRQ:OR:BIT_I:OR:BIT_F      ;disable interrupt
        ADD     R1, R1, #IRQ_STACK_SIZE
        BIC     R1, R1, #0x03
        MOV     SP, R1
        
;setup fiq mode stack
        MSR     CPSR_c, #MOD_FIQ:OR:BIT_I:OR:BIT_F
        ADD     R1, R1, #FIQ_STACK_SIZE
        BIC     R1, R1, #0x03
        MOV     SP, R1
        
;setup abt mode stack
        MSR     CPSR_c, #MOD_ABT:OR:BIT_I:OR:BIT_F
        ADD     R1, R1, #ABT_STACK_SIZE
        BIC     R1, R1, #0x03
        MOV     SP, R1
        
;setup und mode stack
        MSR     CPSR_c, #MOD_UND:OR:BIT_I:OR:BIT_F
        ADD     R1, R1, #UND_STACK_SIZE
        BIC     R1, R1, #0x03
        MOV     SP, R1
        
;setup usr mode stack
        MSR     CPSR_c, #MOD_SYS:OR:BIT_I:OR:BIT_F
        ADD     R1, R1, #USR_STACK_SIZE
        BIC     R1, R1, #0x03
        MOV     SP, R1
        
;setup svc mode stack
        MSR     CPSR_c, #MOD_SVC:OR:BIT_I:OR:BIT_F 
        ADD     R1, R1, #SVC_STACK_SIZE
        BIC     R1, R1, #0x03
        MOV     SP, R1
        
        ;MSR     CPSR_c, #MOD_SYS                        ;enable interrupt
        
        MOV     PC, R0
        
;******************************************************************************        
        
        END

⌨️ 快捷键说明

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