44binit分析.docx
- 文档编号:10909077
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:16
- 大小:18.41KB
44binit分析.docx
《44binit分析.docx》由会员分享,可在线阅读,更多相关《44binit分析.docx(16页珍藏版)》请在冰豆网上搜索。
44binit分析
;****************************************************************************
;Name:
44BINIT.S
*
;Modified:
2004-4-2620:
26
*
;Description:
*
;Cstartupcodes
*
;Configurememory,InitializeISR,stacks
*
; InitializeC-variables
*
;Fillzerosintozero-initializedC-variables
*
;****************************************************************************
INCLUDEoption.inc
INCLUDEmemcfg.inc
;****************************************************************************
;存储器空间
;GCS664M16bit(8MB)DRAM/SDRAM(0xc000000-0xc7fffff)
;APP RAM=0xc000000~0xc7effff
;44BMONRAM=0xc7f0000-0xc7fffff
;STACK =0xc7ffa00
;****************************************************************************
;中断控制预定义
;INTCON0x01e00000 ;中断控制寄存器
INTPND EQU0x01e00004 ;中断挂起寄存器
INTMOD EQU0x01e00008 ;中断模式寄存器
INTMSK EQU0x01e0000c ;中断屏蔽寄存器
;IRQ中断向量模式寄存器
I_ISPR EQU0x01e00020 ;IRQ中断服务挂起寄存器
I_CMST EQU0x01e0001c ;当前master寄存器的IRQ优先级
;****************************************************************************
;看门狗定时器预定义
WTCON EQU0x01d30000
;****************************************************************************
;系统时钟预定义
PLLCON EQU0x01d80000 ;复位值0x38080
CLKCON EQU0x01d80004 ;初始值0x7ff8
;CLKSLOW EQU0x01d80008 ;慢时钟控制寄存器 初始值 0x9
LOCKTIME EQU0x01d8000c ;锁定时间计数值寄存器 初始值0xfff
;****************************************************************************
;存储器控制预定义
REFRESH EQU0x01c80024 ;dram/sdram刷新控制寄存器 初始值0xac0000
;****************************************************************************
;BDMA目的寄存器
BDIDES0 EQU0x1f80008 ;BDMA0当前目标地址寄存器初始值0x00000000
BDIDES1 EQU0x1f80028 ;BDMA1初始目标地址寄存器初始值0x00000000
;****************************************************************************
;预定义常数(常量)
USERMODE EQU0x10
FIQMODE EQU0x11
IRQMODE EQU0x12
SVCMODE EQU0x13
ABORTMODE EQU0x17
UNDEFMODE EQU0x1b
MODEMASK EQU0x1f
NOINT EQU0xc0
;****************************************************************************
;检查是否使用tasm.exe进行编译
GBLL THUMBCODE
[{CONFIG}=16
THUMBCODESETL{TRUE}
CODE32
|
THUMBCODESETL{FALSE}
]
[THUMBCODE
CODE32 ;forstart-upcodeforThumbmode
]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;
IMPORT Main;Themainentryofmon
program
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Code
Begin;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AREA Init,CODE,READONLY
ENTRY
ResetEntry
bResetHandler;fordebug
ldrpc,=0x0c000004;handlerUndef
ldrpc,=0x0c000008;SWIinterrupthandler
ldrpc,=0x0c00000c;handlerPAbort
ldrpc,=0x0c000010;handlerDAbort
b.
;handlerReserved
ldrpc,=0x0c000018
ldrpc,=0x0c00001c
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;
;复位中断处理函数
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;
ResetHandler
ldr r0,=WTCON ;禁止看门狗
ldr r1,=0x0
str r1,[r0]
ldr r0,=INTMSK
ldr r1,=0x07ffffff ;禁止所有中断
str r1,[r0]
;以下三段设置时钟控制寄存器
ldrr0,=LOCKTIME
ldrr1,=0xfff
strr1,[r0]
ldrr0,=PLLCON ;锁相环倍
频设定
ldrr1,=((M_DIV<<12)+(P_DIV<<4)+S_DIV);设定
系统主时钟频率
strr1,[r0]
ldr r0,=CLKCON
ldr r1,=0x7ff8 ;所有功能单元块时钟使能
str r1,[r0]
;****************************************************
;changeBDMACONresetvalueforBDMA *
;****************************************************
;传输的数据类型是halfword
ldr r0,=BDIDES0
ldr r1,=0x40000000 ;BDIDESnresetvalueshouldbe0x40000000
str r1,[r0]
ldr r0,=BDIDES1
ldr r1,=0x40000000 ;BDIDESnresetvalueshouldbe0x40000000
str r1,[r0]
;****************************************************
;设定存储器控制寄存器 *
;****************************************************
adrr0,ResetHandler ;把参照的地址ResetHandler装载到给
定寄存器r0中
ldrr1,=ResetHandler ;装载=ResetHandler到内存
subr0,r1,r0 ;R0=R1-R0
ldrr1,=SMRDATA
subr0,r1,r0
ldmia r0,{r1-r13} ;同时装载多个寄存器到内存R0中持有
的值指定的内存地址在每次装载之后增加R0 r0!
->r1-r13
ldrr0,=0x01c80000;BWSCONAddress
stmia r0,{r1-r13} ;同时存储多个寄存器从内存R0中持有的值
指定的内存地址在每次存储之后增加R0 r1-r13->r0
;****************************************************
;修正内存大小 *
;****************************************************
movr0,#0
ldrr1,=0x0c000000
ldrr2,=0x0c000200
strr0,[r1]
movr0,#-1
strr0,[r2]
ldrr0,[r1]
cmpr0,#0
ldrner0,=0x01c8001c
ldrner1,=((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN8))
strner1,[r0]
strner1,[r0,#4]
;****************************************************
;初始化堆栈 *
;****************************************************
ldr sp,=SVCStack;复位后位SVC模式
bl InitStacks
;****************************************************
;拷贝并粘贴RWdata/zeroinitializeddata *
;****************************************************
adrr0, ResetEntry
ldrr1,BaseOfROM
cmpr0,r1
ldreq r0,TopOfROM ;如果相等
beqInitRamData
;****************************************************
;计算拷贝程序在flash中的实际位置 *
;****************************************************
ldrr2,=CopyProcBeg
subr1,r2,r1 ;CopyProcBeg-BaseOfROM
addr0,r0,r1;(CopyProcBeg-BaseOfROM)+TopOfROM
ldrr3,=CopyProcEnd
;****************************************************
;将拷贝程序复制到ram中 *
;****************************************************
0
ldmiar0!
{r4-r7} ;拷贝程序
stmiar2!
{r4-r7}
cmpr2,r3
bcc%B0
;********************************************************
;开始用ram中的拷贝程序复本将所有剩下的代码复制到ram中*
;********************************************************
ldrr3,TopOfROM
ldrpc,=CopyProcBeg
;********************************************************
;本段将代码由实际烧入的地址拷贝到ro-base所指定的位置*
;只拷贝CopyProcEnd以后的代码*
;********************************************************
CopyProcBeg
0
ldmiar0!
{r4-r11}
stmiar2!
{r4-r11}
cmpr2,r3
bcc%B0
CopyProcEnd
subr1,r2,r3
subr0,r0,r1
InitRamData
ldrr2,BaseOfBSS
ldrr3,BaseOfZero
0
cmpr2,r3
ldrccr1,[r0],#4
strccr1,[r2],#4
bcc%B0
movr0,#0
ldrr3,EndOfBSS
1
cmpr2,r3
strccr0,[r2],#4
bcc%B1
[:
LNOT:
THUMBCODE
BLMain ;从汇编进入C语言代码空间,不要使
用main()
B.
]
[THUMBCODE ;forstart-upcodeforThumbmode
orr lr,pc,#1
bx lr
CODE16
bl Main ;从汇编进入C语言代码空间,不要使用main()
b .
CODE32
]
LTORG
;***********************************************
IMPORT|Image$$RO$$Base|;ROMcodestart
IMPORT|Image$$RO$$Limit|;RAMdatastartsafterROMprogram
IMPORT|Image$$RW$$Base|;Pre-initialisedvariables
IMPORT|Image$$ZI$$Base|;uninitialisedvariables
IMPORT|Image$$ZI$$Limit|;EndofvariableRAMspace
BaseOfROMDCD|Image$$RO$$Base|
TopOfROMDCD|Image$$RO$$Limit|
BaseOfBSSDCD|Image$$RW$$Base|
BaseOfZeroDCD|Image$$ZI$$Base|
EndOfBSSDCD|Image$$ZI$$Limit|
EXPORTGetBaseOfROM
EXPORTGetEndOfROM
EXPORTGetBaseOfBSS
EXPORTGetBaseOfZero
EXPORTGetEndOfBSS
GetBaseOfROM
ldrr0,BaseOfROM
movpc,lr
GetEndOfROM
ldrr0,TopOfROM
movpc,lr
GetBaseOfBSS
ldrr0,BaseOfBSS
movpc,lr
GetBaseOfZero
ldrr0,BaseOfZero
movpc,lr
GetEndOfBSS
ldrr0,EndOfBSS
movpc,lr
;****************************************************
;*Thefunctionforinitializingstack
*
;****************************************************
InitStacks
;DonotuseDRAM,suchasstmfd,ldmfd......
;SVCstackisinitializedbefore
;Undertoolkitver2.50,'msrcpsr,r1'canbeusedinsteadof'msr
cpsr_cxsf,r1'
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
;USERmodeisnotinitialized.
mov pc,lr;TheLRregistermaybenotvalidforthemodechanges.
LTORG
SMRDATADATA
;*****************************************************************
;Memoryconfigurationhastobeoptimizedforbestperformance *
;Thefollowingparameterisnotoptimized. *
;*****************************************************************
;***memoryaccesscycleparameterstrategy***
;1)EvenFP-DRAM,EDOsettinghasmorelatefetchpointbyhalf-clock
;2)Thememorysettings,here,aremadethesafeparametersevenat66Mhz.
;3)FP-DRAMParameters:
tRCD=3fortRAC,tcas=2forpaddelay,tcp=2forbus
load.
;4)DRAMrefreshrateisfor40Mhz.
;bank016bitBOOTROMSST39VF160/SST39VF320 ;yes
;bank18bitNandFlashK9F2808U0A/K9F5608U0A ;no
;bank216bitUSB1.1PDIUSBD12
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 44 binit 分析