📄 start.s
字号:
INCLUDE ..\inc\option.inc
INCLUDE ..\inc\memcfg.inc
INCLUDE ..\inc\2410addr.inc
;//处理器工作模式预定义
USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x13
ABORTMODE EQU 0x17
UNDEFMODE EQU 0x1b
MODEMASK EQU 0x1f
NOINT EQU 0xc0
;//堆栈位置(使用2410的片内的4KByte存储器)
_STACK_ADDRESS EQU 0x040000f00
;//处理器各种工作模式下的堆栈位置定义
UserStack EQU (_STACK_ADDRESS-0x0b00) ;//1.25Kbytes
SVCStack EQU (_STACK_ADDRESS-0x700) ;//1Kbytes
UndefStack EQU (_STACK_ADDRESS-0x600) ;//256bytes
AbortStack EQU (_STACK_ADDRESS-0x500) ;//256bytes
IRQStack EQU (_STACK_ADDRESS-0x100) ;//1Kbytes
FIQStack EQU (_STACK_ADDRESS-0x0) ;//256bytes
MACRO
$HandlerLabel HANDLER $HandleLabel
;//定义中断句柄
$HandlerLabel
sub sp,sp,#4 ;//
stmfd sp!,{r0} ;//
ldr r0,=$HandleLabel;//
ldr r0,[r0] ;//
str r0,[sp,#4] ;//
ldmfd sp!,{r0,pc} ;//
MEND
AREA SelfBoot, CODE, READONLY
IMPORT |Image$$RO$$Limit|
IMPORT |Image$$RW$$Base|
IMPORT |Image$$ZI$$Base|
IMPORT |Image$$ZI$$Limit|
IMPORT MAIN
ENTRY
EXPORT __ENTRY
__ENTRY
;//程序入口地址
ResetEntry
b ResetHandler ;//复位
b HandlerUndef ;//未定义指令中断
b HandlerSWI ;//软件中断
b HandlerPabort ;//非法指令中断
b HandlerDabort ;//非法数据中断
b . ;//保留
b HandlerIRQ ;//IRQ中断
b HandlerFIQ ;//FIQ中断
LTORG
HandlerFIQ HANDLER HandleFIQ
HandlerIRQ HANDLER HandleIRQ
HandlerUndef HANDLER HandleUndef
HandlerSWI HANDLER HandleSWI
HandlerDabort HANDLER HandleDabort
HandlerPabort HANDLER HandlePabort
;//===================================
; ENTRY
;//===================================
ResetHandler
;//关看门狗
ldr r0,=WTCON
ldr r1,=0x0
str r1,[r0]
;//禁止所有中断
ldr r0,=INTMSK
ldr r1,=0xffffffff
str r1,[r0]
;//禁止所有子中断
ldr r0,=INTSUBMSK
ldr r1,=0x3ff
str r1,[r0]
;//点亮核心板上的两个LED
ldr r0,=GPFCON
ldr r1,=0x5500
str r1,[r0]
ldr r0,=GPFDAT
ldr r1,=0x10
str r1,[r0]
;//设置时钟锁存寄存器
ldr r0,=LOCKTIME
ldr r1,=0xffffff
str r1,[r0]
;//设置处理器工作主频为100MHz
;//Fin=10MHz,Fout=100MHz
ldr r0,=MPLLCON
ldr r1,=((92<<12)+(3<<4)+1)
str r1,[r0]
;//检查是否从掉电模式中恢复
;//ldr r1,=GSTATUS2
;//ldr r0,[r1]
;//tst r0,#0x2
;//如果是从掉电模式中恢复就跳转到WAKEUP_POWER_OFF处执行
;//bne WAKEUP_POWER_OFF
;//设置内存控制寄存器
adr r0, SMRDATA
ldr r1, =BWSCON
add r2, r0, #52
0
ldr r3, [r0], #4
str r3, [r1], #4
cmp r2, r0
bne %B0
;//初始化堆栈
bl InitStacks
;//设置IRQ中断句柄
; Setup IRQ handler
ldr r0,=HandleIRQ
ldr r1,=IsrIRQ
str r1,[r0]
;///////////////////////////////
;//Copy and paste RW data/zero initialized data
LDR r0,=|Image$$RO$$Limit|
LDR r1,=|Image$$RW$$Base|
LDR r3,=|Image$$ZI$$Base|
CMP r0,r1
BEQ %F1
0
CMP r1,r3
LDRCC r2,[r0],#4
STRCC r2,[r1],#4
BCC %B0
1
LDR r1,=|Image$$ZI$$Limit|
MOV r2,#0
2
CMP r3,r1
STRCC r2,[r3],#4
BCC %B2
;//检查启动芯片
;//ldr r0, =BWSCON
;//ldr r0, [r0]
;//ands r0, r0, #6
;//检查OM[1:0],看是否从NOR FLash启动
;//否则从NAND FLash启动
;//bne copy_proc_beg
;//adr r0, ResetEntry
;//cmp r0, #0 ;if use Multi-ice,
;//bne copy_proc_beg ;dont read nand flash for boot
;//bl nand_boot_beg
bl MAIN
;//非向量中断
IsrIRQ
sub sp, sp, #4 ;//保留来存放PC地址
stmfd sp!, {r8-r9}
ldr r9, =INTOFFSET
ldr r9, [r9]
ldr r8, =HandleEINT0
add r8, r8,r9,lsl #2
ldr r8, [r8]
str r8, [sp,#8]
ldmfd sp!,{r8-r9,pc}
;//堆栈初始化程序
InitStacks
;//初始化UndefMode模式堆栈
mrs r0,cpsr
bic r0,r0,#MODEMASK
orr r1,r0,#UNDEFMODE|NOINT
msr cpsr_cxsf,r1
ldr sp,=UndefStack
;//初始化AbortMode模式堆栈
orr r1,r0,#ABORTMODE|NOINT
msr cpsr_cxsf,r1
ldr sp,=AbortStack
;//初始化IRQMode模式堆栈
orr r1,r0,#IRQMODE|NOINT
msr cpsr_cxsf,r1
ldr sp,=IRQStack
;//初始化FIQMode模式堆栈
orr r1,r0,#FIQMODE|NOINT
msr cpsr_cxsf,r1
ldr sp,=FIQStack
;//初始化SVCMode模式堆栈
orr r1,r0,#SVCMODE|NOINT
msr cpsr_cxsf,r1
ldr sp,=SVCStack
;//此处没有初始化User模式堆栈,如果初始化就无法返回
mov pc,lr
;//此处必须是SVC模式,否则LR寄存器的值无效
LTORG
;//内存初始化参数
SMRDATA DATA
DCD (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
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 0x1f7c;((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
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)
DCD 0x32 ;//SCLK power saving mode, BANKSIZE 128M/128M
DCD 0x30 ;//MRSR6 CL=3clk
DCD 0x30 ;//MRSR7
;//内存中的中断向量表首地址共占用160个字节
_ISR_ADDRESS EQU 0x040000f00
AREA RamData, DATA, READWRITE
^ _ISR_ADDRESS
HandleReset # 4
HandleUndef # 4
HandleSWI # 4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ # 4
HandleFIQ # 4
;//IntVectorTable
HandleEINT0 # 4
HandleEINT1 # 4
HandleEINT2 # 4
HandleEINT3 # 4
HandleEINT4_7 # 4
HandleEINT8_23 # 4
HandleRSV6 # 4
HandleBATFLT # 4
HandleTICK # 4
HandleWDT # 4
HandleTIMER0 # 4
HandleTIMER1 # 4
HandleTIMER2 # 4
HandleTIMER3 # 4
HandleTIMER4 # 4
HandleUART2 # 4
HandleLCD # 4
HandleDMA0 # 4
HandleDMA1 # 4
HandleDMA2 # 4
HandleDMA3 # 4
HandleMMC # 4
HandleSPI0 # 4
HandleUART1 # 4
HandleRSV24 # 4
HandleUSBD # 4
HandleUSBH # 4
HandleIIC # 4
HandleUART0 # 4
HandleSPI1 # 4
HandleRTC # 4
HandleADC # 4
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -