📄 44binit.s
字号:
ldr r0, =INTMSK
ldr r1, =0x07ffffff @ 所有中断禁止
str r1, [r0]
#============================================
# 设置时钟控制器
#============================================
ldr r0, =LOCKTIME
ldr r1, =0xfff
str r1, [r0]
ldr r0, =CLKCON
ldr r1, =0x7ff8 @ 所有模块的时钟开启
str r1, [r0]
# ****************************************
# 初始化BDMA *
# ****************************************
ldr r0, =BDIDES0
ldr r1, =0x40000000 @ BDIDESn reset value should be 0x40000000
str r1, [r0]
ldr r0, =BDIDES1
ldr r1, =0x40000000 @ BDIDESn reset value should be 0x40000000
str r1, [r0]
#============================================
# 设置存储区控制器
#============================================
ldr r0, =SMRDATA
ldmia r0, {r1-r13}
ldr r0, =0x01c80000 @ BWSCON Address
stmia r0, {r1-r13}
#============================================
# 初始化栈空间
#============================================
InitStacks:
ldr sp, =SVCStack @ 切换到超级用户栈空间
mrs r0, cpsr
bic r0, r0, #MODEMASK|NOINT
orr r1, r0, #UNDEFMODE
msr cpsr_cxsf, r1 @ 设置未定义异常栈空间
ldr sp, =UndefStack
orr r1, r0, #ABORTMODE|NOINT
msr cpsr_cxsf, r1 @ 设置异常栈空间
ldr sp, =AbortStack
orr r1, r0, #IRQMODE|IRQ_MODE
msr cpsr_cxsf, r1 @ 设置中断栈空间
ldr sp, =IRQStack
orr r1, r0, #FIQMODE|FIQ_MODE
msr cpsr_cxsf, r1 @ 设置快速中断栈空间
ldr sp, =FIQStack
bic r0, r0, #MODEMASK
orr r1, r0, #SVCMODE
msr cpsr_cxsf, r1 @ 返回超级用户栈空间
ldr sp, =SVCStack
# ****************************************************
# * 设置IRQ中断请求 *
# ****************************************************
ldr r0, =HandleIRQ
ldr r1, =ISR_IRQ
str r1, [r0]
#============================================
# 将数据段拷贝到RAM中,并用零初始化数据段
#============================================
ldr r0, =Image_RO_Limit @ 获取只读区域大小
ldr r1, =Image_RW_Base @ 获取可读写区域起始地址/
ldr r3, =Image_ZI_Base @ 获取清零区域起始地址
cmp r0, r1 @ 比较只读区域和可读写区域是否重叠
beq F1
F0:
cmp r1, r3 @ 拷贝.data数据段内容到读写区域
LDRCC r2, [r0], #4 @ --> LDRCC r2, [r0] + ADD r0, r0, #4
strcc r2, [r1], #4 @ --> strcc r2, [r1] + ADD r1, r1, #4
bcc F0
F1:
ldr r1, =Image_ZI_Limit @ 从清零区域顶部开始
mov r2, #0
F2:
cmp r3, r1 @ 清零
strcc r2, [r3], #4
bcc F2
MRS r0, CPSR
bic r0, r0, #NOINT @ 开中断
msr CPSR_cxsf, r0
# 跳到 Main() 执行
bl Main
b .
# ****************************************************
# * The function for entering power down mode *
# ****************************************************
# void EnterPWDN(int CLKCON);
EnterPWDN:
mov r2, r0 @ r0=CLKCON
ldr r0, =REFRESH
ldr r3, [r0]
mov r1, r3
orr r1, r1, # 0x400000 @ self-refresh enable
str r1, [r0]
nop @ Wait until self-refresh is issued. May not be needed.
nop @ If the other bus master holds the bus, ...
nop @ mov r0, r0
nop
nop
nop
nop
# enter POWERDN mode
ldr r0, =CLKCON
str r2, [r0]
# wait until enter SL_IDLE,STOP mode and until wake-up
ldr r0, =0x10
U0: subs r0, r0, #1
bne U0
# exit from DRAM/SDRAM self refresh mode.
ldr r0, =REFRESH
str r3, [r0]
mov pc, lr
# *****************************************************************
# * 存储器设置 *
# *****************************************************************
.ltorg
SMRDATA:
.long 0x22221210 @ BWSCON
.long 0x00000600 @ GCS0
.long 0x00000700 @ GCS1
.long 0x00000700 @ GCS2
.long 0x00000700 @ GCS3
.long 0x00000700 @ GCS4
.long 0x00000700 @ GCS5
.long 0x00010000 @ GCS6, EDO DRAM (Tacc = 1)
.long 0x00018000 @ GCS7, no use
.long 0x00860459 @ Refresh (REFEN=1, TREFMD=0, Trp=0, Trc=5, Tchr=3)
.long 0x0 @ Bank Size, 32MB/32MB
.long 0x20 @ MRSR 6 (CL=2)
.long 0x20 @ MRSR 7 (CL=2).long 0x10
#============================================
# 栈空间定义
#============================================
.equ _ISR_STARTADDRESS,0xc7fff00
.equ UserStack, _ISR_STARTADDRESS-0xf00 @ c7ff000
.equ SVCStack, _ISR_STARTADDRESS-0xf00+256 @ c7ff100
.equ UndefStack, _ISR_STARTADDRESS-0xf00+256*2 @ c7ff200
.equ AbortStack, _ISR_STARTADDRESS-0xf00+256*3 @ c7ff300
.equ IRQStack, _ISR_STARTADDRESS-0xf00+256*4 @ c7ff400
.equ FIQStack, _ISR_STARTADDRESS-0xf00+256*5 @ c7ff500
.equ HandleReset, _ISR_STARTADDRESS @ c7fff00
.equ HandleUndef, _ISR_STARTADDRESS+4
.equ HandleSWI, _ISR_STARTADDRESS+4*2
.equ HandlePabort, _ISR_STARTADDRESS+4*3
.equ HandleDabort, _ISR_STARTADDRESS+4*4
.equ HandleReserved, _ISR_STARTADDRESS+4*5
.equ HandleIRQ, _ISR_STARTADDRESS+4*6
.equ HandleFIQ, _ISR_STARTADDRESS+4*7
.equ HandleADC, _ISR_STARTADDRESS+4*8
.equ HandleRTC, _ISR_STARTADDRESS+4*9
.equ HandleUTXD1, _ISR_STARTADDRESS+4*10
.equ HandleUTXD0, _ISR_STARTADDRESS+4*11
.equ HandleSIO, _ISR_STARTADDRESS+4*12
.equ HandleIIC, _ISR_STARTADDRESS+4*13
.equ HandleURXD1, _ISR_STARTADDRESS+4*14
.equ HandleURXD0, _ISR_STARTADDRESS+4*15
.equ HandleTIMER5, _ISR_STARTADDRESS+4*16
.equ HandleTIMER4, _ISR_STARTADDRESS+4*17
.equ HandleTIMER3, _ISR_STARTADDRESS+4*18
.equ HandleTIMER2, _ISR_STARTADDRESS+4*19
.equ HandleTIMER1, _ISR_STARTADDRESS+4*20
.equ HandleTIMER0, _ISR_STARTADDRESS+4*21
.equ HandleUERR01, _ISR_STARTADDRESS+4*22
.equ HandleWDT, _ISR_STARTADDRESS+4*23
.equ HandleBDMA1, _ISR_STARTADDRESS+4*24
.equ HandleBDMA0, _ISR_STARTADDRESS+4*25
.equ HandleZDMA1, _ISR_STARTADDRESS+4*26
.equ HandleZDMA0, _ISR_STARTADDRESS+4*27
.equ HandleTICK, _ISR_STARTADDRESS+4*28
.equ HandleEINT4567, _ISR_STARTADDRESS+4*29
.equ HandleEINT3, _ISR_STARTADDRESS+4*30
.equ HandleEINT2, _ISR_STARTADDRESS+4*31
.equ HandleEINT1, _ISR_STARTADDRESS+4*32
.equ HandleEINT0, _ISR_STARTADDRESS+4*33 @ 0xc7fff84
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -