📄 44binit.s.svn-base
字号:
;****************************************************************************
; Copyright (c) 深圳市民德电子科技有限公司 http://www.szminde.cn
;
; 文件名称:44binit.s
; 版本号: 1.0
; 日期: 2005-05-25
; 说明: 此文件包含S3C44B0X芯片内存的设置、ISR的初始化、堆栈的初始化以及
; C 程序入口。
; 调用列表:--
; 修改历史:--
;****************************************************************************/
INCLUDE option.s
INCLUDE memcfg.s
;中断控制预定义
INTPND EQU 0x01e00004
INTMOD EQU 0x01e00008
INTMSK EQU 0x01e0000c
I_ISPR EQU 0x01e00020
I_CMST EQU 0x01e0001c
I_ISPC EQU 0x01e00024 ;IRQ interrupt service clear register
;看门狗定时器预定义
WTCON EQU 0x01d30000
;系统时钟预定义
PLLCON EQU 0x01d80000
CLKCON EQU 0x01d80004
LOCKTIME EQU 0x01d8000c
;存储器控制预定义
BWSCON EQU 0x01c80000
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
NOINT EQU 0xc0
;检查是否使用tasm.exe进行编译
GBLL THUMBCODE
[ {CONFIG} = 16
THUMBCODE SETL {TRUE}
CODE32
|
THUMBCODE SETL {FALSE}
]
[ THUMBCODE
CODE32
]
;***********ues to jump to the ISR*************************
MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
sub sp,sp,#4
stmfd sp!,{r0}
ldr r0,=$HandleLabel ;this handlelabel point the area contain the ISR address
ldr r0,[r0]
str r0,[sp,#4]
ldmfd sp!,{r0,pc}
MEND
;***********************************************************
IMPORT Main ;the Main function in C part
;************the beginning of the whole program*************
AREA Init,CODE,READONLY
ENTRY
ResetEntry
b ResetHandler
b HandlerUndef
b HandlerSWI
b HandlerPabort
b HandlerDabort
b .
b HandlerIRQ
b HandlerFIQ
;中断向量表
VECTOR_BRANCH
ldr pc,=HandlerEINT0
ldr pc,=HandlerEINT1
ldr pc,=HandlerEINT2
ldr pc,=HandlerEINT3
ldr pc,=HandlerEINT4567
ldr pc,=HandlerTICK
b .
b .
ldr pc,=HandlerZDMA0
ldr pc,=HandlerZDMA1
ldr pc,=HandlerBDMA0
ldr pc,=HandlerBDMA1
ldr pc,=HandlerWDT
ldr pc,=HandlerUERR01
b .
b .
ldr pc,=HandlerTIMER0
ldr pc,=HandlerTIMER1
ldr pc,=HandlerTIMER2
ldr pc,=HandlerTIMER3
ldr pc,=HandlerTIMER4
ldr pc,=HandlerTIMER5
b .
b .
ldr pc,=HandlerURXD0
ldr pc,=HandlerURXD1
ldr pc,=HandlerIIC
ldr pc,=HandlerSIO
ldr pc,=HandlerUTXD0
ldr pc,=HandlerUTXD1
b .
b .
ldr pc,=HandlerRTC
b .
b .
b .
b .
b .
b .
b .
ldr pc,=HandlerADC
b .
b .
b .
b .
b .
b .
b .
ldr pc,=EnterPWDN
ResetHandler
ldr r0,=WTCON
ldr r1,=0x0 ;disable the watch dog funtion
str r1,[r0]
ldr r0,=I_ISPC
ldr r1,=0x03ffffff ;clear all the IRQ
str r1,[r0]
ldr r0,=INTMSK
ldr r1,=0x07ffffff ;mask all INT
str r1,[r0]
ldr r0,=LOCKTIME
ldr r1,=0xfff ;PLL lock time
str r1,[r0]
[ PLLONSTART
ldr r0,=PLLCON
ldr r1,=((M_DIV<<12)+(P_DIV<<4)+S_DIV) ;set the PLL 66M
str r1,[r0]
]
ldr r0,=CLKCON
ldr r1,=0x7ff8 ;enable all the peripheral equipment
str r1,[r0]
ldr r0,=BDIDES0
ldr r1,=0x40000000 ;DMA no use
str r1,[r0]
ldr r0,=BDIDES1
ldr r1,=0x40000000 ;DMA no use
str r1,[r0]
;设定存储器控制寄存器
;because running this part of program is in the ROM the absolute address is different with the
;actual address, so there must have an address switch.
adr r0, ResetHandler ;get the relative position of the Resethandler refre to the current PC
ldr r1, =ResetHandler ;the actual address of the Resethandler
sub r0, r1, r0 ;calculate the difference between the two kind of address
ldr r1, =SMRDATA
sub r0, r1, r0 ;calculate the absolute address of the SMRDATA
ldmia r0, {r1-r13}
ldr r0, =BWSCON
stmia r0, {r1-r13}
;初始化堆栈
ldr sp, =SVCStack
bl InitStacks
;设置中断处理
;this part is be instead by the "UCOS_IRQHandler" in the Os_cpu_a.s in the uCOS part sdy060604
;ldr r0,=HandleIRQ
;ldr r1,=IsrIRQ
;str r1,[r0]
;拷贝并粘贴 RW data/zero initialized data
adr r0, ResetEntry ;get the actuall address of ResetEntry, useing the relative address to PC
ldr r1, BaseOfROM ;get the absolut address of ResetEntry(the beginning of RO section)
cmp r0, r1 ;if current code is running in the FLASH
ldreq r0, TopOfROM
beq InitRamData
;计算拷贝程序在flash中的实际位置
ldr r2, =CopyProcBeg
sub r1, r2, r1
add r0, r0, r1 ;get the address of CopyProcBeg code in the FLASH
ldr r3, =CopyProcEnd
;将拷贝程序复制到ram中
0
ldmia r0!, {r4-r7}
stmia r2!, {r4-r7}
cmp r2, r3
bcc %B0
;开始用ram中的拷贝程序复本将所有剩下的代码复制到ram中
ldr r3, TopOfROM
ldr pc, =CopyProcBeg ;from here, the progam running in the SDRAM
;本段将代码由实际烧入的地址拷贝到ro-base所指定的位置(只拷贝CopyProcEnd以后的代码)
CopyProcBeg
0
ldmia r0!, {r4-r11}
stmia r2!, {r4-r11}
cmp r2, r3
bcc %B0
CopyProcEnd
sub r1, r2, r3 ;beyond part
sub r0, r0, r1 ;put the beginning address of RW section in r0
;initialize the RW section
InitRamData
ldr r2, BaseOfBSS
ldr r3, BaseOfZero
0
cmp r2, r3
ldrcc r1, [r0], #4
strcc r1, [r2], #4
bcc %B0
;initialize the ZI section
mov r0, #0
ldr r3, EndOfBSS
1
cmp r2, r3
strcc r0, [r2], #4
bcc %B1
[ :LNOT:THUMBCODE
BL Main
B .
]
[ THUMBCODE
orr lr,pc,#1
bx lr
CODE16
bl Main
b .
CODE32
]
LTORG
;***************************************************
HandlerFIQ HANDLER HandleFIQ
HandlerIRQ HANDLER HandleIRQ
HandlerUndef HANDLER HandleUndef
HandlerSWI HANDLER HandleSWI
HandlerDabort HANDLER HandleDabort
HandlerPabort HANDLER HandlePabort
HandlerADC HANDLER HandleADC
HandlerRTC HANDLER HandleRTC
HandlerUTXD1 HANDLER HandleUTXD1
HandlerUTXD0 HANDLER HandleUTXD0
HandlerSIO HANDLER HandleSIO
HandlerIIC HANDLER HandleIIC
HandlerURXD1 HANDLER HandleURXD1
HandlerURXD0 HANDLER HandleURXD0
HandlerTIMER5 HANDLER HandleTIMER5
HandlerTIMER4 HANDLER HandleTIMER4
HandlerTIMER3 HANDLER HandleTIMER3
HandlerTIMER2 HANDLER HandleTIMER2
HandlerTIMER1 HANDLER HandleTIMER1
HandlerTIMER0 HANDLER HandleTIMER0
HandlerUERR01 HANDLER HandleUERR01
HandlerWDT HANDLER HandleWDT
HandlerBDMA1 HANDLER HandleBDMA1
HandlerBDMA0 HANDLER HandleBDMA0
HandlerZDMA1 HANDLER HandleZDMA1
HandlerZDMA0 HANDLER HandleZDMA0
HandlerTICK HANDLER HandleTICK
HandlerEINT4567 HANDLER HandleEINT4567
HandlerEINT3 HANDLER HandleEINT3
HandlerEINT2 HANDLER HandleEINT2
HandlerEINT1 HANDLER HandleEINT1
HandlerEINT0 HANDLER HandleEINT0
;*****************************************************
IMPORT |Image$$RO$$Base|
IMPORT |Image$$RO$$Limit|
IMPORT |Image$$RW$$Base|
IMPORT |Image$$ZI$$Base|
IMPORT |Image$$ZI$$Limit|
BaseOfROM DCD |Image$$RO$$Base|
TopOfROM DCD |Image$$RO$$Limit|
BaseOfBSS DCD |Image$$RW$$Base|
BaseOfZero DCD |Image$$ZI$$Base|
EndOfBSS DCD |Image$$ZI$$Limit|
EXPORT GetBaseOfROM
EXPORT GetEndOfROM
EXPORT GetBaseOfBSS
EXPORT GetBaseOfZero
EXPORT GetEndOfBSS
GetBaseOfROM
ldr r0, BaseOfROM
mov pc, lr
GetEndOfROM
ldr r0, TopOfROM
mov pc, lr
GetBaseOfBSS
ldr r0, BaseOfBSS
mov pc, lr
GetBaseOfZero
ldr r0, BaseOfZero
mov pc, lr
GetEndOfBSS
ldr r0, EndOfBSS
mov pc, lr
;******************************************************
;初始化堆栈
;in this model do not initialize the user mode
InitStacks
mrs r0,cpsr
bic r0,r0,#MODEMASK
orr r1,r0,#UNDEFMODE|NOINT
msr cpsr_cxsf,r1
ldr sp,=UndefStack
orr r1,r0,#ABORTMODE|NOINT
msr cpsr_cxsf,r1
ldr sp,=AbortStack
orr r1,r0,#IRQMODE|NOINT
msr cpsr_cxsf,r1
ldr sp,=IRQStack
orr r1,r0,#FIQMODE|NOINT
msr cpsr_cxsf,r1
ldr sp,=FIQStack
;bic r0,r0,#MODEMASK|NOINT ;no use
;orr r1,r0,#SVCMODE
orr r1,r0,#SVCMODE|NOINT ;sdy060603
msr cpsr_cxsf,r1
ldr sp,=SVCStack
mov pc,lr
;************************************************
;this part is be instead by the "UCOS_IRQHandler" in the Os_cpu_a.s in the uCOS part
IsrIRQ
sub sp,sp,#4
stmfd sp!,{r8-r9}
ldr r9,=I_ISPR
ldr r9,[r9]
cmp r9, #0x0
beq %F2
mov r8,#0x0
0
movs r9,r9,lsr #1
bcs %F1
add r8,r8,#4
b %B0
1
ldr r9,=HandleADC
add r9,r9,r8
ldr r9,[r9]
str r9,[sp,#8]
ldmfd sp!,{r8-r9,pc}
2
ldmfd sp!,{r8-r9}
add sp,sp,#4
subs pc,lr,#4
;省电模式
EnterPWDN
mov r2,r0
ldr r0,=REFRESH
ldr r3,[r0]
mov r1, r3
orr r1, r1, #0x400000
str r1, [r0]
nop
nop
nop
nop
nop
nop
nop
ldr r0,=CLKCON
str r2,[r0]
mov r0,#0xff
0 subs r0,r0,#1
bne %B0
ldr r0,=REFRESH
str r3,[r0]
mov pc,lr
LTORG
SMRDATA DATA
[ BUSWIDTH=16
DCD 0x11110001 ;Bank0=OM[1:0] 16bit BootRomSST39VF160/SST39VF320) :0x0
| ;BUSWIDTH=32
DCD 0x22222220 ;Bank0=OM[1:0], Bank1~Bank7=32bit
] ;DCD 0x7fff
DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))
DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))
DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))
DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))
DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))
DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))
[ BDRAMTYPE="DRAM"
DCD ((B6_MT<<15)+(B6_Trcd<<4)+(B6_Tcas<<3)+(B6_Tcp<<2)+(B6_CAN))
DCD ((B7_MT<<15)+(B7_Trcd<<4)+(B7_Tcas<<3)+(B7_Tcp<<2)+(B7_CAN))
| ;"SDRAM"
DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))
DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))
]
DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
DCD 0x10
DCD 0x20
DCD 0x20
ALIGN
AREA RamData, DATA, READWRITE
^ (_ISR_STARTADDRESS-0x500)
UserStack # 256 ;c1(c7)ffa00
SVCStack # 256 ;c1(c7)ffb00
UndefStack # 256 ;c1(c7)ffc00
AbortStack # 256 ;c1(c7)ffd00
IRQStack # 256 ;c1(c7)ffe00
FIQStack # 0 ;c1(c7)fff00
^ _ISR_STARTADDRESS
HandleReset # 4
HandleUndef # 4
HandleSWI # 4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ # 4
HandleFIQ # 4
HandleADC # 4
HandleRTC # 4
HandleUTXD1 # 4
HandleUTXD0 # 4
HandleSIO # 4
HandleIIC # 4
HandleURXD1 # 4
HandleURXD0 # 4
HandleTIMER5 # 4
HandleTIMER4 # 4
HandleTIMER3 # 4
HandleTIMER2 # 4
HandleTIMER1 # 4
HandleTIMER0 # 4
HandleUERR01 # 4
HandleWDT # 4
HandleBDMA1 # 4
HandleBDMA0 # 4
HandleZDMA1 # 4
HandleZDMA0 # 4
HandleTICK # 4
HandleEINT4567 # 4
HandleEINT3 # 4
HandleEINT2 # 4
HandleEINT1 # 4
HandleEINT0 # 4
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -