微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM启动代码注释

ARM启动代码注释

时间:11-11 来源:互联网 点击:

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,=INTSU

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top