⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 44binit.s

📁 运行于嵌入式系统的uCLinux的bios源码
💻 S
📖 第 1 页 / 共 2 页
字号:
;/*
;************************************************************************************************************
;*				        				北京精仪达盛科技有限公司
;*                                     	     研    发    部
;*
;*                                 	     http://www.techshine.com
;*
;*--------------------------------------------- 文件信息 ----------------------------------------------------                                      
;*
;* 文件名称 : 44binit.s	
;* 文件功能 : 该文件为ARM7硬件平台的C语言启动代码,用于分配中断向量表,初始化ISR地址,初始化堆栈空间,
;*            初始化应用程序执行环境,配置存储器系统,设定时钟周期,呼叫主应用程序。
;* 补充说明 : 基于S3C44B0的ARM7硬件平台的启动代码
;*-------------------------------------------- 最新版本信息 -------------------------------------------------
;* 修改作者 : ARM开发小组
;* 修改日期 : 2004/04/25
;* 版本声明 : V1.0.1
;*-------------------------------------------- 历史版本信息 -------------------------------------------------
;* 文件作者 : ARM开发小组
;* 创建日期 : 2004/04/20
;* 版本声明 : v1.0.0
;*-----------------------------------------------------------------------------------------------------------
;*-----------------------------------------------------------------------------------------------------------
;************************************************************************************************************
;*/
 
    GET ..\inc\option.s
    GET ..\inc\memcfg.s

    IMPORT  Main    ;// 声明输入主程序入口地址

    AREA    Init,CODE,READONLY

	ENTRY
ResetEntry
    b ResetHandler                                                                    ;//调试用的程序入口地址
    b HandlerUndef                      ;//从未定义向量地址跳到一个地址,该地址存放进入未定义服务子程序的地址
    b HandlerSWI                        ;//从软中断向量地址跳到一个地址,该地址存放进入软中断服务子程序的地址
    b HandlerPabort     ;//从指令预取指终止向量地址跳到一个地址,该地址存放进入指令预取指终止服务子程序的地址
    b HandlerDabort                 ;//从数据终止向量地址跳到一个地址,该地址存放进入数据终止服务子程序的地址
    b .		                                                                                      ;//系统保留
    b HandlerIRQ                                                                        ;//使用非向量中断方式
    b HandlerFIQ                              ;//从FIQ向量地址跳到一个地址,该地址存放进入FIQ服务子程序的地址
;/*********************************************** 注意! ******************************************************/

	   ;// 如果向量中断模式使能, 上面两条指令应按下面给出的相应改变
	   ;// b HandlerIRQ  ->  subs pc,lr,#4
	   ;// b HandlerFIQ  ->  subs pc,lr,#4
VECTOR_BRANCH
    ldr pc,=HandlerEINT0    ;mGA    H/W interrupt vector table
    ldr pc,=HandlerEINT1    ;	
    ldr pc,=HandlerEINT2    ;
    ldr pc,=HandlerEINT3    ;
    ldr pc,=HandlerEINT4567 ;
    ldr pc,=HandlerTICK	    ;mGA
    b .
    b .
    ldr pc,=HandlerZDMA0    ;mGB
    ldr pc,=HandlerZDMA1    ;
    ldr pc,=HandlerBDMA0    ;
    ldr pc,=HandlerBDMA1    ;
    ldr pc,=HandlerWDT	    ;
    ldr pc,=HandlerUERR01   ;mGB
    b .
    b .
    ldr pc,=HandlerTIMER0   ;mGC
    ldr pc,=HandlerTIMER1   ;
    ldr pc,=HandlerTIMER2   ;
    ldr pc,=HandlerTIMER3   ;
    ldr pc,=HandlerTIMER4   ;
    ldr pc,=HandlerTIMER5   ;mGC
    b .
    b .
    ldr pc,=HandlerURXD0    ;mGD
    ldr pc,=HandlerURXD1    ;
    ldr pc,=HandlerIIC	    ;
    ldr pc,=HandlerSIO	    ;
    ldr pc,=HandlerUTXD0    ;
    ldr pc,=HandlerUTXD1    ;mGD
    b .
    b .
    ldr pc,=HandlerRTC	    ;mGKA
    b .						;
    b .						;
    b .						;
    b .						;
    b .						;mGKA
    b .
    b .
    ldr pc,=HandlerADC	    ;mGKB
    b .						;
    b .						;
    b .						;
    b .						;
    b .						;mGKB
    b .
    b .
;0xe0=EnterPWDN
    ldr pc,=EnterPWDN

;/*
;************************************************************************************************************
;**						                         程序开始		                                           **
;************************************************************************************************************
;*/
ResetHandler

    ldr	    r0,=WTCON	    														;//把看门狗定时器地址给r0 
    mov     r1,#0x00             																	;//赋初值		
    str	    r1,[r0]																	      ;//关闭看门狗定时器

    ldr	    r0,=INTMSK							                                  ;//把屏蔽中断寄存器地址给r0 
    mov     r1,#0x07ffffff   					                                                    ;//赋初值 
    str	    r1,[r0]								                                              ;//关闭所有中断
;/*
;************************************************************************************************************
;**	                                             时钟控制器配置                                            **
;************************************************************************************************************
;*/
   	;以下三段设置时钟控制寄存器
    ldr	r0,=LOCKTIME							                                  ;//把上锁时间定时器地址给r0
    ldr r1,=0x8fc;        						         ;//赋初值count = t_lock * Fin = 230us * 8MHz = 1840
    str	r1,[r0]									                   ;//写入上锁时间定时器,PLL稳定时间为184 us

    [ PLLONSTART
	ldr	r0,=PLLCON								                                     ;//PLL控制寄存器地址给r0
	ldr	r1,=((M_DIV<<12) + (P_DIV<<4) + S_DIV)	                           ;//设定锁相环 Fin=10MHz,Fout=40MHz
	str	r1,[r0]									                                         ;//写入PLL控制寄存器
    ]

    ldr	    r0,=CLKCON							                                     ;//把时钟控制器地址给r0	 
    ldr	    r1,=0x7ff8							                              ;//给所有外设单元的时钟打开赋值	
    str	    r1,[r0]								                                            ;//写入时钟控制器

;/*
;************************************************************************************************************
;**			                                   DMA寄存器配置                                               ** 	
;************************************************************************************************************
;*/
    ldr     r0,=BDIDES0       
    ldr     r1,=0x40000000                                                     ;//BDIDES0 复位值为 0x40000000 
    str     r1,[r0]

    ldr     r0,=BDIDES1      
    ldr     r1,=0x40000000                                                     ;//BDIDES1 复位值为 0x40000000	 
    str     r1,[r0]

;/*
;************************************************************************************************************
;**			                                   存储器寄存器配置                                            ** 	
;************************************************************************************************************
;*/
	adr	r0, ResetHandler
	ldr	r1, =ResetHandler
	sub	r0, r1, r0		
	ldr	r1, =SMRDATA
	sub	r0, r1, r0 
	ldmia   r0, {r1-r13}
	ldr	    r0, =0x01c80000			;BWSCON Address
	stmia   r0, {r1-r13}	

;/*
;************************************************************************************************************
;**                                               初始化堆栈                                               ** 
;************************************************************************************************************
;*/
    ldr	    sp, =SVCStack
    bl	    InitStacks

;/*
;************************************************************************************************************
;**                                             设置中断处理                                               ** 
;************************************************************************************************************
;*/
    ldr	    r0,=HandleIRQ		;This routine is needed
    ldr	    r1,=IsrIRQ			;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c
    str	    r1,[r0]

;/*
;************************************************************************************************************
;**                             复制RW的数据以及初始化zero区的数据                                         ** 
;************************************************************************************************************
;*/
	adr		r0, ResetEntry					
	ldr		r1,	BaseOfROM
	cmp		r0,	r1
	ldreq	r0, TopOfROM
	beq		InitRamData
	
;/*
;************************************************************************************************************
;**                                计算拷贝程序在flash中的实际位置                                         ** 
;************************************************************************************************************
;*/	
	ldr		r2,	=CopyProcBeg
	sub		r1, r2, r1
	add		r0, r0, r1	
	ldr		r3,	=CopyProcEnd
	
;/*
;************************************************************************************************************
;**                                       将拷贝程序复制到ram中                                            ** 
;************************************************************************************************************
;*/	

0	
	ldmia	r0!, {r4-r7}
	stmia	r2!, {r4-r7}
	cmp		r2, r3
	bcc		%B0	
	
;/*
;************************************************************************************************************
;**                     开始用ram中的拷贝程序复本将所有剩下的代码复制到ram中                               ** 
;************************************************************************************************************
;*/

	ldr		r3, TopOfROM		
	ldr		pc, =CopyProcBeg
	
;/*
;************************************************************************************************************
;**           将代码由实际烧入的地址拷贝到ro-base所指定的位置,只拷贝CopyProcEnd以后的代码                 ** 
;************************************************************************************************************
;*/	

CopyProcBeg	
0	
	ldmia	r0!, {r4-r11}
	stmia	r2!, {r4-r11}
	cmp		r2, r3
	bcc		%B0	
CopyProcEnd
	
	sub		r1, r2, r3
	sub		r0, r0, r1		
	
InitRamData	
	ldr		r2, BaseOfBSS
	ldr		r3, BaseOfZero	
0
	cmp		r2, r3
	ldrcc	r1, [r0], #4
	strcc	r1, [r2], #4
	bcc		%B0	

	mov		r0,	#0
	ldr		r3,	EndOfBSS
1	
	cmp		r2,	r3
	strcc	r0, [r2], #4
	bcc		%B1			
		 		 		
    [ :LNOT:THUMBCODE
	BL		Main	    ;从汇编进入C语言代码空间,不要使用main()
	B	.						
    ]

    [ THUMBCODE		    ;for start-up code for Thumb mode
	orr     lr,pc,#1
	bx      lr
	CODE16
	bl      Main	    ;从汇编进入C语言代码空间,不要使用main()
	b       .
	CODE32
    ]

	LTORG
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;中断向量表                                                                                 	    	;
;Example: HandlerADC	HANDLE HandleADC 解为															;
;HandlerADC						;HandlerADC为中断向量表的入口											;
;   sub	    sp,sp,#4			;将sp减少一个字节,使其在堆栈高端留出存储返回地址,因为pc在寄存器组中的	;
;								;的位置大于r0,出栈时装入的是栈的高端的内容								;
;   stmfd   sp!,{r0}			;保存r0																	;
;   ldr	    r0,=HandleADC		;装载中断处理函数的指针													;
;   ldr	    r0,[r0]				;装载中断处理函数的地址													;
;   str	    r0,[sp,#4]			;将中断处理函数的地址存入刚才预留的位置,r0的上面						;
;   ldmfd   sp!,{r0,pc}			;出栈后,pc指向的既是中断处理函数的地址									;
;                                                                                                       ;
;	INTCON^2 == 0时,vector table使能																	;
;	发生中断->HandlerADC->HandleADC(pISR_ADC,即:_ISR_STARTADDRESS+0x20);								;                          
;	若要在程序中处理此中断,只要将中断服务函数的指针赋给pISR_ADC,如:pISR_ADC = (int)ADCIsr            	;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
HandlerFIQ		HANDLER HandleFIQ
HandlerIRQ		HANDLER HandleIRQ
HandlerUndef	HANDLER HandleUndef
HandlerSWI		HANDLER HandleSWI

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -