📄 44binit.s
字号:
;/*
;************************************************************************************************************
;* 北京精仪达盛科技有限公司
;* 研 发 部
;*
;* 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 + -