微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM启动文件2440init.s分析

ARM启动文件2440init.s分析

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

;详细分析:

;Handle*** 这是宏示例,也就是宏的调用指令,当编译时编译器会把宏调用指令展开

;Handler*** 这是向量中断

;展开方式(举例):

;HandlerFIQ HANDLER HandleFIQ

;展开后变成:

;标号HandlerFIQ,由 " b HandlerFIQ "指令使用(见上,复位处)

; sub sp,sp,#4

;留出一个空间,为了存放跳转地址给pc。见:str r0,[sp,#4] ,注意sp值并未改变

; stmfd sp!,{r0}

;把r0中的内容入栈,保存起来

; ldr r0,=HandleFIQ

;HandleFIQ标号,在本文件最下方定义

; ldr r0,[r0]

;把 HandleFIQ所指向的内容(也就是中断程序的入口地址)放入r0

; str r0,[sp,#4]

;把入口地址放入刚才留出的一个空间里

; ldmfd sp!,{r0,pc}

;出栈的方式恢复r0原值和为pc设定新值(也就完成了到ISR的转跳)。注:栈中r0内容在低地址

;后边的语句展开方式,同上。编译后,代码都展开放置

HandlerFIQ HANDLER HandleFIQ

HandlerIRQ HANDLER HandleIRQ

HandlerUndef HANDLER HandleUndef

HandlerSWI HANDLER HandleSWI

HandlerDabort HANDLER HandleDabort

HandlerPabort HANDLER HandlePabort

;-------------------------------------------------------------------------------------------------

;非向量中断总入口(需要自己判断中断类型,而不是直接跳转到相应程序)

;产生中断后,需要中断服务程序自己来判断,到底是哪个中断请求,根据的就是INTOFFSET寄存器中的偏移,再

;计算中断服务地址

IsrIRQ

sub sp,sp,#4 ;reserved for PC,预留返回指针的存储位置

stmfd sp!,{r8-r9}

ldr r9,=INTOFFSET ;the interrupt request source offset

ldr r9,[r9]

ldr r8,=HandleEINT0 ;HandleEINT0 ,在本文件最下边定义的

add r8,r8,r9,lsl #2 ;r9中只是偏移单位的个数,需要*4变成具体字节偏移(相对于EINT0)

ldr r8,[r8]

str r8,[sp,#8] ;pc值放在了高位置

ldmfd sp!,{r8-r9,pc}

;-------------------------------------------------------------------------------------------------

;LTORG用于声明一个文字池,在使用LDR伪指令时,要在适当的地方加入LTORG声明文字池,这样就会把要加载的

;数据保存在文字池内,再用ARM的《加载指令》读出数据。(若没有使用LTORG声明文字池,则汇编器会在程序

;末尾自动声明)

;LTORG 伪指令常放在无条件跳转指令之后,或者子程序返回指令之后,这样处理器就不会错误地将文字池中的

;数据当做指令来执行

;注:在此,文字池内存储的是INTOFFSET宏所代表的值:0x4a000014 。毕竟,当把指令编译成二进制代码时,

;arm指令(32位)不能既表示出指令内容,又表示出数据地址(32位)。估计在编译时,会被汇编成其他的加载

;指令,再编译成机器码

;LTORG 只要单独写出来就可以了,其他的交给编译器来做,而且它跟它下面的代码没有任何关系

LTORG

;-------------------------------------------------------------------------------------------------

;=======

; ENTRY

;=======

ResetHandler

;关看门狗

ldr r0,=WTCON ;watch dog disable 编译时就是 ldr r0,=53000000;伪指令有=号

ldr r1,=0x0 ;这些宏定义都位于2440addr.inc中。 区分:变量定义 && 宏定义

str r1,[r0]

;-------------------------------------------------------------------------------------------------

;屏蔽所有中断

ldr r0,=INTMSK ;在 INTMSK 寄存器设置屏蔽所有中断

ldr r1,=0xffffffff ;all interrupt disable 要理解子中断和中断之间的关系

str r1,[r0]

ldr r0,=INTSUBMSK ;INTSUBMSK子中断屏蔽寄存器,屏蔽所有子中断

ldr r1,=0x7fff ;allsub interrupt disable

str r1,[r0]

;-------------------------------------------------------------------------------------------------

[ {FALSE}

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

;Led_Display

ldr r0,=GPBCON

ldr r1,=0x00555555

str r1,[r0]

ldr r0,=GPBDAT

ldr r1,=0x07fe

str r1,[r0]

]

;-------------------------------------------------------------------------------------------------

;初始化PLL和时钟

;锁相环 PLL ,作用是将外部晶振的输入频率倍频到一个较高的频率

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

ldr r0,=LOCKTIME ;LOCKTIME锁定时间计数寄存器

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

网站地图

Top