www.pudn.com > 44B0X_uCOS276.rar > 44binit.s
;***************************************************************
;Name : 44BINIT.S
;Edit : Tianbing
;Date : 2006-6-23
;Function : 这是一段44b0的初始化程序
;***************************************************************
;***************************************************************
;寄存器定义
;***************************************************************
rSYSCFG EQU 0x01c00000
rNCACHBE0 EQU 0x01c00004
rNCACHBE1 EQU 0x01c00008
rBWSCON EQU 0x01c80000
rBANKCON0 EQU 0x01c80004
rBANKCON1 EQU 0x01c80008
rBANKCON2 EQU 0x01c8000c
rBANKCON3 EQU 0x01c80010
rBANKCON4 EQU 0x01c80014
rBANKCON5 EQU 0x01c80018
rBANKCON6 EQU 0x01c8001c
rBANKCON7 EQU 0x01c80020
rREFRESH EQU 0x01c80024
rBANKSIZE EQU 0x01c80028
rMRSRB6 EQU 0x01c8002c
rMRSRB7 EQU 0x01c80030
rPCONA EQU 0x01d20000
rPCONB EQU 0x01d20008
rPCONC EQU 0x01d20010
rPDATC EQU 0x01d20014
rPUPC EQU 0x01d20018
rPCOND EQU 0x01d2001c
rPDATD EQU 0x01d20020
rPUPD EQU 0x01d20024
rPCONE EQU 0x01d20028
rPDATE EQU 0x01d2002c
rPUPE EQU 0x01d20030
rPCONF EQU 0x01d20034
rPDATF EQU 0x01d20038
rPUPF EQU 0x01d2003c
rPCONG EQU 0x01d20040
rPDATG EQU 0x01d20044
rPUPG EQU 0x01d20048
rSPUCR EQU 0x01d2004c
rEXTINT EQU 0x01d20050
rWTCON EQU 0x01d30000
rPLLCON EQU 0x01d80000
rCLKCON EQU 0x01d80004
rLOCKTIME EQU 0x01d8000c
rINTCON EQU 0x01e00000
rINTPND EQU 0x01e00004
rINTMOD EQU 0x01e00008
rINTMSK EQU 0x01e0000c
rI_CMST EQU 0x01e0001c
rI_ISPR EQU 0x01e00020
;***************************************************************
;处理器模式定义
;***************************************************************
USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x13
ABORTMODE EQU 0x17
UNDEFMODE EQU 0x1b
MODEMASK EQU 0x1f
NOINT EQU 0xc0
;***************************************************************
;栈定义
;***************************************************************
_ISR_STARTADDRESS EQU 0x0c7fff00
SVCStack EQU _ISR_STARTADDRESS - 0xa00 ;0xc7ff500
UserStack EQU _ISR_STARTADDRESS - 0x800 ;0xc7ff700
UndefStack EQU _ISR_STARTADDRESS - 0x600 ;0xc7ff900
AbortStack EQU _ISR_STARTADDRESS - 0x400 ;0xc7ffb00
IRQStack EQU _ISR_STARTADDRESS - 0x200 ;0xc7ffd00
FIQStack EQU _ISR_STARTADDRESS ;0xc7fff00
;***************************************************************
;中断入口定义
;***************************************************************
HandleReset EQU _ISR_STARTADDRESS ;0xc7fff00
HandleUndef EQU _ISR_STARTADDRESS + 0x04 ;0xc7fff04
HandleSWI EQU _ISR_STARTADDRESS + 0x08 ;0xc7fff08
HandlePabort EQU _ISR_STARTADDRESS + 0x0c ;0xc7fff0c
HandleDabort EQU _ISR_STARTADDRESS + 0x10 ;0xc7fff10
HandleReserved EQU _ISR_STARTADDRESS + 0x14 ;0xc7fff14
HandleIRQ EQU _ISR_STARTADDRESS + 0x18 ;0xc7fff18
HandleFIQ EQU _ISR_STARTADDRESS + 0x1c ;0xc7fff1c
HandleADC EQU _ISR_STARTADDRESS + 0x20 ;0xc7fff20
HandleRTC EQU _ISR_STARTADDRESS + 0x24 ;0xc7fff24
HandleUTXD1 EQU _ISR_STARTADDRESS + 0x28 ;0xc7fff28
HandleUTXD0 EQU _ISR_STARTADDRESS + 0x2c ;0xc7fff2c
HandleSIO EQU _ISR_STARTADDRESS + 0x30 ;0xc7fff30
HandleIIC EQU _ISR_STARTADDRESS + 0x34 ;0xc7fff34
HandleURXD1 EQU _ISR_STARTADDRESS + 0x38 ;0xc7fff38
HandleURXD0 EQU _ISR_STARTADDRESS + 0x3c ;0xc7fff3c
HandleTIMER5 EQU _ISR_STARTADDRESS + 0x40 ;0xc7fff40
HandleTIMER4 EQU _ISR_STARTADDRESS + 0x44 ;0xc7fff44
HandleTIMER3 EQU _ISR_STARTADDRESS + 0x48 ;0xc7fff48
HandleTIMER2 EQU _ISR_STARTADDRESS + 0x4c ;0xc7fff4c
HandleTIMER1 EQU _ISR_STARTADDRESS + 0x50 ;0xc7fff50
HandleTIMER0 EQU _ISR_STARTADDRESS + 0x54 ;0xc7fff54
HandleUERR01 EQU _ISR_STARTADDRESS + 0x58 ;0xc7fff58
HandleWDT EQU _ISR_STARTADDRESS + 0x5c ;0xc7fff5c
HandleBDMA1 EQU _ISR_STARTADDRESS + 0x60 ;0xc7fff60
HandleBDMA0 EQU _ISR_STARTADDRESS + 0x64 ;0xc7fff64
HandleZDMA1 EQU _ISR_STARTADDRESS + 0x68 ;0xc7fff68
HandleZDMA0 EQU _ISR_STARTADDRESS + 0x6c ;0xc7fff6c
HandleTICK EQU _ISR_STARTADDRESS + 0x70 ;0xc7fff70
HandleEINT4567 EQU _ISR_STARTADDRESS + 0x74 ;0xc7fff74
HandleEINT3 EQU _ISR_STARTADDRESS + 0x78 ;0xc7fff78
HandleEINT2 EQU _ISR_STARTADDRESS + 0x7c ;0xc7fff7c
HandleEINT1 EQU _ISR_STARTADDRESS + 0x80 ;0xc7fff80
HandleEINT0 EQU _ISR_STARTADDRESS + 0x84 ;0xc7fff84
;***************************************************************
;引入全局变量
;***************************************************************
IMPORT |Image$$RO$$Base| ; ROM code start
IMPORT |Image$$RO$$Limit| ; RAM data starts after ROM program
IMPORT |Image$$RW$$Base| ; Pre-initialised variables
IMPORT |Image$$RW$$Limit| ; End of Variable RAM space
IMPORT |Image$$ZI$$Base| ; uninitialised variables
IMPORT |Image$$ZI$$Limit| ; End of variable RAM space
IMPORT Main
IMPORT OSTickISR
;***************************************************************
;程序入口点,Init段
;***************************************************************
AREA Init,CODE,READONLY
ENTRY
ResetEntry
b ResetHandler ;复位异常跳转
b HandlerUndef ;未定义指令异常跳转
b HandlerSWI ;软件中断异常跳转
b HandlerPabort ;指令预取中止异常跳转
b HandlerDabort ;数据访问中止异常跳转
b . ;保留
b HandlerIRQ ;IRQ中断异常跳转
b HandlerFIQ ;FIQ中断异常跳转
;***************************************************************
;未定义指令异常跳入口
;***************************************************************
HandlerUndef
b .
;***************************************************************
;软件中断异常跳转
;***************************************************************
HandlerSWI
b .
;***************************************************************
;指令预取中止异常跳转
;***************************************************************
HandlerPabort
b .
;***************************************************************
;数据访问中止异常跳转
;***************************************************************
HandlerDabort
b .
;***************************************************************
;IRQ中断异常入口
;***************************************************************
HandlerIRQ
b IsrIRQ
; sub sp,sp,#4 ;
; stmfd sp!,{r0} ;
;
;
; ldr r0,=HandleIRQ ;
; ldr r0,[r0] ;
;
; str r0,[sp,#4] ;
; ldmfd sp!,{r0,pc} ;
;***************************************************************
;FIQ中断异常入口
;***************************************************************
HandlerFIQ
b .
ResetHandler
;***************************************************************
;禁止中断并转到SVC模式
;CPSR
; 31 30 29 28 7 6 5 4 3 2 1 0
; N Z C V I F T M4 M3 M2 M1 M0
; | | | | | | | 1 0 0 0 0 用户
; | | | | | | | 1 0 0 0 1 FIQ
; | | | | | | | 1 0 0 1 0 IRQ
; | | | | | | | 1 0 0 1 1 SVC
; | | | | | | | 1 0 1 1 1 中止
; | | | | | | | 1 1 0 1 1 未定义
; | | | | | | | 1 1 1 1 1 系统
; | | | --Overflow | | --工作状态位 1:Thumb 0:ARM
; | | ------Carry | --------FIQ中断禁止位 1:Disable 0:Enable
; | ----------Zero --------------IRQ中断禁止位 1:Disable 0:Enable
; --------------Negative
;
;***************************************************************
mrs r0,CPSR
bic r0,r0,#0x1f ;清模式位
orr r0,r0,#0x13 ;设为SVC模式
orr r0,r0,#0xc0 ;关IRQ和FIQ
msr CPSR_cxsf,r0 ;启用新的CPSR
;***************************************************************
;禁止所有中断
;***************************************************************
ldr r0,=rINTCON ;
ldr r1,=0x07 ;非矢量中断模式,关IRQ和FIQ
str r1,[r0] ;
ldr r0,=rINTMSK ;
ldr r1,=0x07ffffff ;关所有中断
str r1,[r0] ;
;***************************************************************
;关看门狗
;***************************************************************
ldr r0,=rWTCON ;
ldr r1,=0x0 ;
str r1,[r0] ;
;***************************************************************
;配置cache
;***************************************************************
ldr r0,=rSYSCFG ;
ldr r1,=0x0e ;
str r1,[r0] ;
ldr r0,=rNCACHBE0 ;
ldr r1,=0xb0000000 ;
str r1,[r0] ;
ldr r0,=rNCACHBE1 ;
ldr r1,=0xc000c000 ;
str r1,[r0] ;
;***************************************************************
;配置PORT A,把PORT A配置为地址总线
;ADDR24 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0
; 1 1 1 1 1 1 1 1 1 1
;
;***************************************************************
ldr r0,=rPCONA ;
ldr r1,=0x3ff ;
str r1,[r0] ;
;***************************************************************
;配置PORT B
;nGCS0 - FLASH
;nGCS1 - 74HC244 AND 74HC273
;nGCS2 - CS8900A
;nGCS3 - PDIUSBD12
;nGCS4 - SEG7
;nGCS5 -
;nSCS6 - SDRAM
;
;nGCS5 nGCS4 nGCS3 nGCS2 nGCS1 nWBE3 nWBE2 nSRAS nSCAS SCLK SCKE
; 1 1 1 1 1 1 1 1 1 1 1
;
;***************************************************************
ldr r0,=rPCONB ;
ldr r1,=0x7ff ;
str r1,[r0] ;
;***************************************************************
;配置PORT C
;nCTS0 nRTS0 OUTPUT OUTPUT OUTPUT OUTPUT OUTPUT OUTPUT VD4 VD5 VD6 VD7 IISCLK IISDI IISDO IISLRCK
; 11 11 01 01 01 01 01 01 11 11 11 11 11 11 11 11
;
;***************************************************************
ldr r0,=rPCONC ;
ldr r1,=0xf555ffff ;
str r1,[r0] ;
ldr r0,=rPUPC ;
ldr r1,=0x00ff ;
str r1,[r0] ;
ldr r0,=rPDATC ;
ldr r1,=0xeeff ;
str r1,[r0] ;
;***************************************************************
;配置PORT D
;VFRAME VM VLINE VCLK VD3 VD2 VD1 VD0 (LCD/MODE)
; 10 10 10 10 10 10 10 10
;
;***************************************************************
ldr r0,=rPCOND ;
ldr r1,=0xaaaa ;
str r1,[r0] ;
ldr r0,=rPUPD ;
ldr r1,=0xff ;
str r1,[r0] ;
;***************************************************************
;配置PORT E
;CODECLK OUTPUT OUTPUT OUTPUT OUTPUT OUTPUT TOUT0 RXD0 TXD0 FOUT OUT
; 10 01 01 01 01 01 10 10 11
;***************************************************************
ldr r0,=rPCONE ;
ldr r1,=0x255ab ;
str r1,[r0] ;
ldr r0,=rPDATE ;
ldr r1,=0x0f ;
str r1,[r0] ;
ldr r1,=rPUPE ;
ldr r0,=0x0 ;
str r0,[r1] ;
;***************************************************************
;配置PORT F
;
;***************************************************************
ldr r0,=rPCONF ;
ldr r1,=0x124be9 ;
str r1,[r0] ;
ldr r0,=rPUPF ;
ldr r1,=0xff ;
str r1,[r0] ;
;***************************************************************
;配置PORT G
;
;***************************************************************
ldr r0,=rPCONG ;
ldr r1,=0x57ff ;
str r1,[r0] ;
ldr r0,=rPUPG ;
ldrb r1,=0x00 ;只装载一个字节
strb r1,[r0] ;
;***************************************************************
;配置上拉电阻控制寄存器(SPUCR)
;***************************************************************
ldr r0,=rSPUCR ;
ldrb r1,=0x7 ;
strb r1,[r0] ;控制信号保持高阻状态,DATA[15;0]上拉电阻不允许
;***************************************************************
;配置外部中断控制寄存器(EXTINT)
;***************************************************************
ldr r0,=rEXTINT ;
ldr r1,=0x42422 ;
str r1,[r0] ;
ldr r0,=rINTMSK ;
ldr r1,=0x7ffffff ;
str r1,[r0] ;
;***************************************************************
;配置时钟控制
;***************************************************************
ldr r0,=rLOCKTIME ;
ldr r1,=800 ;
str r1,[r0] ;
ldr r0,=rPLLCON ;
ldr r1, =0x34031 ;
str r1,[r0] ;
ldr r0,=rCLKCON ;
ldr r1,=0x7ff8 ;
str r1,[r0] ;
;***************************************************************
;配置存储器控制
;***************************************************************
ldr r0,=rBWSCON ;
ldr r1,=0x11000100 ;
str r1,[r0] ;
ldr r0,=rBANKCON0 ;
ldr r1,=0x700 ;
str r1,[r0] ;
ldr r0,=rBANKCON1 ;
ldr r1,=0x700 ;
str r1,[r0] ;
ldr r0,=rBANKCON2 ;
ldr r1,=0x700 ;
str r1,[r0] ;
ldr r0,=rBANKCON3 ;
ldr r1,=0x7568 ;
str r1,[r0] ;
ldr r0,=rBANKCON4 ;
ldr r1,=0x700 ;
str r1,[r0] ;
ldr r0,=rBANKCON5 ;
ldr r1,=0x700 ;
str r1,[r0] ;
ldr r0,=rBANKCON6 ;
ldr r1,=0x18008 ;
str r1,[r0] ;
ldr r0,=rBANKCON7 ;
ldr r1,=0x18000 ;
str r1,[r0] ;
ldr r0,=rREFRESH ;
ldr r1,=0xac03e1 ;
str r1,[r0] ;
ldr r0,=rBANKSIZE ;
ldr r1,=0x16 ;
str r1,[r0] ;
ldr r0,=rMRSRB6 ;
ldr r1,=0x020 ;
str r1,[r0] ;
ldr r0,=rMRSRB7 ;
ldr r1,=0x020 ;
str r1,[r0] ;
;***************************************************************
;调用初始化堆栈
;***************************************************************
ldr sp, =SVCStack ;
bl InitStacks ;
;***************************************************************
;设置IRQ Handler
;***************************************************************
; ldr r0,=HandleIRQ ;
; ldr r1,=IsrIRQ ;
; str r1,[r0] ;
;***************************************************************
;初始化RAM
; ----------------------- ----
; | | |
; |-----------------------| |
; | | |
; |-----------------------| R
; | | A
; |-----------------------| M
; | | |
; |-----------------------| |
; | | |
; |=======================| ----
; | | |
; |-----------------------| |
; | | |
; |-----------------------| |
; | | |
; |-----------------------| R
; | Initialized RW Segment| O
; |-----------------------| M
; | RO Segment | |
; ----------------------- ----
; (Load View)
;
;
;
; ----------------------- ----
; | | |
; |-----------------------| |
; | | |
; |-----------------------| R
;Image$$ZI$$Limit | | A
;Image$$RW$$Limit----> |-----------------------| M
; | ZI Segment | |
;Image$$ZI$$Base ----> |-----------------------| |
; | Initialized RW Segment| |
;Image$$RW$$Base ----> |=======================| ----
; | | |
; |-----------------------| |
; | | |
; |-----------------------| |
; | | |
; |-----------------------| R
; | | O
;Image$$RO$$Limit----> |-----------------------| M
; | RO Segment | |
;Image$$RO$$Base ----> ----------------------- ----
; (Excute View)
;***************************************************************
ldr r0,ImageZIBase ;
mov r2,#0 ;
ldr r1,ImageZILimit ;
cmp r0,r1 ;比较ImageZIBase与ImageZILimit是否相等
beq move_data ;如果相等就是说不用清零
clear_loop
str r2,[r0],#4 ;
cmp r0,r1 ;
bne clear_loop ;
move_data
ldr r0,ImageRWBase ;
ldr r1,ImageROLimit ;
ldr r2,ImageZIBase ;
cmp r0,r2 ;比较ImageRWBase与ImageZIBase是否相等
beq goto_main ;如果相等说明RW段为零,即没有变量,则可进入主函数
move_loop
ldr r3,[r1],#4 ;否则把Initialized RW Segment段拷到应有的位置
str r3,[r0],#4 ;
cmp r0,r2 ;
bne move_loop ;
;***************************************************************
;进入C语言主函数
;***************************************************************
goto_main
b Main ;
;***************************************************************
;初始化堆栈过程
;***************************************************************
InitStacks
mrs r0,cpsr ;
bic r0,r0,#0x1f ;
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|0x80 ;
orr r1,r0,#SVCMODE ;
msr cpsr_cxsf,r1 ;
ldr sp,=SVCStack ;
mov pc,lr ;
;***************************************************************
;中断分发函数
;***************************************************************
IsrIRQ
; sub lr,lr,#4 ;
; stmfd sp!,{lr} ;
; stmfd sp!,{r0-r4} ;
sub sp,sp,#4 ;
stmfd sp!,{r8-r9} ;
ldr r9,=rI_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] ;
; mov lr,pc ;
ldmfd sp!,{r8-r9,pc} ;
; ldmfd sp!,{r0-r4,pc}^ ;
2
ldmfd sp!,{r8-r9} ;
add sp,sp,#4 ;
sub lr,lr,#4
mov pc,lr
; ldmfd sp!,{r0-r4,pc}^ ;
;************************************
;暂时的中断分发函数,只响应timer0中断,如果有其他中断就直接返回
;IsrIRQ
; stmfd sp!,{r8-r9} ;/* save r8-r9 */
; ldr r9,=rI_ISPR ;/* distribute the irq */
; ldr r9,[r9]
; cmp r9, #0x0
; beq i2
; mov r8,#0x0
;i0 ;/* check every bit */
; movs r9,r9,lsr #1
; bcs i1
; add r8,r8,#4
; b i0 ; /* next bit */
;i1 ;/* one interrupt trigged*/
; ldr r9,=HandleADC ;/* isr vector base address */
; add r9,r9,r8 ;/* compute the offset */
; ldr r8,=HandleTIMER0
; cmp r9, r8
; beq i3
; ldr r9,[r9] ;/* obtain the isr address */
; stmfd sp!,{lr} ;/* save lr */
; mov lr,pc ;/* return to 'ldmfd sp!,{r0-r4, pc}^' */
; mov pc,r9
; ldmfd sp!,{lr} ;/* restore r8-r9, call isr and return */
; ldmfd sp!,{r8-r9}
; subs pc, lr, #4 ;/* restore r0-r4 and return */
;i2
; ldmfd sp!,{r8-r9} ;/* restore the r8-r9 */
; subs pc, lr, #4 ;/* restore r0-r4 and return */
;i3
; ldmfd sp!,{r8-r9} ;/* restore the r8-r9 */
; b OSTickISR
;***************************************************************
;定义变量
;***************************************************************
ImageROBase DCD |Image$$RO$$Base|
ImageROLimit DCD |Image$$RO$$Limit|
ImageRWBase DCD |Image$$RW$$Base|
ImageRWLimit DCD |Image$$RW$$Limit|
ImageZIBase DCD |Image$$ZI$$Base|
ImageZILimit DCD |Image$$ZI$$Limit|
END