新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于ARM核的Bootloader代码的分析与设计

基于ARM核的Bootloader代码的分析与设计

作者:时间:2018-09-14来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/201809/389170.htm

ldr r1,=0xfff

str r1,[r0]

.if PLLONSTART

ldr r0,=PLLCON /* 设置 PLL */

ldr r1,=((M_DIV12)+(P_DIV4)+S_DIV) /*Fin=8MHz,Fout=64MHz*/

str r1,[r0]

.endif

ldr r0,=CLKCON

ldr r1,=0x7ff8 /* 所有单元时钟允许 */

str r1,[r0]

/* 为 BDMA 设置复位值 */

ldr r0,=BDIDES0

ldr r1,=0x40000000 /* BDIDESn 复位值应为 0x40000000 */

str r1,[r0]

ldr r0,=BDIDES1

ldr r1,=0x40000000 /* BDIDESn 复位值应为 0x40000000 */

str r1,[r0]

/* 设置存储器控制寄存器,存储器的配置数据都存储在 SMRDATA 为起始地址的数据表中,下面的代码可以一次将预先配置好的初始化数据存入与存储器控制器相关的 13 个寄存器,这些寄存器则是以 0x01c80000 为起始地址的 13 个连续的 32 位寄存器 */

ldr r0,=SMRDATA

ldmia r0,{r1-r13}

ldr r0,=0x01c80000 /* BWSCON 存储控制寄存器地址 */

stmia r0,{r1-r13}

/* 初始化堆栈 */

/* CPU 复位后是处于管理模式下的,所以首先要初始化管理模式下的堆栈寄存器 */

ldr sp, =SVCStack

/* 由于处理器的每种运行模式都要有自己独立的物理堆栈寄存器 R13 ,在用户应用程序的初始化部分,一般都要初始化每种模式下的 R13 ,使其指向该运行模式的栈空间,这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入 R13 所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复,采用这种方式可以保证异常发生后程序的正常执行 */

bl InitStacks /* 跳转至其它堆栈初始化程序并返回 */

/* 设置 IRQ 中断处理 */

/*44B0 有两种中断模式:一种是没有中断向量表;一种是使用了中断向量表,使用中断向量表只能是 IRQ 方式。当使用中断向量表的时候,中断发生时由 S3C44B0 的中断控制器根据中断向量表,利用硬件方式自动跳转到相应的中断处理服务程序所在的位置;不使用中断向量表时按下面的代码,利用软件方式跳转而进行中断处理,因为 S3C44B0 有 30 个中断源,所以需要程序判断以确定调用那个中断服务程序 */

ldr r0,=HandleIRQ /* 如果在 0x18 和 0x1c 地址处无 “subs pc,lr,#4”*/

ldr r1,=IsrIRQ /* 为了中断正常返回这些语句是必须的 */

str r1,[r0]

/* 拷贝读写区域数据 / 数据区准备,将系统需要读写的数据和变量从 ROM 拷贝到 RAM 里。 Image_RO_Limit 、 Image_RW_Base 、 Image_ZI_Base 等这些符号还会在另外的链接脚本文件中出现,这些符号是用来定位程序各个段的参考信息。集成开发环境在编译链接的时候会根据我们编写的程序,把它们转换成用来对各个段定位的地址信息 */

LDR r0, =Image_RO_Limit /* 取只读数据区域地址指针 */

LDR r1, =Image_RW_Base /* 准备执行拷贝操作 */

LDR r3, =Image_ZI_Base

CMP r0, r1 /* 检查是否相同 */

BEQ F1 /* 相同则跳过拷贝操作 */

F0:

CMP r1, r3 /* 执行拷贝操作 */

LDRCC r2, [r0], #4

STRCC r2, [r1], #4

BCC F0

F1:

LDR r1, =Image_ZI_Base /* 零数据准备区起始地址 */

MOV r2, #0

F2:

CMP r3, r1 /* 执行数据区清零 */

STRCC r2, [r3], #4

BCC F2

MRS r0, CPSR

BIC r0, r0, #NOINT /* 中断请求允许 */

MSR CPSR_cxsf, r0

/* 跳转到 C 入口程序 */

BL Main

B .

四 . 总结:

启动过程中的初始化程序就是初始化 CPU 内部各个关键的寄存器、配置外围硬件电路相关寄存器、建立中断向量表等,然后跳转到一般由高级语言编写的主函数的应用程序代码去执行,这样就可以利用高级语言来编写完成系统设计所要求的各种功能。初始化的过程对大多数初学者来说,比较难理解的是中断的处理和一些少见的操作符号,这些符号多是一些宏定义或系统用于在内存空间中对各个段的定位标识符号。掌握了 S3C44B0的启动代码之后,对系统功能程序设计会起到很大的帮助,是进行下一步程序设计的基础。


上一页 1 2 下一页

关键词: ARM核 Bootloader代码

评论


技术专区

关闭