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

📄 init.s.bak

📁 基于ARM7的直流电机的驱动,还有FLASH驱动,LCD驱动等
💻 BAK
字号:
;
;建立中断向量表
;初始化存储器系统
;初始化堆栈
;初始化有特殊要求的断口,设备
;初始化用户程序执行环境;完成必要的从ROM到RAM的数据传输和内容清零
;改变处理器模式
;呼叫主应用程序
;中断向量表


;1、设置CPU各种模式的堆栈指针
;2、设置中断向量地址
;2、配置SDRAM和ROM的模式
;3、把程序COPY到SDRAM
;4、跳到SDRAM里开始运行程序
;GET option.s ;相当于c语言中的#include "option.s" 
;	AVT RTOS HAL for ARM7(S3C44B0X)
;
;用户程序必须在0x00010000 开始烧写

IRQ_VECTOR	EQU		0x0C080000;SDRAM的真实地址???BANK6,地址0XC000000~0XC7FFFFF
INTMSK	    EQU		0x01e0000c;;确定哪个中断源被屏蔽 屏蔽的中断源将不被服务
INTCON		EQU		0x1e00000;中断控制寄存器
;下面是对arm处理器模式寄存器对应值的常数定义,arm处理器中有一个CPSR程序状态寄存器 它的后五位M0~M4决定目前的处理器模式 

;预定义常数(常量)运行模式设置
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由RO,RW,ZI三个断组成 其中RO为代码段,RW是已经初始化的全局变量,ZI是未初始化的全局变量
	IMPORT	bspInit
	IMPORT	avtInit
	IMPORT	|Image$$ZI$$Base|	; uninitialised variables
	IMPORT	|Image$$ZI$$Limit|	; End of variable RAM space
                 ; |Image$$ZI$$Base| ; ZI段起始地址 
                 ; |Image$$ZI$$Limit| ; ZI段结束地址加1
                                     ;下面为代码段
                                     ;扳子上电和复位后 程序开始从位于0x0处开始执行硬件刚刚上电复位后 程序从这里开始执行跳转到标号为ResetHandler处执行 

	AREA    Init,CODE,READONLY;定义代码段 名称为INIT,只读
	
    ENTRY ;程序入口,每个文件一个入口
_start
	ldr	    r0,=INTMSK ;将 INTMSK装载到R0          
	                   ; 向量中断;ldr PC,=HandlerADC 当ADC中断产生的时候系统会 
	                   ;adc中断向量为 0x000000c0下面对应表中第49项位置 向量地址0x0+4*(49-1)=0x000000c0 

      ;;1禁止所有中断                               ;自动跳转到HandlerADC函数中
    ldr	    r1,=0x07ffffff  ;禁止所有中断,初始值是 0x07ffffff
    str	    r1,[r0];将R1中的字节写到R0为地址的存储器中
                             ;* Initialize stacks * 
                             ;;4设置堆栈指针,BBS清0
    msr	    cpsr_cxsf, #SVCMODE|NOINT 	    	;SVCMode;直接设置状态寄存器
                     ;MSR写状态寄存器,CXSF为状态寄存器指定的区域,C控制域屏蔽字7:0,X扩展域屏蔽字15 :8
                     ;S状态域屏蔽字23:16,F标志域屏蔽字31:24,
    ldr	    sp,=init_stk;指向空间的最后(ROM)
    ;6.将数据段拷贝到ram中 将零初始化数据段清零 跳入C语言的main函数执行 到这步结束bootloader初步引导结束 

    ;;
    ;;	Zero BSS
    ;;
	LDR		r6, =|Image$$ZI$$Limit|;将ZI段结束加1地址写到R6
	MOV		r1, r6 ; Get pointer to ROM data 

	LDR		r0, =|Image$$ZI$$Base|; ZI段起始地址写到R0
	MOV		r3, #0x0;and RAM copy 
1
	CMP		r0, r1; Check that they are different ;(r0)-(r1),只设置标志。

	STRLO	r3, [r0], #4
	BLO		%B1
     
	
	MOV		r0, r6
    LDR		r1, =0x0C800000;SDRAM的真实地址???
    B		avtInit
   
;;
;; ffs - find first set bit, this algorithm isolates the first set
;; bit, then multiplies the number by 0x0450fbaf which leaves the top
;; 6 bits as an index into the table.  This algorithm should be a win
;; over the checking each bit in turn as per the C compiled version.
;;
;; under ARMv5 there's an instruction called CLZ (count leading Zero's) that
;; could be used
;;
	EXPORT	ffs
ffs

 ;; Standard trick to isolate bottom bit in r0 or 0 if r0 = 0 on entry
	RSB     r1, r0, #0
	ANDS    r0, r0, r1

;;
;;	now r0 has at most one set bit, call this X
;;	if X = 0, all further instructions are skipped
;;
	ADRNE   r2, ffs_table
	ORRNE   r0, r0, r0, lsl #4  ;; r0 = X * 0x11 
	ORRNE   r0, r0, r0, lsl #6  ;; r0 = X * 0x451
	RSBNE   r0, r0, r0, lsl #16 ;; r0 = X * 0x0450fbaf

;;	now lookup in table indexed on top 6 bits of r0
	LDRNEB  r0, [ r2, r0, lsr #26 ]
	MOV		pc, lr

ffs_table;高6位寻址该表
;;         0   1   2   3   4   5   6   7
	DCB   -1,  0,  1, 12,  2,  6, -1, 13  ;;  0- 7
	DCB    3, -1,  7, -1, -1, -1, -1, 14  ;;  8-15
	DCB   10,  4, -1, -1,  8, -1, -1, 25  ;; 16-23
	DCB   -1, -1, -1, -1, -1, 21, 27, 15  ;; 24-31
	DCB   31, 11,  5, -1, -1, -1, -1, -1  ;; 32-39
	DCB    9, -1, -1, 24, -1, -1, 20, 26  ;; 40-47
	DCB   30, -1, -1, -1, -1, 23, -1, 19  ;; 48-55
	DCB   29, -1, 22, 18, 28, 17, 16, -1  ;; 56-63

;;	CLZNE   r0, r0
;;	RSBNE   r0, r0, #32
;;	MOV		pc, lr

;;
;; system clock interrupt server
;;
;	IMPORT	tm_tick
	IMPORT	tick_wrapper
	IMPORT	InterruptEnter
	EXPORT	TickHandler
TickHandler
	LDR		sp, =intstk
	STMFD	sp!, {r0-r3}
	
	;;
	;; Interrupt Ack
	;;
	MOV		r0, #0x100
	MOV		r1, #0x1e00000
	STR		r0, [r1, #0x24]

	;;
	;; Call avt interrupt handler
	;;
;	LDR		r3, =tm_tick
	LDR		r3, =tick_wrapper
	B		InterruptEnter

	IMPORT	URX0Isr
	IMPORT	UTX0Isr
	EXPORT	URX0Handler
	EXPORT	UTX0Handler
URX0Handler
	LDR		sp, =intstk
	STMFD	sp!, {r0-r3}
	LDR		r3, =URX0Isr
	B		InterruptEnter

UTX0Handler
	LDR		sp, =intstk
	STMFD	sp!, {r0-r3}
	LDR		r3, =UTX0Isr
	B		InterruptEnter

	IMPORT	EINT0Isr
	EXPORT	EINT0Handler
EINT0Handler
	LDR		sp, =intstk
	STMFD	sp!, {r0-r3}
	LDR		r3, =EINT0Isr
	B		InterruptEnter


	IMPORT	DoException
	EXPORT	UndefHandler
	EXPORT	PrefechAbortHandler
	EXPORT	DataAbortHandler
	EXPORT	SwiHandler

UndefHandler
	LDR		sp, =intstk
	STMFD	sp!, {r0-r12, lr}
	
	MRS		r0, cpsr
	MSR		cpsr_c, #0xD3
	MOV		r1, lr
	MRS		r2, spsr
	MSR		cpsr_c, r0
	
	STMFD	sp!, {r1, r2}
	
	MOV		r0, sp
	MOV		r1, #0
	BL		DoException
	LDMFD	sp, {r0-r12, lr}
	SUBS	pc, lr,#4

PrefechAbortHandler
	LDR		sp, =intstk
	STMFD	sp!, {r0-r12, lr}
	
	MRS		r0, cpsr
	MSR		cpsr_c, #0xD3
	SUB		r1, lr, #4
	MRS		r2, spsr
	MSR		cpsr_c, r0
	
	MOV		r0, sp
	MOV		r1, #1
	BL		DoException
	LDMFD	sp, {r0-r12, lr}
	SUBS	pc, lr,#4

DataAbortHandler
	LDR		sp, =intstk
	STMFD	sp!, {r0-r12, lr}
	
	MRS		r0, cpsr
	MSR		cpsr_c, #0xD3
	SUB		r1, lr, #8
	MRS		r2, spsr
	MSR		cpsr_c, r0
	
	STMFD	sp!, {r1, r2}
	
	MOV		r0, sp
	MOV		r1, #2
	BL		DoException
	LDMFD	sp, {r0-r12, lr}
	SUBS	pc, lr,#4

SwiHandler
	LDR		sp, =intstk
	STMFD	sp!, {r0-r12, lr}
	
	MRS		r0, cpsr
	MSR		cpsr_c, #0xD3
	MOV		r1, lr
	MRS		r2, spsr
	MSR		cpsr_c, r0
	
	MOV		r0, sp
	MOV		r1, #3
	BL		DoException
	LDMFD	sp, {r0-r12, lr}
	SUBS	pc, lr,#4

	AREA    AvtData,DATA, READWRITE

	SPACE	4096
intstk
	SPACE	4096
init_stk
    END

⌨️ 快捷键说明

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