您的位置 首页 方案

ARM发动代码注释

\\\\\\\\\\\\\下边是完整的工程运行平台:mini2440启动代码ourdev_444408.rar(文件大小:61K)(原文件名:MicroOS.rar);—————-

\\\\\\\\\\\\\

下边是完好的工程

运转渠道:mini2440

发动代码ourdev_444408.rar(文件巨细:61K)(原文件名:MicroOS.rar)
;———————————————————————
;startup.s
;体系发动代码
;开端时刻 : 2009.5.7—–>2009.5.11
;———————————————————————

;———————————————————————
GET ./Include/s3c2440.inc ;寄存器地址信息
GET ./Include/memcfg.inc ;内存操控器装备信息

;处理器形式
USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x13
ABORTMODE EQU 0x17
UNDEFMODE EQU 0x1b
SYSMODE EQU 0x1f
;相关掩码
MODEMASK EQU 0x1f
NOINT EQU 0xc0

;各个处理器形式下仓库设置
_STACK_BASEADDRESS EQU 0x33ff8000 ;BANK664MB顶部
UserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800~
SVCStack EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800~
UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00~
AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000~
IRQStack EQU (_STACK_BASEADDRESS-0x1000) ;0x33ff7000~
FIQStack EQU (_STACK_BASEADDRESS-0x0) ;0x33ff8000~

;导入操作体系进口函数
IMPORT OSEntry

;导入外部C言语编写的反常与中止处理函数
IMPORT vectorUNDEF
IMPORT vectorSWI
IMPORT vectorPABT
IMPORT vectorDABT
IMPORT vectorIRQ
IMPORT vectorFIQ

;导入镜像装载域段开端地址
IMPORT|Image$$RO$$Limit|;EndofROMcode(=startofROMdata)
IMPORT|Image$$RW$$Base|;BaseofRAMtoinitialise
IMPORT|Image$$ZI$$Base|;Baseandlimitofarea
IMPORT|Image$$ZI$$Limit|;tozeroinitialise
;——————————————————————–

;——————————————————
AREAstartup,CODE,READONLY

ENTRY

;体系向量表

b vectorRESET ;复位向量
b vectorUNDEF ;未界说指令
b vectorSWI ;软中止
b vectorPABT ;预取指停止
b vectorDABT ;数据停止
b . ;体系保存
b vectorIRQ ;外部中止
b vectorFIQ ;快速中止
;——————————————————-

;————————————————————————–
;复位向量
;复位向量是ARM处理器上电后第一个被履行的反常
;此刻体系处理办理(SVC)形式

vectorRESET

;复位向量有以下六件事要做

;第一步 :封闭看门狗定时器屏蔽一切中止
;第二步:装备体系时钟
;第三步 :装备内存操控器
;第四步 :装备每种处理器形式下仓库指针
;第五步 :初始化镜像运转域
;第六步 :跳转到操作体系进口

;——————————————
;第一步 :封闭看门狗定时器
;具体内容请参看s3c2440a数据手册的第18章
ldr r0,=WTCON
ldr r1,=0x0
str r1,[r0,#0x0]

;屏蔽一切中止
ldrr0,=INTMSK
ldrr1,=0xffffffff
strr1,[r0]
;——————————————

;——————————————
;第二步 :装备体系时钟
;具体内容请看手册第7章

;先削减锁相环确定时刻,s3c2440a要求PLL
;确定时刻>300us,在上电时s3c2440a预设值
;mpll为晶体频率,我用的晶体频率为12MHz
;300us*12M=3600设置LOCKTIME=0xfff
;足够了
ldrr0,=LOCKTIME
ldrr1,=0xfff0fff0 ;高16为对应UPLL
;低16为对应MPLL
strr1,[r0,#0x0]

;依据器材手册咱们还有以下几个事要做
;step1.装备UPLL
;step2.装备MPLL
;注:手册要求先装备UPLL后MPLL
; 且之间要距离7NOP
; 详请看手册第7-21.
;step3.装备分频系数

;step1:
ldrr0,=UPLLCON
ldrr1,=((56<<12)+(2<<4)+2)
ldrr1,[r0]

;按手册要求刺进7个NOP
nop
nop
nop
nop
nop
nop
nop

;step2:
ldrr0,=MPLLCON
ldrr1,=((127<<12)+(2<<4)+1)
ldrr1,[r0]

;step3:
ldrr0,=CLKDIVN
ldrr1,=((0<<3)+(2<<2)+1)
ldrr1,[r0]
;——————————————

;——————————————
;第三步 :装备内存操控器
;内存操控内的寄存器器地址是接连散布的
;从0x4800_0000–0x4800_0030,所以能够
;经过一个循环顺次填入各个寄存器的内容

ldrr0,=SMRDATA ;装入装备值的地址
ldrr1,=BWSCON ;装入开端寄存器地址
addr2,r0,#0x34 ;核算结束地址

;下面是用于向内存操控器
;装入装备信息的循环
0
ldrr3,[r0],#4 ;装入装备值到r3,后变址
strr3,[r1],#4 ;把r3内包括的装备值写入
;内存操控器的寄存器
cmpr2,r0 ;结束否?
bne%B0 ;没结束则持续
;——————————————

;——————————————
;第四步 :装备每种处理器形式下仓库指针
;办法与准则:
;1: 经过CPSR寄存器切换处理器形式
;2: 对CPSR的操作方法为读-修正-写回
;3: 肯定不要跳到用户形式,越过去简单
; 回来就难了
;4:切到新处理器形式后要屏蔽IRQ和FIQ
; 避免在未设置好仓库前进入中止处理
; 程序,可是在发动代码的最早咱们已
; 经屏蔽了一切的32个中止源,所以感
; 觉是否屏蔽都能够

;step1:先把程序状况寄存器读到r0
mrs r0,cpsr

;step2:铲除处理器形式位(最前面5位)
bic r0,r0,#MODEMASK

;step3: 设置未界说状况下的仓库指针
orr r1,r0,#UNDEFMODE|NOINT
msr cpsr_cxsf,r1 ;UndefMode
ldr sp,=UndefStack ;UndefStack=0x33FF_5C00

;step4:设置停止状况下的仓库指针
orr r1,r0,#ABORTMODE|NOINT
msr cpsr_cxsf,r1 ;AbortMode
ldr sp,=AbortStack ;AbortStack=0x33FF_6000

;step5: 设置中止形式下的仓库指针
orr r1,r0,#IRQMODE|NOINT
msr cpsr_cxsf,r1 ;IRQMode
ldr sp,=IRQStack ;IRQStack=0x33FF_7000

;step6: 设置快速中止形式下的仓库指针
orr r1,r0,#FIQMODE|NOINT
msr cpsr_cxsf,r1 ;FIQMode
ldr sp,=FIQStack ;FIQStack=0x33FF_8000

;step7:设置办理形式下的仓库指针
orr r1,r0,#SVCMODE|NOINT
msr cpsr_cxsf,r1 ;SVCMode
ldr sp,=SVCStack ;SVCStack=0x33FF_5800

;step8:由于办理形式与用户形式共用
; 仓库指针,所以借着体系形式
; 来设置用户形式的仓库指针
orrr1,r0,#SYSMODE|NOINT
msrcpsr_cxsf,r1 ;SYSMode
ldrsp,=UserStack ;SVCStack&USERMode=0x33ff4800

;现在处理器处于体系形式
;——————————————

;——————————————
;第五步 :初始化镜像运转域
;仿制RW段和ZI段到SDRAM指定地址

LDRr0,=|Image$$RO$$Limit|;装入RO段结束地址
LDRr1,=|Image$$RW$$Base|;装入RW段开端地址
LDRr3,=|Image$$ZI$$Base|;装入ZI段开端地址

;|Image$$RO$$Limit|==|Image$$RW$$Base|?越过RW段仿制:仿制RW段
CMPr0,r1
BEQ%F2

;仿制RW段
1
CMPr1,r3
LDRCCr2,[r0],#4
STRCCr2,[r1],#4
BCC%B1
2
LDRr1,=|Image$$ZI$$Limit|
MOVr2,#0

;结构ZI段
3
CMPr3,r1
STRCCr2,[r3],#4
BCC%B3

;——————————————

;——————————————
;第六步 :跳转到操作体系进口

b OSEntry ;不要运用main,由于假如运用main
;ads还会调用_main()初始化RW和ZI
;段,可是那里的数据和本程序不同

b .

;——————————————

;—————————————————————————

SMRDATADATA

;这里是内存操控器的装备数据
;装备数据需求依据你运用的存储器修正
;在第三步时会将以下数据写入
;内存操控器的相关寄存器中
;共13个寄存器的装备值

DCD(0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
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)
DCD0x32 ;SCLKpowersavingmode,BANKSIZE128M/128M
DCD0x30 ;MRSR6CL=3clk
DCD0x30 ;MRSR7CL=3clk

ALIGN ;数据鸿沟对齐

END

我在写一个arm920T的微型OS,主要是想借着写OS的进程学习ARM的底层编程,然后跳到Linux。发动代码是固件的一部分,最经校园要搞个规划,不知OS什么时分能写好,横竖搞定后当即发帖。

;*

;* 文件称号 : 2410INIT.S

;* 文件功用 : S3C2410 发动代码,装备存储器,ISR,仓库,初始化C向量地址

;* 弥补阐明 :

;*——————————————– 最新版别信息 ————————————————-

;* 修正作者 : ARM开发小组

;* 修正日期 : 2004/00/00

;* 版别声明 : V0.1

;*——————————————– 前史版别信息 ————————————————-

;* 文件作者 : kwtark(samsung)

;* 创立日期 : 2002/02/25

;* 版别声明 : ver 0.0

; 2002/03/20: purnnamu: Add some functions for testing STOP,POWER_OFF mode

; 2002/04/10: SJS:sub interrupt disable 0x3ff -> 0x7ff

;*———————————————————————————————————–

;*************************************************************************************************************

;*/

GET 2410addr.s ;界说了2410各各寄存器的地址

GET memcfg.s ;界说了2410各内存bank的带宽值和拜访参数

BIT_SELFREFRESH EQU(1<<22) ;界说了几个常数 _STACK_BASEADDRESS EQU 0x33ff8000仓库基地址

; _ISR_STARTADDRESS EQU 0x33ffff00 中止向量表基地址

;Pre-defined constants 处理器形式预界说常量

USERMODE EQU 0x10

FIQMODE EQU 0x11

IRQMODE EQU 0x12

SVCMODE EQU 0x13

ABORTMODE EQU 0x17

UNDEFMODE EQU 0x1b

MODEMASK EQU 0x1f

NOINT EQU 0xc0 ;屏蔽中止位

;/*************界说处理器各形式下仓库地址常量*******************/

UserStack EQU(_STACK_BASEADDRESS-0x3800)   ;0x33ff4800 ~

SVCStack EQU(_STACK_BASEADDRESS-0x2800)   ;0x33ff5800 ~

UndefStack EQU(_STACK_BASEADDRESS-0x2400)    ;0x33ff5c00 ~

AbortStack EQU(_STACK_BASEADDRESS-0x2000)    ;0x33ff6000 ~

IRQStack EQU(_STACK_BASEADDRESS-0x1000)   ;0x33ff7000 ~

FIQStack EQU(_STACK_BASEADDRESS-0x0)     ;0x33ff8000 ~

;/* Check if tasm.exe(armasm -16…@ADS1.0) is used. ADS编译器的查看 */

GBLL THUMBCODE

[ {CONFIG} = 16

THUMBCODE SETL {TRUE}

CODE32

|

THUMBCODE SETL {FALSE}

]

MACRO

MOV_PC_LR

[ THUMBCODE

bx lr

|

movpc,lr

]

MEND

MACRO

MOVEQ_PC_LR

[ THUMBCODE

bxeq lr

|

moveq pc,lr

]

MEND

;/*******************************************************************************************************/

; 正式代码的开端,首先是分配中止向表

;/******************************************************************************************************/

MACRO;先界说了一个负责处理中止宏

$HandlerLabel HANDLER $HandleLabel

$HandlerLabel

subsp,sp,#4 ;削减sp,保存跳转地址

stmfdsp!,{r0} ;PUSH the work register to stack(lr doest 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 |Image$$RO$$Limit| ;End of ROM code (=start of ROM data)

IMPORT |Image$$RW$$Base| ;Base of RAM to initialise

IMPORT |Image$$ZI$$Base| ;Base and limit of area

IMPORT |Image$$ZI$$Limit| ;to zero initialise

IMPORT Main     ;The main entry of mon program

;指示编译器的符号不是在根源文件中界说的,而是在其他源文件中

;界说的,在根源文件中或许引证该符号

AREA Init,CODE,READONLY ;声明一个代码段,名为:Init

ENTRY;程序的进口点

;//1)The code, which converts to Big-endian, should be in little endian code.

;//2)The following little endian code will be compiled in Big-Endian mode.

;// The code byte order should be changed as the memory bus width.

;//3)The pseudo instruction,DCD cant be used here because the linker generates error.

ASSERT:DEF:ENDIAN_CHANGE ;//断语现已界说大端形式

[ ENDIAN_CHANGE

ASSERT :DEF:ENTRY_BUS_WIDTH

[ ENTRY_BUS_WIDTH=32

bChangeBigEndian   ;DCD 0xea000007

]

[ ENTRY_BUS_WIDTH=16

andeqr14,r7,r0,lsl #20 ;DCD 0x0007ea00

]

[ ENTRY_BUS_WIDTH=8

streqr0,[r0,-r10,ror #1] ;DCD 0x070000ea

]

|

bResetHandler

]

bHandlerUndef   ;handler for Undefined mode

bHandlerSWI   ;handler for SWI interrupt

bHandlerPabort  ;handler for PAbort

bHandlerDabort ;handler for DAbort

b.     ;reserved

bHandlerIRQ   ;handler for IRQ interrupt

bHandlerFIQ   ;handler for FIQ interrupt

;//@0x20

bEnterPWDN

ChangeBigEndian

;//@0x24

[ ENTRY_BUS_WIDTH=32

DCD0xee110f10;0xee110f10 => mrc p15,0,r0,c1,c0,0

DCD0xe3800080;0xe3800080 => orr r0,r0,#0x80; //Big-endian

DCD0xee010f10;0xee010f10 => mcr p15,0,r0,c1,c0,0

]

[ ENTRY_BUS_WIDTH=16

DCD 0x0f10ee11 ;分配一段字的内存单元,并用指令的数据初始化

DCD 0x0080e380

DCD 0x0f10ee01

]

[ ENTRY_BUS_WIDTH=8

DCD 0x100f11ee

DCD 0x800080e3

DCD 0x100f01ee

]

DCD 0xffffffff ;swinv 0xffffff is similar with NOP and run well in both endian mode.

DCD 0xffffffff

DCD 0xffffffff

DCD 0xffffffff

DCD 0xffffffff

b ResetHandler

;//Function for entering power down mode

;// 1. SDRAM should be in self-refresh mode.

;// 2. All interrupt should be maksked for SDRAM/DRAM self-refresh.

;// 3. LCD controller should be disabled for SDRAM/DRAM self-refresh.

;// 4. The I-cache may have to be turned on.

;// 5. The location of the following code may have not to be changed.

;//void EnterPWDN(int CLKCON);

EnterPWDN

mov r2,r0      ;r2=rCLKCON

tst r0,#0x8     ;POWER_OFF mode?

bne ENTER_POWER_OFF

ENTER_STOP

ldr r0,=REFRESH

ldr r3,[r0]     ;r3=rREFRESH

mov r1, r3

orr r1, r1, #BIT_SELFREFRESH

str r1, [r0]     ;Enable SDRAM self-refresh

mov r1,#16    ;wait until self-refresh is issued. may not be needed.

0subs r1,r1,#1

bne %B0

ldr r0,=CLKCON    ;enter STOP mode.

str r2,[r0]

mov r1,#32

0subs r1,r1,#1    ;1) wait until the STOP mode is in effect.

bne %B0       ;2) Or wait here until the CPU&Peripherals will be turned-off

          ; Entering POWER_OFF mode, only the reset by wake-up is available.

ldr r0,=REFRESH   ;exit from SDRAM self refresh mode.

str r3,[r0]

MOV_PC_LR

ENTER_POWER_OFF

;//NOTE.

;//1) rGSTATUS3 should have the return address after wake-up from POWER_OFF mode.

ldr r0,=REFRESH

ldr r1,[r0]    ;r1=rREFRESH

orr r1, r1, #BIT_SELFREFRESH

str r1, [r0]    ;Enable SDRAM self-refresh

mov r1,#16   ;Wait until self-refresh is issued,which may not be needed.

0subs r1,r1,#1

bne %B0

ldr r1,=MISCCR

ldrr0,[r1]

orrr0,r0,#(7<<17) ;Make sure that SCLK0:SCLK->0, SCLK1:SCLK->0, SCKE=”L” during boot-up

strr0,[r1]

ldr r0,=CLKCON

str r2,[r0]

b .      ;CPU will die here.

WAKEUP_POWER_OFF

;Release SCLKn after wake-up from the POWER_OFF mode.

ldr r1,=MISCCR

ldrr0,[r1]

bicr0,r0,#(7<<17) ;SCLK0:0->SCLK, SCLK1:0->SCLK, SCKE:L->H

strr0,[r1]

        ;Set memory control registers

ldrr0,=SMRDATA

ldrr1,=BWSCON   ;BWSCON Address

addr2, r0, #52   ;End address of SMRDATA

0

ldrr3, [r0], #4

strr3, [r1], #4

cmpr2, r0

bne%B0

mov r1,#256

0subs r1,r1,#1   ;1) wait until the SelfRefresh is released.

bne %B0

ldr r1,=GSTATUS3  ;GSTATUS3 has the start address just after POWER_OFF wake-up

ldr r0,[r1]

mov pc,r0

LTORG

HandlerFIQ HANDLER HandleFIQ

HandlerIRQ HANDLER HandleIRQ

HandlerUndef HANDLER HandleUndef

HandlerSWI HANDLER HandleSWI

HandlerDabort HANDLER HandleDabort

HandlerPabort HANDLER HandlePabort

IsrIRQ

subsp,sp,#4 ;reserved for PC

stmfdsp!,{r8-r9}

ldrr9,=INTOFFSET

ldrr9,[r9]

ldrr8,=HandleEINT0

addr8,r8,r9,lsl #2

ldrr8,[r8]

strr8,[sp,#8]

ldmfdsp!,{r8-r9,pc}

;================================================================================================

; ENTRY 将看门狗、中止之类的程序关掉,省得他们来打扰初始化程序的进行

;=================================================================================================

ResetHandler

ldrr0,=WTCON ;watch dog disable

ldrr1,=0x0

strr1,[r0]

ldrr0,=INTMSK

ldrr1,=0xffffffff ;all interrupt disable

strr1,[r0]

ldrr0,=INTSUBMSK

ldrr1,=0x7ff   ;all sub interrupt disable, 2002/04/10

strr1,[r0]

[ {FALSE}

     ;rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);

     ;Led_Display

ldrr0,=GPFCON

ldrr1,=0x5500

strr1,[r0]

ldrr0,=GPFDAT

ldrr1,=0x10

strr1,[r0]

]

;To reduce PLL lock time, adjust the LOCKTIME register.

ldrr0,=LOCKTIME

ldrr1,=0xffffff

strr1,[r0]

[ PLL_ON_START

;Configure MPLL

ldrr0,=MPLLCON;//设置时钟频率

ldrr1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV) ;Fin=12MHz,Fout=50MHz

strr1,[r0]

]

;Check if the boot is caused by the wake-up from POWER_OFF mode.

ldrr1,=GSTATUS2

ldrr0,[r1]

tstr0,#0x2

;In case of the wake-up from POWER_OFF mode, go to POWER_OFF_WAKEUP handler.

bneWAKEUP_POWER_OFF

EXPORT StartPointAfterPowerOffWakeUp

StartPointAfterPowerOffWakeUp

;Set memory control registers

ldrr0,=SMRDATA

ldrr1,=BWSCON ;BWSCON Address

addr2, r0, #52 ;End address of SMRDATA

0

ldrr3, [r0], #4

strr3, [r1], #4

cmpr2, r0

bne%B0

;Initialize stacks

blInitStacks

;Setup IRQ handler

ldrr0,=HandleIRQ ;This routine is needed

ldrr1,=IsrIRQ ;if there isnt subs pc,lr,#4 at 0x18, 0x1c

strr1,[r0]

         ;Copy and paste RW data/zero initialized data

ldrr0, =|Image$$RO$$Limit| ; Get pointer to ROM data

ldrr1, =|Image$$RW$$Base| ; and RAM copy

ldrr3, =|Image$$ZI$$Base|

;Zero init base => top of initialised data

cmpr0, r1 ;Check that they are different

beq%F2

1

cmpr1, r3 ;Copy init data

ldrccr2, [r0], #4 ;–> LDRCC r2, [r0] + ADD r0, r0, #4

strccr2, [r1], #4 ;–> STRCC r2, [r1] + ADD r1, r1, #4

bcc%B1

2

ldrr1, =|Image$$ZI$$Limit| ;Top of zero init segment

movr2, #0

3

cmpr3, r1 ; Zero init

strccr2, [r3], #4

bcc%B3

[ :LNOT:THUMBCODE

blMain ;Dont use main() because ……

b.

]

[ THUMBCODE ;for start-up code for Thumb mode

orrlr,pc,#1

bxlr

CODE16

blMain ;Dont use main() because ……

b.

CODE32

]

;//function initializing stacks 初始化仓库

InitStacks

;Dont use DRAM,such as stmfd,ldmfd……

;SVCstack is initialized before

;Under toolkit ver 2.5, msr cpsr,r1 can be used instead of msr cpsr_cxsf,r1

mrsr0,cpsr

bicr0,r0,#MODEMASK

orrr1,r0,#UNDEFMODE|NOINT

msrcpsr_cxsf,r1    ;UndefMode

ldrsp,=UndefStack

orrr1,r0,#ABORTMODE|NOINT

msrcpsr_cxsf,r1    ;AbortMode

ldrsp,=AbortStack

orrr1,r0,#IRQMODE|NOINT

msrcpsr_cxsf,r1    ;IRQMode

ldrsp,=IRQStack

orrr1,r0,#FIQMODE|NOINT

msrcpsr_cxsf,r1    ;FIQMode

ldrsp,=FIQStack

bicr0,r0,#MODEMASK|NOINT

orrr1,r0,#SVCMODE

msrcpsr_cxsf,r1    ;SVCMode

ldrsp,=SVCStack

;USER mode has not be initialized.

movpc,lr

;The LR register wont be valid if the current mode is not SVC mode.

LTORG

SMRDATA DATA 在初始化仓库前,先队内存初始化

;// Memory configuration should be optimized for best performance

;// The following parameter is not optimized.

;// Memory access cycle parameter strategy

;// 1) The memory settings is safe parameters even at HCLK=”75Mhz”.

;// 2) SDRAM refresh period is for HCLK=”75Mhz”.

DCD (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))

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)

  DCD 0x32 ;SCLK power saving mode, BANKSIZE 128M/128M

DCD 0x30 ;MRSR6 CL=”3clk”

DCD 0x30 ;MRSR7

; //DCD 0x20 ;MRSR6 CL=”2clk”

; //DCD 0x20 ;MRSR7

ALIGN

AREA RamData, DATA, READWRITE

^ _ISR_STARTADDRESS

HandleReset # 4

HandleUndef # 4

HandleSWI # 4

HandlePabort # 4

HandleDabort # 4

HandleReserved # 4

HandleIRQ # 4

HandleFIQ # 4

;//Dont use the label IntVectorTable,

;//The value of IntVectorTable is different with the address you think it may be.

;//IntVectorTable

HandleEINT0 # 4

HandleEINT1 # 4

HandleEINT2 # 4

HandleEINT3 # 4

HandleEINT4_7 # 4

HandleEINT8_23# 4

HandleRSV6 # 4

HandleBATFLT # 4

HandleTICK # 4

HandleWDT # 4

HandleTIMER0 # 4

HandleTIMER1 # 4

HandleTIMER2 # 4

HandleTIMER3 # 4

HandleTIMER4 # 4

HandleUART2 # 4

HandleLCD # 4

HandleDMA0 # 4

HandleDMA1 # 4

HandleDMA2 # 4

HandleDMA3 # 4

HandleMMC # 4

HandleSPI0 # 4

HandleUART1 # 4

HandleRSV24 # 4

HandleUSBD # 4

HandleUSBH # 4

HandleIIC # 4

HandleUART0 # 4

HandleSPI1 # 4

HandleRTC # 4

HandleADC # 4

END

;=========================================

; NAME: 2410INIT.S

; DESC: C start up codes

; Configure memory, ISR ,stacks

; Initialize C-variables

; HISTORY:

; 2002.02.25:kwtark: ver 0.0

; 2002.03.20:purnnamu: Add some functions for testing STOP,POWER_OFF mode

;=========================================

GET option.s

GET memcfg.s

GET 2410addr.s

BIT_SELFREFRESH EQU (1<<22)

;ARM反常形式的界说

;Pre-defined constants

USERMODE EQU 0x10

FIQMODE EQU 0x11

IRQMODE EQU 0x12

SVCMODE EQU 0x13

ABORTMODE EQU 0x17

UNDEFMODE EQU 0x1b

MODEMASK EQU 0x1f

NOINT EQU 0xc0

;ARM个反常形式仓库

;The location of stacks

UserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~

SVCStack EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 ~

UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 ~

AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 ~

IRQStack EQU (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 ~

FIQStack EQU (_STACK_BASEADDRESS-0x0) ;0x33ff8000 ~

;Check if tasm.exe(armasm -16…@ADS1.0) is used.

GBLL THUMBCODE

[ {CONFIG} = 16 ;[ = IF

THUMBCODE SETL {TRUE}

CODE32 ; CODE32 标明一下操作都在ARM状况

| ;| = ELSE

THUMBCODE SETL {FALSE}

] ;] = ENDIF

;宏界说MOV_PC_LR

MACRO

MOV_PC_LR

[ THUMBCODE

bx lr

|

mov pc,lr

]

MEND

MACRO

MOVEQ_PC_LR

[ THUMBCODE

bxeq lr

|

moveq pc,lr

]

MEND

;宏界说-进入反常流程

;HANDLER-宏的称号

;$HandleLabel-宏的参数

;这个宏的作用是把各个中止程序的地址装入当时的PC,2410有两种装断形式 一种是没有中止向量表,一种是运用中止向量表的

;运用中止向量表只能是IRQ方法,当运用中止向量表的时分,中止产生时由2410的中止操控器主动跳转到

;相应的方位。

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 doest push because it return to original address)!表明数据传送结束后,将最终的地址写入基址寄存器

ldr r0,=$HandleLabel;load the address of Handle1XXX 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

;连接器生成的输出段相关的符号

;引进连接器生成的映象文件的各个部分地址。

;OR-只读区域、RW-读写区域、ZI-初始化为0的区域。

IMPORT |Image$$RO$$Base| ; Base of ROM code

IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)

IMPORT |Image$$RW$$Base| ; Base of RAM to initialise

IMPORT |Image$$ZI$$Base| ; Base and limit of area

IMPORT |Image$$ZI$$Limit| ; to zero initialise

;引进外部函数Main,进入C程序。

IMPORT Main ; The main entry of mon program

;IMPORT LEDTEST

;界说ARM汇编程序段,段名为SelfBoot,程序段为只读的代码段。

AREA SelfBoot, CODE, READONLY

;程序进口地址

ENTRY

ResetEntry

;程序段履行的第一跳指令,为8个反常中止处理向量,要按次序放置。

b ResetHandler

b HandlerUndef ;handler for Undefined mode

b HandlerSWI ;handler for SWI interrupt

b HandlerPabort ;handler for PAbort

b HandlerDabort ;handler for DAbort

b . ;reserved

b HandlerIRQ ;handler for IRQ interrupt

b HandlerFIQ ;handler for FIQ interrupt

LTORG ;声明一个数据缓冲池的开端

HandlerFIQ HANDLER HandleFIQ

HandlerIRQ HANDLER HandleIRQ

HandlerUndef HANDLER HandleUndef

HandlerSWI HANDLER HandleSWI

HandlerDabort HANDLER HandleDabort

HandlerPabort HANDLER HandlePabort

;选用INTOFFSET寄存器断定IRQ中止源

IsrIRQ

sub sp,sp,#4

stmfd sp!,{r8-r9}

ldr r9,=INTOFFSET

ldr r9,[r9]

ldr r8,=HandleEINT0

add r8,r8,r9,lsl #2

ldr r8,[r8]

str r8,[sp,#8]

ldmfd sp!,{r8-r9,pc}

;======================================================

; ENTRY

;======================================================

;初始化程序进口指令

ResetHandler

ldr r0,=WTCON ;watch dog disable

ldr r1,=0x0

str r1,[r0]

ldr r0,=INTMSK

ldr r1,=0xffffffff ;all interrupt disable

str r1,[r0]

ldr r0,=INTSUBMSK

ldr r1,=0x3ff ;all sub interrupt disable

str r1,[r0]

;To reduce PLL lock time, adjust the LOCKTIME register.

ldr r0,=LOCKTIME

ldr r1,=0xffffff

str r1,[r0]

;Configure MPLL

ldr r0,=MPLLCON

ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV) ;Fin=12MHz,Fout=50MHz

str r1,[r0]

;设置存储器操控寄存器。

;Set memory control registers

adr r0, SMRDATA

ldr r1,=BWSCON ;BWSCON Address

add r2, r0, #52 ;End address of SMRDATA总共13个寄存器

0

ldr r3, [r0], #4

str r3, [r1], #4

cmp r2, r0

bne %B0

;制止Icache和Dcache,制止MMU

;IMPORT MMU_DisableICache

;bl MMU_DisableICache ;

;IMPORT MMU_DisableDCache

;bl MMU_DisableDCache ;

;IMPORT MMU_InvalidateICache

;bl MMU_InvalidateICache ;

;IMPORT MMU_DisableMMU

;bl MMU_DisableMMU ;

;初始化仓库

;Initialize stacks

bl InitStacks

;树立IRQ中止

; Setup IRQ handler

ldr r0,=HandleIRQ ;This routine is needed

ldr r1,=IsrIRQ ;if there isnt subs pc,lr,#4 at 0x18, 0x1c

str r1,[r0]

;===========================================================

adr r0, ResetEntry

ldr r2, BaseOfROM

cmp r0, r2

ldreq r0, TopOfROM

beq InitRam

ldr r3, TopOfROM

;将RO区域的代码copy到RW域中而且将ZI区域初始化为0。

0

ldmia r0!, {r4-r7}

stmia r2!, {r4-r7}

cmp r2, r3

bcc %B0

sub r2, r2, r3

sub r0, r0, r2

InitRam

ldr r2, BaseOfBSS

ldr r3, BaseOfZero

0

cmp r2, r3 ;copy 初始化代码

ldrcc r1, [r0], #4

strcc r1, [r2], #4

bcc %B0

mov r0, #0 ;初始化ZI区域为0

ldr r3, EndOfBSS

1

cmp r2, r3

strcc r0, [r2], #4

bcc %B1

bl Main ;bl Main ;Dont use main() because ……

b .

;仓库初始化

;function initializing stacks

InitStacks

;Dont use DRAM,such as stmfd,ldmfd……

;SVCstack is initialized before

;Under toolkit ver 2.5, msr cpsr,r1 can be used instead of msr cpsr_cxsf,r1

;UndefMode仓库

mrs r0,cpsr

bic r0,r0,#MODEMASK

orr r1,r0,#UNDEFMODE|NOINT

msr cpsr_cxsf,r1 ;UndefMode

ldr sp,=UndefStack

;AbortMode仓库

orr r1,r0,#ABORTMODE|NOINT

msr cpsr_cxsf,r1 ;AbortMode

ldr sp,=AbortStack

;IRQMode仓库

orr r1,r0,#IRQMODE|NOINT

msr cpsr_cxsf,r1 ;IRQMode

ldr sp,=IRQStack

;FIQMode仓库

orr r1,r0,#FIQMODE|NOINT

msr cpsr_cxsf,r1 ;FIQMode

ldr sp,=FIQStack

;SVCMode仓库

bic r0,r0,#MODEMASK|NOINT

orr r1,r0,#SVCMODE

msr cpsr_cxsf,r1 ;SVCMode

ldr sp,=SVCStack

;USER mode has not be initialized.

mov pc,lr

;The LR register wont be valid if the current mode is not SVC mode.

LTORG ;声明一个数据缓冲池的开端

SMRDATA DATA

; Memory configuration should be optimized for best performance

; The following parameter is not optimized.

; Memory access cycle parameter strategy

; 1) The memory settings is safe parameters even at HCLK=75Mhz.

; 2) SDRAM refresh period is for HCLK=75Mhz.

DCD (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28));BWSCON=0x2211D110

DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC)) ;GCS0 BANK0CON=0x0700

DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC)) ;GCS1 BANK1CON=0x7FFC

DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC)) ;GCS2 BANKCON2=0x0700

DCD 0x1f7c;((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC)) ;GCS3 BANKCON3=0x0700

DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC)) ;GCS4 BANKCON4=0x0700

DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC)) ;GCS5 BANKCON5=0x0700

DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN)) ;GCS6 BANKCON6=0x18005

DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN)) ;GCS7 BANKCON7=0x18005

DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT) ;REFRESH=0x008E0459

DCD 0x32 ;SCLK power saving mode, BANKSIZE 128M/128M ;BANKSIZE=0x32

DCD 0x30 ;MRSR6 CL=3clk ;MRSRB6=0x30

DCD 0x30 ;MRSR7 ;MRSRB7=0x30

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|

ALIGN ;经过增加补丁字节使当时方位满意必定的对齐方法

;可读写的数据段

AREA RamData, DATA, READWRITE

;^=MAP:界说一个结构化的内存表(storage map)的首地址,地址为0x33ff8000

^ _ISR_STARTADDRESS ;0x33ff8000

HandleReset # 4 ;#–Field:界说一个结构化内存表中的数据域,该域为4个字节

HandleUndef # 4

HandleSWI # 4

HandlePabort # 4

HandleDabort # 4

HandleReserved # 4

HandleIRQ # 4

HandleFIQ # 4

;Dont use the label IntVectorTable,

;The value of IntVectorTable is different with the address you think it may be.

;IntVectorTable

HandleEINT0 # 4

HandleEINT1 # 4

HandleEINT2 # 4

HandleEINT3 # 4

HandleEINT4_7 # 4

HandleEINT8_23 # 4

HandleRSV6 # 4

HandleBATFLT # 4

HandleTICK # 4

HandleWDT # 4

HandleTIMER0 # 4

HandleTIMER1 # 4

HandleTIMER2 # 4

HandleTIMER3 # 4

HandleTIMER4 # 4

HandleUART2 # 4

HandleLCD # 4

HandleDMA0 # 4

HandleDMA1 # 4

HandleDMA2 # 4

HandleDMA3 # 4

HandleMMC # 4

HandleSPI0 # 4

HandleUART1 # 4

HandleRSV24 # 4

HandleUSBD # 4

HandleUSBH # 4

HandleIIC # 4

HandleUART0 # 4

HandleSPI1 # 4

HandleRTC # 4

HandleADC # 4

END

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/274975.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部