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

📄 samboot.s

📁 S64和VS1003的MP3播放实现的源代码/
💻 S
字号:
;/****************************************************************************************************************/
;/********************* Startup code for AT91SAM7S ***************************************************************/
;/ hotislandn@hotmail.com                                                                                         /
;/ WWW.MCUZONE.COM 
;/
;/ Rev 0.3                                                                                              /
;/****************************************************************************************************************/

MODUSR    EQU    0x10
MODSYS    EQU    0x1F 
MODSVC    EQU    0x13
MODABT    EQU    0x17
MODUDF    EQU    0x1B
MODIRQ    EQU    0x12
MODFIQ    EQU    0x11

IRQBIT    EQU    0x80 
FIQBIT    EQU    0x40

RAMBASE   EQU    0x00200000  ; AT SAM series, internal RAM base

RAMLEN    EQU    0x00002000  ; S32 : 8KB RAM
;RAMLEN    EQU    0x00204000  ; S64 : 16KB RAM

;/****************************************************************************************************************/
; Reserved RAM area
; If modified, the scatter load file also need to be updated!
; 1
; RAM vect size (768B)
; Include  vectors and RAM code
VECTSIZE  EQU    0x300       ; 驻留RAM的代码区域定为0x300字节

; 2
; Stack (1KB + 768B)
SvcStkSz    EQU   1024       ; size of  SVC  stack
FiqStkSz    EQU   128        ; size of  FIQ  stack
IrqStkSz    EQU   256        ; size of  IRQ  stack
UdfStkSz    EQU   16         ; size of  UDF  stack
AbtStkSz    EQU   96         ; size of  ABT  stack
UsrStkSz    EQU   16         ; size of  USR  stack
SysStkSz    EQU   128        ; size of  SYS  stack

;/****************************************************************************************************************/
; startup code

      EXPORT RESET  
      EXPORT SYSINIT 
 
      EXPORT DABTHANDLER
;/***********************************************************************/
      PRESERVE8
      AREA  START, CODE, READONLY
      CODE32
      
      ENTRY         
RESET
        LDR    PC,=SYSINIT         ; Reset
        B      UDFHANDLER          ; UNDEFINED
        LDR    PC,SWIHANDLER       ; SWI
        B      PABTHANDLER         ; PREFETCH ABORT
        B      DABTHANDLER         ; DATA ABORT
        B      .                   ; RESERVED  
        LDR    PC,_OS_CPU_IRQ_ISR  ; IRQ
        LDR    PC,_OS_CPU_FIQ_ISR  ; FIQ

        ;EXTERN vPortPreemptiveTick
        ;EXTERN OS_CPU_FIQ_ISR
        IMPORT CPU_IRQ_ISR
_OS_CPU_IRQ_ISR
        ;DCD    vPortPreemptiveTick
        DCD    CPU_IRQ_ISR
        B      .
_OS_CPU_FIQ_ISR
        ;DCD    vPortPreemptiveTick
        B      .
		       			
UDFHANDLER
        B      .

        ;EXTERN vPortYieldProcessor
SWIHANDLER
        ;DCD    vPortYieldProcessor
        B      .

PABTHANDLER
        STR    R14, [SP]  ; keep the abort program point in Abort Stack(do not change SP_abt)

        ; return to the original mode
        MRS    R14, SPSR  
        ; disable all interrupts
        ORR    R14, R14, #(IRQBIT :OR: FIQBIT) 
        MSR    CPSR_cxsf, R14
        ; check all the original mode's registers 
        ; the abort point can be calculated use the LR_abt in Abort Stack
        ; check MC_ASR [0xFFFFFF04] & MC_AASR [0xFFFFFF08]

        B      .

DABTHANDLER
        STR    R14, [SP]  ; keep the abort program point in Abort Stack(do not change SP_abt)

        ; return to the original mode
        MRS    R14, SPSR  
        ; disable all interrupts
        ORR    R14, R14, #(IRQBIT :OR: FIQBIT) 
        MSR    CPSR_cxsf, R14
        ; check all the original mode's registers 
        ; the abort point can be calculated use the LR_abt in Abort Stack
        ; check MC_ASR [0xFFFFFF04] & MC_AASR [0xFFFFFF08]

        B      .
	
	
;/****************************************************************************************************************/
SYSINIT
                                ;设置各模式堆栈,关闭IRQ,FIQ
        MRS    R0,CPSR
        BIC    R0,R0,#0x1F
		
        MOV    R2,#RAMBASE
        ADD    R2,R2,#RAMLEN    ; TOP of internal RAM

        ; Abort mode
        ORR    R1,R0,#(MODABT :OR: IRQBIT :OR: FIQBIT)
        MSR    CPSR_cxsf,R1     ; ENTER ABT MODE
        MOV    sp,R2
        SUB    R2,R2,#AbtStkSz

        ; Undefine mode 
        ORR    R1,R0,#(MODUDF :OR: IRQBIT :OR: FIQBIT)
        MSR    CPSR_cxsf,R1     ; ENTER UDF MODE
        MOV    sp,R2
        SUB    R2,R2,#UdfStkSz

        ; FIQ mode 
        ORR    R1,R0,#(MODFIQ :OR: IRQBIT :OR: FIQBIT)
        MSR    CPSR_cxsf,R1     ; ENTER FIQ MODE
        MOV    sp,R2
        SUB    R2,R2,#FiqStkSz

        ; IRQ mode 
        ORR    R1,R0,#(MODIRQ :OR: IRQBIT :OR: FIQBIT)
        MSR    CPSR_cxsf,R1     ; ENTER IRQ MODE
        MOV    sp,R2
        SUB    R2,R2,#IrqStkSz

        ; SYS mode 
        ORR    R1,R0,#(MODSYS :OR: IRQBIT :OR: FIQBIT)
        MSR    CPSR_cxsf,R1     ; ENTER SYS MODE
        MOV    SP,R2     

        ; SVC32 mode 
        ORR    R1,R0,#(MODSVC :OR: IRQBIT :OR: FIQBIT)
        MSR    cpsr_cxsf,R1     ; ENTER SVC MODE
        MOV    sp,R2
        SUB    R2,R2,#SvcStkSz

        ; User mode 
        ;ORR    R1,R0,#(MODUSR :OR: IRQBIT :OR: FIQBIT)
        ;MSR    CPSR_cxsf,R1    ; ENTER USR MODE
        ;MOV    sp,R2
        ;SUB    R2,R2,#UsrStkSz          

;/****************************************************************************************************************/
                                ; 禁止WDT

;/****************************************************************************************************************/        
;       初始化代码.
        IMPORT SAMInit
        LDR    R0,=SAMInit
        MOV    LR,PC
        BX     R0
					   
;/****************************************************************************************************************/
        IMPORT |Image$$ER_IROM1$$Base|
        IMPORT |Image$$ER_IROM1$$Limit|
        IMPORT |Load$$RAM_VECT$$Base|
        IMPORT |Image$$RAM_VECT$$Base|
        IMPORT |Image$$RAM_VECT$$Limit|
        IMPORT |Image$$RAM_VECT$$Limit|
        IMPORT |Load$$RW_IRAM1$$Base|
        IMPORT |Image$$RW_IRAM1$$Base|
        IMPORT |Image$$RW_IRAM1$$Limit|
        IMPORT |Image$$RW_IRAM1$$ZI$$Base|
        IMPORT |Image$$RW_IRAM1$$ZI$$Limit|

;/****************************************************/
                                ; copy vector to RAM 	
        LDR    R0,=|Load$$RAM_VECT$$Base|
        LDR    R1,=|Image$$RAM_VECT$$Base|
        LDR    R2,=|Image$$RAM_VECT$$Limit|
1       
        CMP    R1,R2
        LDRLO  R3,[R0],#4
        STRLO  R3,[R1],#4
        BLO    %B1  
				   
;/****************************************************/
                                ; RW , ZI 初始化

        LDR    R0,=|Load$$RW_IRAM1$$Base|
        LDR    R1,=|Image$$RW_IRAM1$$Base|
        LDR    R2,=|Image$$RW_IRAM1$$ZI$$Base|
1       
        CMP    R1,R2
        LDRLO  R3,[R0],#4
        STRLO  R3,[R1],#4
        BLO    %B1  

        MOV    R3,#0
        LDR    R1,=|Image$$RW_IRAM1$$ZI$$Limit|
2
        CMP    R2,R1
        STRLO  R3,[R2],#4
        BLO    %B2    

;/****************************************************************************************************************/

;/****************************************************************************************************************/
                                ; 跳转到Main(!)
        IMPORT Main
        
        LDR    R0,=Main
        MOV    LR,PC
        BX     R0
        
        ; if the code exit from Main, it will enter infinite loop below
loop_here
        B      .

;/****************************************************************************************************************/
        ; lib
__user_initial_stackheap
        LDR    R0, =|Image$$RW_IRAM1$$ZI$$Limit|
        BX     LR

;/****************************************************************************************************************/
    PRESERVE8
	AREA STACK, DATA, READWRITE, ALIGN=2
    ;^ (RAMBASE + RAMLEN - 512)
    ^ (RAMBASE )
AA  # 256
    SPACE 512
      END	


	

⌨️ 快捷键说明

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