📄 44binit.s
字号:
;****************************************************************************
; Name : 44BINIT.S *
; Modified : GongJun 2004-4-26 20:26 *
; Description: *
; C start up codes *
; Configure memory, Initialize ISR ,stacks *
; Initialize C-variables *
; Fill zeros into zero-initialized C-variables *
;****************************************************************************
INCLUDE option.inc
INCLUDE memcfg.inc
;****************************************************************************
;存储器空间
;GCS6 64M 16bit(8MB) DRAM/SDRAM(0xc000000-0xc7fffff)
;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
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
]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IMPORT Main ;The main entry of mon program
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IMPORTANT NOTE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;If the H/W vectored interrutp mode is enabled, The above two instructions should ;
;be changed like below, to work-around with H/W bug of S3C44B0X interrupt controller. ;
; b HandlerIRQ -> subs pc,lr,#4 ;
; b HandlerIRQ -> subs pc,lr,#4 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;中断向量表
VECTOR_BRANCH
ldr pc,=HandlerEINT0 ;mGA 0x20
ldr pc,=HandlerEINT1 ;
ldr pc,=HandlerEINT2 ;
ldr pc,=HandlerEINT3 ;
ldr pc,=HandlerEINT4567 ;
ldr pc,=HandlerTICK ;mGA 0x34
b .
b .
ldr pc,=HandlerZDMA0 ;mGB 0x40
ldr pc,=HandlerZDMA1 ;
ldr pc,=HandlerBDMA0 ;
ldr pc,=HandlerBDMA1 ;
ldr pc,=HandlerWDT ;
ldr pc,=HandlerUERR01 ;mGB 0x54
b .
b .
ldr pc,=HandlerTIMER0 ;mGC 0x60
ldr pc,=HandlerTIMER1 ;
ldr pc,=HandlerTIMER2 ;
ldr pc,=HandlerTIMER3 ;
ldr pc,=HandlerTIMER4 ;
ldr pc,=HandlerTIMER5 ;mGC 0x74
b .
b .
ldr pc,=HandlerURXD0 ;mGD 0x80
ldr pc,=HandlerURXD1 ;
ldr pc,=HandlerIIC ;
ldr pc,=HandlerSIO ;
ldr pc,=HandlerUTXD0 ;
ldr pc,=HandlerUTXD1 ;mGD 0x94
b .
b .
ldr pc,=HandlerRTC ;mGKA 0xa0
b .
b .
b .
b .
b . ;mGKA
b .
b .
ldr pc,=HandlerADC ;mGKB 0xc0
b . ;
b . ;
b . ;
b . ;
b . ;mGKB
b .
b .
ldr pc,=EnterPWDN ;0xe0=EnterPWDN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;向量中断的处理方法 ;
;Example: HandlerADC HANDLE HandleADC 解为 ;
;HandlerADC ;HandlerADC为中断向量表的入口 ;
; sub sp,sp,#4 ;将sp减少一个字节,使其在堆栈高端留出存储返回地址,因为pc在寄存器组中的 ;
; ;的位置大于r0,出栈时装入的是栈的高端的内容 ;
; stmfd sp!,{r0} ;保存r0 ;
; ldr r0,=HandleADC ;装载中断处理函数的指针 ;
; ldr r0,[r0] ;装载中断处理函数的地址 ;
; str r0,[sp,#4] ;将中断处理函数的地址存入刚才预留的位置,r0的上面 ;
; ldmfd sp!,{r0,pc} ;出栈后,pc指向的既是中断处理函数的地址 ;
; ;
; INTCON^2 == 0时,vector table使能 ;
; 发生中断->HandlerADC->HandleADC(pISR_ADC,即:_ISR_STARTADDRESS+0x20); ;
; 若要在程序中处理此中断,只要将中断服务函数的指针赋给pISR_ADC,如:pISR_ADC = (int)ADCIsr ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;复位中断处理函数 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ResetHandler
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]
[ PLLONSTART
ldr r0,=PLLCON ;锁相环倍频设定
ldr r1,=((M_DIV<<12)+(P_DIV<<4)+S_DIV) ;设定系统主时钟频率
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模式
bl InitStacks
;****************************************************
;设置中断处理 *
;****************************************************
ldr r0,=HandleIRQ ;This routine is needed
ldr r1,=IsrIRQ ;if there is not 'subs pc,lr,#4' at 0x18, 0x1c
str r1,[r0]
;****************************************************
;拷贝并粘贴 RW data/zero initialized data *
;****************************************************
adr r0, ResetEntry
ldr r1, BaseOfROM
cmp r0, r1
ldreq r0, TopOfROM
beq InitRamData
;****************************************************
;计算拷贝程序在flash中的实际位置 *
;****************************************************
ldr r2, =CopyProcBeg
sub r1, r2, r1
add r0, r0, r1
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
;********************************************************
;本段将代码由实际烧入的地址拷贝到ro-base所指定的位置 *
;只拷贝CopyProcEnd以后的代码 *
;********************************************************
CopyProcBeg
0
ldmia r0!, {r4-r11}
stmia r2!, {r4-r11}
cmp r2, r3
bcc %B0
CopyProcEnd
sub r1, r2, r3
sub r0, r0, r1
InitRamData
ldr r2, BaseOfBSS
ldr r3, BaseOfZero
0
cmp r2, r3
ldrcc r1, [r0], #4
strcc r1, [r2], #4
bcc %B0
mov r0, #0
ldr r3, EndOfBSS
1
cmp r2, r3
strcc r0, [r2], #4
bcc %B1
[ :LNOT:THUMBCODE
BL Main ;从汇编进入C语言代码空间,不要使用main()
B .
]
[ THUMBCODE ;for start-up code for Thumb mode
orr lr,pc,#1
bx lr
CODE16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -