📄 samboot.s
字号:
;/****************************************************************************************************************/
;/********************* Startup code for AT91SAM7S ***************************************************************/
;/ hotislandn@hotmail.com /
;/ WWW.MCUZONE.COM
;/
;/ Rev 0.1 /
;/****************************************************************************************************************/
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
RAMEND EQU 0x00204000 ; S64 : 16KB RAM
VECTSIZE EQU 0x100 ; 驻留RAM的向量区域定为256字节
UsrStkSz EQU 8 ; size of USR stack
SysStkSz EQU 128 ; size of SYS stack
SvcStkSz EQU 8 ; size of SVC stack
UdfStkSz EQU 8 ; size of UDF stack
AbtStkSz EQU 8 ; size of ABT stack
IrqStkSz EQU 128 ; size of IRQ stack
FiqStkSz EQU 16 ; size of FIQ stack
PRESERVE8
AREA START, CODE, READONLY
CODE32
ENTRY
EXPORT RESET
RESET
B SYSINIT ; Reset
B UDFHANDLER ; UNDEFINED
B SWIHANDLER ; SWI
B PABTHANDLER ; PREFETCH ABORT
B DABTHANDLER ; DATA ABORT
B . ; RESERVED
LDR PC,[PC,#-0xF20]
B . ; ADD FIQ CODE HERE
;---------------------------------------------------------------------------------------------------------
;******************** 向量模式IRQ处理代码 ****************************************************************
;---------------------------------------------------------------------------------------------------------
IMPORT OSIntNesting
IMPORT OSIntExit
IMPORT SAMIsr
EXPORT VECTORED_IRQ_HANDLER
VECTORED_IRQ_HANDLER
;---------------------------------------------------------------------------------------------------------
;******************** 运行于IRQ模式的代码 ****************************************************************
;---------------------------------------------------------------------------------------------------------
STMFD sp,{r0-r4} ; 不修改SP_IRQ的值
SUB r0,sp,#20 ; R0指向栈底
SUB r1,lr,#4 ; R1=返回地址
MRS r2,SPSR ; R2=SPSR
LDR r3,=OSIntNesting ; OSIntNesting++
LDRB r4,[r3]
ADD r4,r4,#1
STRB r4,[r3]
MSR CPSR_cxsf,#0x9f ; Sys Mode , IRQ disable ,FIQ enable
; 关闭IRQ,保存被中断任务的上下文到任务堆栈,SP_SYS
;---------------------------------------------------------------------------------------------------------
;******************** 其余代码运行于SYS模式 **************************************************************
;---------------------------------------------------------------------------------------------------------
STMFD sp!,{r1} ; PC
STMFD sp!,{lr} ; lr
STMFD sp!,{r5-r12} ; r12---r5
LDMIA r0!,{r5-r9} ; 取得保存在IRQ堆栈中的R0---R4
STMFD sp!,{r5-r9} ; r4---r0
STMFD sp!,{r2} ; cpsr
STMFD sp!,{r2} ; spsr
LDR r0,=0xFFFFF108 ; AT91C_AIC_ISR
LDR r0,[r0]
;LDR lr,=ISR_RETURN1
ADD lr,PC,#4
MSR CPSR_cxsf,#0x1f ; Sys Mode , IRQ enable ,FIQ enable
LDR PC,=SAMIsr
;BL SAMIsr
ISR_RETURN1
;LDR lr,=ISR_RETURN2
MOV lr,PC
LDR PC,=OSIntExit
;BL OSIntExit
ISR_RETURN2
LDMFD sp!,{r0} ; spsr
LDMFD sp!,{r0} ; cpsr
MSR CPSR_cxsf,r0
LDMFD sp!,{r0-r12,lr,pc} ; 任务返回
;---------------------------------------------------------------------------------------------------------
;******************** reentrant 代码 *********************************************************************
;---------------------------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------------------------
;******************** 其余的处理器异常 *******************************************************************
;---------------------------------------------------------------------------------------------------------
UDFHANDLER
B .
SWIHANDLER
B .
PABTHANDLER
B .
DABTHANDLER
B .
;/****************************************************************************************************************/
SYSINIT
;设置各模式堆栈,关闭IRQ,FIQ
MRS R0,CPSR
BIC R0,R0,#0x1F
MOV R2,#RAMEND
ORR R1,R0,#(MODSVC :OR: IRQBIT :OR: FIQBIT)
MSR cpsr_cxsf,R1 ; ENTER SVC MODE
MOV sp,R2
SUB R2,R2,#SvcStkSz
ORR R1,R0,#(MODFIQ :OR: IRQBIT :OR: FIQBIT)
MSR CPSR_cxsf,R1 ; ENTER FIQ MODE
MOV sp,R2
SUB R2,R2,#FiqStkSz
ORR R1,R0,#(MODIRQ :OR: IRQBIT :OR: FIQBIT)
MSR CPSR_cxsf,R1 ; ENTER IRQ MODE
MOV sp,R2
SUB R2,R2,#IrqStkSz
ORR R1,R0,#(MODUDF :OR: IRQBIT :OR: FIQBIT)
MSR CPSR_cxsf,R1 ; ENTER UDF MODE
MOV sp,R2
SUB R2,R2,#UdfStkSz
ORR R1,R0,#(MODABT :OR: IRQBIT :OR: FIQBIT)
MSR CPSR_cxsf,R1 ; ENTER ABT MODE
MOV sp,R2
SUB R2,R2,#AbtStkSz
;ORR R1,R0,#(MODUSR :OR: IRQBIT :OR: FIQBIT)
;MSR CPSR_cxsf,R1 ; ENTER USR MODE
;MOV sp,R2
;SUB R2,R2,#UsrStkSz
ORR R1,R0,#(MODSYS :OR: IRQBIT :OR: FIQBIT)
MSR CPSR_cxsf,R1 ; ENTER SYS MODE
MOV sp,R2 ; 于SYS模式运行代码
;/****************************************************************************************************************/
; 复位后有16sec的时间禁止WDT
;/****************************************************************************************************************/
IMPORT |Image$$RO$$Base|
IMPORT |Image$$RO$$Limit|
IMPORT |Image$$RW$$Base|
IMPORT |Image$$RW$$Limit|
IMPORT |Image$$ZI$$Base|
IMPORT |Image$$ZI$$Limit|
; 复制向量
COPY_VECT_TO_RAM
LDR R0,=|Image$$RO$$Base|
LDR R1,=SYSINIT
LDR R2,=0x200000 ; RAM START
0
CMP R0,R1
LDRLO R3,[R0],#4
STRLO R3,[R2],#4
BLO %B0
;/****************************************************************************************************************/
; RW , ZI 初始化
LDR R0,=|Image$$RO$$Limit|
LDR R1,=|Image$$RW$$Base|
LDR R2,=|Image$$ZI$$Base|
1
CMP R1,R2
LDRLO R3,[R0],#4
STRLO R3,[R1],#4
BLO %B1
MOV R3,#0
LDR R1,=|Image$$ZI$$Limit|
2
CMP R2,R1
STRLO R3,[R2],#4
BLO %B2
;/****************************************************************************************************************/
; 如必要,复制代码到RAM中运行
; 适用于代码小,但对速度要求高的场合
COPY_BEGIN
LDR R0,=0x200000
LDR R1,=RESET ; =|Image$$RO$$Base|
CMP R1,R0 ;
BLO COPY_END ; RO不在RAM中
ADR R0,RESET
ADR R2,COPY_END
SUB R0,R2,R0
ADD R1,R1,R0
LDR R3,=|Image$$RO$$Limit|
3
CMP R1,R3
LDRLO R4,[R2],#4
STRLO R4,[R1],#4
BLO %B3
LDR PC,=COPY_END
COPY_END
;/****************************************************************************************************************/
; 跳转到Main(!)
IMPORT Main
LDR PC,=Main
B .
;/****************************************************************************************************************/
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -