📄 44binit.s
字号:
;****************************************************************************
; Name : 44BINIT.S *
; Modified : xuwei 2007-09-07 *
; Description: C start up codes *
;****************************************************************************
INCLUDE memcfg.inc
;****************************************************************************
;存储器空间
;GCS6 32MB DRAM/SDRAM(0x0c000000-0x0e000000)
;APP RAM=0xc000000~0xc7effff
;44BMON RAM=0xc7f0000-0xc7fffff
;STACK =0xc7ffa00
;****************************************************************************
;中断控制预定义
INTPND EQU 0x01e00004
INTMOD EQU 0x01e00008
INTMSK EQU 0x01e0000c
I_ISPR EQU 0x01e00020
I_CMST EQU 0x01e0001c
;****************************************************************************
;看门狗定时器预定义
WTCON EQU 0x01d30000
;****************************************************************************
;系统时钟预定义
PLLCON EQU 0x01d80000
CLKCON EQU 0x01d80004
LOCKTIME EQU 0x01d8000c
;****************************************************************************
;存储器控制预定义
REFRESH EQU 0x01c80024
;****************************************************************************
;BDMA目的寄存器
BDIDES0 EQU 0x1f80008
BDIDES1 EQU 0x1f80028
;****************************************************************************
;预定义常数(常量)
USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x13
ABORTMODE EQU 0x17
UNDEFMODE EQU 0x1b
MODEMASK EQU 0x1f
I_BIT EQU 0x80
F_BIT EQU 0x40
T_BIT EQU 0x20
NOINT EQU 0xc0
;****************************************************************************
;检查是否使用tasm.exe进行编译
GBLL THUMBCODE
[ {CONFIG} = 16
THUMBCODE SETL {TRUE}
CODE32
|
THUMBCODE SETL {FALSE}
]
[ THUMBCODE
CODE32 ;for start-up code for Thumb mode
]
IMPORT |Image$$RO$$Base| ; End of ROM code (=start of ROM data)
IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)
IMPORT |Image$$RW$$Base| ; Base of RAM to initialise
IMPORT |Image$$ZI$$Base| ; Base and limit of area
IMPORT |Image$$ZI$$Limit| ; to zero initialise
IMPORT Main ; The main entry of mon program
;******************************* Vector Macro *****************************
MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
sub sp,sp,#4 ;decrement sp(to store jump address)
stmfd sp!,{r0} ;PUSH the work register to stack(lr do not push because it return to original address)
ldr r0,=$HandleLabel ;load the address of HandleXXX to r0
ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX
str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack
ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)
MEND
;******************************* Code Begin *******************************
AREA Init,CODE,READONLY
ENTRY
ResetEntry
b ResetHandler ;for debug
b HandlerUndef ;handlerUndef
b HandlerSWI ;SWI interrupt handler
b HandlerPabort ;handlerPAbort
b HandlerDabort ;handlerDAbort
b . ;handlerReserved
b HandlerIRQ
b HandlerFIQ
;向量中断表,未实现非矢量中断部分
VECTOR_BRANCH
ldr pc,=HandlerEINT0 ;0x20
ldr pc,=HandlerEINT1 ;
ldr pc,=HandlerEINT2 ;
ldr pc,=HandlerEINT3 ;
ldr pc,=HandlerEINT4567 ;
ldr pc,=HandlerTICK ;0x34
b .
b .
ldr pc,=HandlerZDMA0 ;0x40
ldr pc,=HandlerZDMA1 ;
ldr pc,=HandlerBDMA0 ;
ldr pc,=HandlerBDMA1 ;
ldr pc,=HandlerWDT ;
ldr pc,=HandlerUERR01 ;0x54
b .
b .
ldr pc,=HandlerTIMER0 ;0x60
ldr pc,=HandlerTIMER1 ;
ldr pc,=HandlerTIMER2 ;
ldr pc,=HandlerTIMER3 ;
ldr pc,=HandlerTIMER4 ;
ldr pc,=HandlerTIMER5 ;0x74
b .
b .
ldr pc,=HandlerURXD0 ;0x80
ldr pc,=HandlerURXD1 ;
ldr pc,=HandlerIIC ;
ldr pc,=HandlerSIO ;
ldr pc,=HandlerUTXD0 ;
ldr pc,=HandlerUTXD1 ;0x94
b .
b .
ldr pc,=HandlerRTC ;0xa0
b .
b .
b .
b .
b .
b .
b .
ldr pc,=HandlerADC ;0xc0
;复位中断处理函数
ResetHandler
mrs r0, cpsr ;enter svc mode and disable irq,fiq
bic r0, r0, #MODEMASK
orr r0, r0, #(SVCMODE :OR: I_BIT :OR: F_BIT)
msr cpsr_c, r0
ldr r0,=WTCON ;禁止看门狗
ldr r1,=0x0
str r1,[r0]
ldr r0,=INTMSK
ldr r1,=0x07ffffff ;禁止所有中断
str r1,[r0]
ldr r0,=LOCKTIME ;设定时钟控制寄存器
ldr r1,=0xfff
str r1,[r0]
ldr r0,=PLLCON ;设定系统主时钟频率
ldr r1,=((52<<12) + (3<<4) + 1)
str r1, [r0]
ldr r0,=CLKCON ;所有功能单元块时钟使能
ldr r1,=0x7ff8
str r1,[r0]
;****************************************************
;change BDMACON reset value for 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]
;****************************************************
;设定存储器控制寄存器 *
;****************************************************
adr r0, ResetHandler
ldr r1, =ResetHandler
sub r0, r1, r0
ldr r1, =SMRDATA
sub r0, r1, r0
ldmia r0, {r1-r13}
ldr r0, =0x01c80000 ;BWSCON Address
stmia r0, {r1-r13}
;****************************************************
;初始化堆栈 *
;****************************************************
ldr sp, =SVCStack ;复位后位SVC模式
mrs r0,cpsr
bic r0,r0,#MODEMASK
orr r1,r0,#UNDEFMODE|NOINT
msr cpsr_cxsf,r1 ;UndefMode
ldr sp,=UndefStack
orr r1,r0,#ABORTMODE|NOINT
msr cpsr_cxsf,r1 ;AbortMode
ldr sp,=AbortStack
orr r1,r0,#IRQMODE|NOINT
msr cpsr_cxsf,r1 ;IRQMode
ldr sp,=IRQStack
orr r1,r0,#FIQMODE|NOINT
msr cpsr_cxsf,r1 ;FIQMode
ldr sp,=FIQStack
bic r0,r0,#MODEMASK|NOINT
orr r1,r0,#SVCMODE
msr cpsr_cxsf,r1 ;SVCMode
ldr sp,=SVCStack
;****************************************************
; Copy and paste RW data/zero initialized data *
;****************************************************
adr r0, ResetEntry
ldr r2, =|Image$$RO$$Base|
ldr r3, =|Image$$RO$$Limit|
0
ldmia r0!, {r4-r7}
stmia r2!, {r4-r7}
cmp r2, r3
bcc %B0
ldr r2, =|Image$$RW$$Base|
ldr r3, =|Image$$ZI$$Base|
0
cmp r2, r3 ; Copy init data
ldrcc r1, [r0], #4
strcc r1, [r2], #4
bcc %B0
mov r0, #0
ldr r3, =|Image$$ZI$$Limit|
1
cmp r2, r3 ; Zero init
strcc r0, [r2], #4
bcc %B1
;****************************************************
; 进入C环境 *
;****************************************************
[ :LNOT:THUMBCODE
BL Main ;Don't use main() because ......
B .
]
[ THUMBCODE ;for start-up code for Thumb mode
orr lr,pc,#1
bx lr
CODE16
bl Main ;Don't use main() because ......
b .
CODE32
]
;利用汇编定义系统出错复位函数
EXPORT SysReset
SysReset
ldr pc,=0x0
LTORG
HandlerFIQ HANDLER HandleFIQ
HandlerIRQ HANDLER HandleIRQ
HandlerUndef HANDLER HandleUndef
HandlerSWI HANDLER HandleSWI
HandlerDabort HANDLER HandleDabort
HandlerPabort HANDLER HandlePabort
HandlerEINT0 HANDLER HandleEINT0
HandlerEINT1 HANDLER HandleEINT1
HandlerEINT2 HANDLER HandleEINT2
HandlerEINT3 HANDLER HandleEINT3
HandlerEINT4567 HANDLER HandleEINT4567
HandlerTICK HANDLER HandleTICK
HandlerZDMA0 HANDLER HandleZDMA0
HandlerZDMA1 HANDLER HandleZDMA1
HandlerBDMA0 HANDLER HandleBDMA0
HandlerBDMA1 HANDLER HandleBDMA1
HandlerWDT HANDLER HandleWDT
HandlerUERR01 HANDLER HandleUERR01
HandlerTIMER0 HANDLER HandleTIMER0
HandlerTIMER1 HANDLER HandleTIMER1
HandlerTIMER2 HANDLER HandleTIMER2
HandlerTIMER3 HANDLER HandleTIMER3
HandlerTIMER4 HANDLER HandleTIMER4
HandlerTIMER5 HANDLER HandleTIMER5
HandlerURXD0 HANDLER HandleURXD0
HandlerURXD1 HANDLER HandleURXD1
HandlerIIC HANDLER HandleIIC
HandlerSIO HANDLER HandleSIO
HandlerUTXD0 HANDLER HandleUTXD0
HandlerUTXD1 HANDLER HandleUTXD1
HandlerRTC HANDLER HandleRTC
HandlerADC HANDLER HandleADC
SMRDATA DATA
;*****************************************************************
; Memory configuration has to be optimized for best performance *
; The following parameter is not optimized. *
;*****************************************************************
;bank0 1M *16bit Nor Flash Am29LV160DB
;bank1 16M*8bit Nand Flash K9F2808U0C
;bank2 No used
;bank3 16bit RTL8019AS
;bank4 No Used
;bank5 No Used
;bank6 4Banks*4Mbits*16 SDRAM HY57V561620CT-H
;bank7 No Used
DCD 0x11111002
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 ((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) ;REFRESH RFEN=1, TREFMD=0, trp=3clk, trc=5clk, tchr=3clk,count=1019
DCD 0x10 ;SCLK power down mode, BANKSIZE 32M/32M
DCD 0x20 ;MRSR6 CL=2clk
DCD 0x20 ;MRSR7
ALIGN
;***********************************************
AREA RamData, DATA, READWRITE
^ (0x0dfffa00) ;_ISR_STARTADDRESS-0x500
UserStack # 256 ;0x0dfffa00~0x0dfffb00
SVCStack # 256 ;0x0dfffb00~0x0dfffc00
UndefStack # 256 ;0x0dfffc00~0x0dfffd00
AbortStack # 256 ;0x0dfffd00~0x0dfffe00
IRQStack # 256 ;0x0dfffe00~0x0dffff00
FIQStack # 0 ;0x0dffff00~0x0dffff00
^ (0x0dffff00) ;_ISR_STARTADDRESS
HandleReset # 4 ;0x0dffff00
HandleUndef # 4 ;0x0dffff04
HandleSWI # 4 ;0x0dffff08
HandlePabort # 4 ;0x0dffff0c
HandleDabort # 4 ;0x0dffff10
HandleReserved # 4 ;0x0dffff14
HandleIRQ # 4 ;0x0dffff18
HandleFIQ # 4 ;0x0dffff1c
;Do not use the label 'IntVectorTable',
;because armasm.exe can not recognize this label correctly.
;the value is different with an address you think it may be.
;IntVectorTable
HandleEINT0 # 4 ;0x0dffff20
HandleEINT1 # 4 ;0x0dffff24
HandleEINT2 # 4 ;0x0dffff28
HandleEINT3 # 4 ;0x0dffff2c
HandleEINT4567 # 4 ;0x0dffff30
HandleTICK # 4 ;0x0dffff34
HandleZDMA0 # 4 ;0x0dffff38
HandleZDMA1 # 4 ;0x0dffff3c
HandleBDMA0 # 4 ;0x0dffff40
HandleBDMA1 # 4 ;0x0dffff44
HandleWDT # 4 ;0x0dffff48
HandleUERR01 # 4 ;0x0dffff4c
HandleTIMER0 # 4 ;0x0dffff50
HandleTIMER1 # 4 ;0x0dffff54
HandleTIMER2 # 4 ;0x0dffff58
HandleTIMER3 # 4 ;0x0dffff5c
HandleTIMER4 # 4 ;0x0dffff60
HandleTIMER5 # 4 ;0x0dffff64
HandleURXD0 # 4 ;0x0dffff68
HandleURXD1 # 4 ;0x0dffff6c
HandleIIC # 4 ;0x0dffff70
HandleSIO # 4 ;0x0dffff74
HandleUTXD0 # 4 ;0x0dffff78
HandleUTXD1 # 4 ;0x0dffff7c
HandleRTC # 4 ;0x0dffff80
HandleADC # 4 ;0x0dffff84
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -