📄 44binit.s
字号:
GET option.s
GET memcfg.s
;Interrupt Control
INTPND EQU 0x01e00004
INTMOD EQU 0x01e00008
INTMSK EQU 0x01e0000c
I_ISPR EQU 0x01e00020
I_CMST EQU 0x01e0001c
;Watchdog timer
WTCON EQU 0x01d30000
;Clock Controller
PLLCON EQU 0x01d80000
CLKCON EQU 0x01d80004
LOCKTIME EQU 0x01d8000c
;Memory Controller
REFRESH EQU 0x01c80024
;Pre-defined constants
USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x13
ABORTMODE EQU 0x17
UNDEFMODE EQU 0x1b
MODEMASK EQU 0x1f
SYS32Mode equ 0x1f
NOIRQ EQU 0x80
NOFIQ EQU 0x40
IMPORT |Image$$RO$$Limit|
IMPORT |Image$$RW$$Base|
IMPORT |Image$$ZI$$Base|
IMPORT |Image$$ZI$$Limit|
IMPORT Main
import SoftwareInterrupt
export SVCStack
export UserStack
CODE32
AREA Init,CODE,READONLY
ENTRY
b ResetHandler ;<------------系统的中断向量表
b HandlerUndef
ldr pc,HandlerSWI
b HandlerPabort
b HandlerDabort
b .
b HandlerIRQ
b HandlerFIQ
;//由44b0定义的各个中断向量
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 ;mGB
b .
b .
ldr pc,=HandlerTIMER0 ;mGC
ldr pc,=HandlerTIMER1 ;
ldr pc,=HandlerTIMER2 ;
ldr pc,=HandlerTIMER3 ;
ldr pc,=HandlerTIMER4 ;
ldr pc,=HandlerTIMER5 ;mGC
b .
b .
ldr pc,=HandlerURXD0 ;mGD
ldr pc,=HandlerURXD1 ;
ldr pc,=HandlerIIC ;
ldr pc,=HandlerSIO ;
ldr pc,=HandlerUTXD0 ;
ldr pc,=HandlerUTXD1 ;mGD
b .
b .
ldr pc,=HandlerRTC ;mGKA
b . ;
b . ;
b . ;
b . ;
b . ;mGKA
b .
b .
ldr pc,=HandlerADC ;mGKB
b . ;
b . ;
b . ;
b . ;
b . ;mGKB
b .
b .
;//系统各个模式的中断服务程序
;
;//只有swi中断实现用于提供开关中断的系统服务
;//其他的为中断死循环操作,可以用于调试检错
HandlerSWI dcd SoftwareInterrupt
HandlerUndef
b .
HandlerPabort
b .
HandlerDabort
b .
HandlerIRQ
b .
HandlerFIQ
b .
;//44b0的矢量中断的第一次服务
;//说明:当中断产生后首先跳入flash中的中断向量入口处,在flash中再跳入ram的中断服务程序入口
;// 向量表,然后程序执行下面的ADD_HANDLER服务程序,将存放在高端ram中的中断服务程序入口地址
;// 加载如pc中,是cpu执行中断服务程序
;//
;//
MACRO
$MIDADD ADD_HANDLER $FINALADD
$MIDADD
sub sp,sp,#4
stmfd sp!,{r0}
ldr r0,=$FINALADD
ldr r0,[r0]
str r0,[sp,#4]
ldmfd sp!,{r0,pc}
mend
HandlerEINT0 ADD_HANDLER HandleEINT0
HandlerEINT1 ADD_HANDLER HandleEINT1
HandlerEINT2 ADD_HANDLER HandleEINT2
HandlerEINT3 ADD_HANDLER HandleEINT3
HandlerEINT4567 ADD_HANDLER HandleEINT4567
HandlerTICK ADD_HANDLER HandleTICK
HandlerZDMA0 ADD_HANDLER HandleZDMA0
HandlerZDMA1 ADD_HANDLER HandleZDMA1
HandlerBDMA0 ADD_HANDLER HandleBDMA0
HandlerBDMA1 ADD_HANDLER HandleBDMA1
HandlerWDT ADD_HANDLER HandleWDT
HandlerUERR01 ADD_HANDLER HandleUERR01
HandlerTIMER0 ADD_HANDLER HandleTIMER0
HandlerTIMER1 ADD_HANDLER HandleTIMER1
HandlerTIMER2 ADD_HANDLER HandleTIMER2
HandlerTIMER3 ADD_HANDLER HandleTIMER3
HandlerTIMER4 ADD_HANDLER HandleTIMER4
HandlerTIMER5 ADD_HANDLER HandleTIMER5
HandlerURXD0 ADD_HANDLER HandleURXD0
HandlerURXD1 ADD_HANDLER HandleURXD1
HandlerIIC ADD_HANDLER HandleIIC
HandlerSIO ADD_HANDLER HandleSIO
HandlerUTXD0 ADD_HANDLER HandleUTXD0
HandlerUTXD1 ADD_HANDLER HandleUTXD1
HandlerRTC ADD_HANDLER HandleRTC
HandlerADC ADD_HANDLER HandleADC
;//系统的初始化函数
;//系统复位时就会跳转到此处执行系统初始化
ResetHandler
mrs r0,cpsr ;<-----------------关中断
orr r0,r0,#0xc0
msr cpsr_c,r0
ldr r0,=WTCON ;<-----------------关掉看门狗
ldr r1,=0x0
str r1,[r0]
ldr r0,=INTMSK ;<-----------------所有的中断均屏蔽
ldr r1,=0x07ffffff ;all interrupt disable
str r1,[r0]
ldr r0,=LOCKTIME ;<----------------系统的时钟设定
ldr r1,=800
str r1,[r0]
ldr r0,=PLLCON ;temporary setting of PLL
ldr r1,=((M_DIV<<12)+(P_DIV<<4)+S_DIV) ;Fin=10MHz,Fout=40MHz
str r1,[r0]
ldr r0,=CLKCON
ldr r1,=0x7ff8 ;All unit block CLK enable
str r1,[r0]
ldr r0,=SMRDATA ;<----------------系统的存储配置
ldmia r0,{r1-r13}
ldr r0,=0x01c80000 ;BWSCON Address
stmia r0,{r1-r13}
bl InitStacks ;<---------------各个模式的堆栈模式的设定
;<---------------c语言中数据和为初始化的数据搬移
LDR r0, =|Image$$RO$$Limit| ; Get pointer to ROM data
LDR r1, =|Image$$RW$$Base| ; and RAM copy
LDR r3, =|Image$$ZI$$Base|
;Zero init base => top of initialised data
CMP r0, r1 ; Check that they are different
BEQ %F1
0
CMP r1, r3 ; Copy init data
LDRCC r2, [r0], #4 ;--> LDRCC r2, [r0] + ADD r0, r0, #4
STRCC r2, [r1], #4 ;--> STRCC r2, [r1] + ADD r1, r1, #4
BCC %B0
1
LDR r1, =|Image$$ZI$$Limit| ; Top of zero init segment
MOV r2, #0
2
CMP r3, r1 ; Zero init
STRCC r2, [r3], #4
BCC %B2
BL Main ;<------------------------跳转到用户的C的Main函数
B .
;//初始化各个模式的堆栈空间,由系统的初始化部分调用
InitStacks
mov r0,lr
msr cpsr_c,#0xd3
ldr sp,=SVCStack
msr cpsr_c,#0xd1
ldr sp,=FIQStack
msr cpsr_c,#0xd2
ldr sp,=IRQStack
msr cpsr_c,#0xd7
ldr sp,=AbortStack
msr cpsr_c,#0xdb
ldr sp,=UndefStack
msr cpsr_c,#0xdf
ldr sp,=UserStack
mov pc,r0
;//存放的为44b0的内存管理系统数据用来初始化
LTORG
SMRDATA DATA
DCD 0x11110090 ;Bank0=OM[1:0], Bank1~Bank7=16bit, bank2=8bit;
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 0x16 ;SCLK power mode, BANKSIZE 32M/32M
DCD 0x20 ;MRSR6 CL=2clk
DCD 0x20 ;MRSR7
;//用户的堆栈段,及中断的目标程序的地址存储区
;
;//注意因为开辟空间时的地址是不断向上增长的
;
;//UserStack 起始与0xc7ffa00
;//SVCStack -256
;//UndefStack -0
;//AbortStack -256
;//IRQStack -256
;//FIQStack -0
ALIGN
AREA RamData, DATA, READWRITE
^ (_ISR_STARTADDRESS-0x500)
UserStack # 256 ;c1(c7)ffa00
SVCStack # 256 ;c1(c7)ffb00
UndefStack # 8 ;c1(c7)ffc00
AbortStack # 8 ;c1(c7)ffd00
IRQStack # 256 ;c1(c7)ffe00
FIQStack # 0 ;c1(c7)fff00
;//用户的各个中断的服务地址存放在0xc7fff00--0xc80000起始的地址处
;//共有256字节,但是没有全部占用
^ _ISR_STARTADDRESS
HandleReset # 4
HandleUndef # 4
XXXX # 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 + -