微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM的44binit.s文件的详细注释

ARM的44binit.s文件的详细注释

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

定义要求。

LTORG ;LTORG用于声明一个数据缓冲池
;下面是具体的中断处理函数跳转的宏,通过上面的$HandlerLabel的宏定义展开后跳转到对应的中断处理函数(对于向量中断)
HandlerFIQ HANDLER HandleFIQ
HandlerIRQ HANDLER HandleIRQ
HandlerUndef HANDLER HandleUndef
HandlerSWI HANDLER HandleSWI
HandlerDabort HANDLER HandleDabort
HandlerPabort HANDLER HandlePabort

HandlerADC HANDLER HandleADC
HandlerRTC HANDLER HandleRTC
HandlerUTXD1 HANDLER HandleUTXD1
HandlerUTXD0 HANDLER HandleUTXD0
HandlerSIO HANDLER HandleSIO
HandlerIIC HANDLER HandleIIC
HandlerURXD1 HANDLER HandleURXD1
HandlerURXD0 HANDLER HandleURXD0
HandlerTIMER5 HANDLER HandleTIMER5
HandlerTIMER4 HANDLER HandleTIMER4
HandlerTIMER3 HANDLER HandleTIMER3
HandlerTIMER2 HANDLER HandleTIMER2
HandlerTIMER1 HANDLER HandleTIMER1
HandlerTIMER0 HANDLER HandleTIMER0
HandlerUERR01 HANDLER HandleUERR01
HandlerWDT HANDLER HandleWDT
HandlerBDMA1 HANDLER HandleBDMA1
HandlerBDMA0 HANDLER HandleBDMA0
HandlerZDMA1 HANDLER HandleZDMA1
HandlerZDMA0 HANDLER HandleZDMA0
HandlerTICK HANDLER HandleTICK
HandlerEINT4567 HANDLER HandleEINT4567
HandlerEINT3 HANDLER HandleEINT3
HandlerEINT2 HANDLER HandleEINT2
HandlerEINT1 HANDLER HandleEINT1
HandlerEINT0 HANDLER HandleEINT0

;One of the following two routines can be used for non-vectored interrupt.
;下面这段程序是用来处理非向量中断,具体判断I_ISPR中各位是否置1 置1表示目前此中断等待响应(每次只能有一位置1),从最高优先级中断位开始判断,检测到等待服务
;中断就将pc置为中断服务函数首地址
IsrIRQ ;using I_ISPR register.
sub sp,sp,#4 ;reserved for PC,为PC留下空位
stmfd sp!,{r8-r9} ;把r8,r9先入栈

;IMPORTANT CAUTION
;if I_ISPC isnt used properly, I_ISPR can be 0 in this routine.

ldr r9,=I_ISPR ;读入I_ISPR中的值
ldr r9,[r9]
mov r8,#0x0
0
movs r9,r9,lsr #1 ;逻辑右移,得到中断源的编号
bcs ?
add r8,r8,#4
b ? ;往后跳转到0这个标签的地方

1
ldr r9,=HandleADC
add r9,r9,r8 ;得到偏移地址
ldr r9,[r9] ;得到相应的IRQ程序地址
str r9,[sp,#8] ;把IRQ程序的地址当成PC值入栈
ldmfd sp!,{r8-r9,pc} ;出栈,转到新的中断程序处

;****************************************************
;* START *
;****************************************************
;扳子上电和复位后 程序开始从位于0x0执行b ResetHandler 程序从跳转到这里执行
;板子上电复位后 执行几个步骤这里通过标号在注释中加1,2,3....标示 标号表示执行顺序
;1.禁止看门狗 屏蔽所有中断
ResetHandler
ldr r0,=WTCON ;watch dog disable
ldr r1,=0x0
str r1,[r0]

ldr r0,=INTMSK
ldr r1,=0x07ffffff ;all interrupt disable
str r1,[r0]
;2.根据工作频率设置pll
;这里介绍一下计算公式
;Fpllo=(m*Fin)/(p*2^s)
;m=Mdiv+8,p=Pdiv+2,s=Sdiv
;Fpllo必须大于20Mhz小于66Mhz
;Fpllo*2^s必须小于170Mhz
;如下面的PLLCON设定中的M_div P_div S_div是取自option.h中
;#elif (MCLK==40000000)
;#define PLL_M (0x48)
;#define PLL_P (0x3)
;#define PLL_S (0x2)
;所以m=Mdiv+8=80,p=Pdiv+2=5,s=Sdiv=2
;硬件使用晶振为10Mhz,即Fin=10Mhz
;Fpllo=80*10/5*2^2=40Mhz

;****************************************************
;* Set clock control registers *
;****************************************************
ldr r0,=LOCKTIME
ldr r1,=800 ; count = t_lock * Fin (t_lock=200us, Fin=4MHz) = 800
str r1,[r0]

[ PLLONSTART
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]
;3.置存储相关寄存器的程序
;这是设置SDRAM,flash ROM 存储器连接和工作时序的程序,片选定义的程序
;SMRDATA map在下面的程序中定义
;SMRDATA中涉及的值请参考memcfg.s程序
;具体寄存器各位含义请参考s3c44b0 spec

;****************************************************
;* Set memory control registers *
;****************************************************
ldr r0,=SMRDATA
ldmia r0,{r1-r13}
ldr r0,=0x01c80000 ;BWSCON Address
stmia r0,{r1-r13}

;****************************************************
;* Initialize stacks *
;****************************************************
ldr sp, =SVCStack ;Why?
bl InitStacks
;5.设置缺省中断处理函数
;****************************************************
;* 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]
;6.将数据段拷贝到ram中 将零初始化数据段清零 跳入C语言的main函数执行到这步结束bootloader初步引导结束
;********************************************************
;* Copy and paste RW data/zero initialized data *
;********************************************************
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

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

网站地图

Top