《嵌入式电子系统设计》课程实验指导书实验1:最小系统实验,(2014.7.11)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一最小系统实验
一、实验目的
熟悉最小系统的硬件构成,掌握复位电路、晶振电路、电源电路(尤其是滤波电容的应用),编写一个例程,并在最小系统上运行;了解嵌入式开发的基本思想和过程。
掌握最小系统的构成,在将来的项目运用中能根据不同的场合选择相应的复位电路。
二、实验原理
本实验通过一个简短的Boot 引导程序介绍ARM 开发平台的启动过程,同时该引导程序也可其他章节程序引导的示例程序。本程序主要为了让读者能够清晰理解启动程序的基本架构组成部分以及掌握ARM 引导程序的编写方法。
三、主要实验设备
1.硬件:宿主机、ARM教学试验箱;
2.软件:Windows操作系统、ADS1.2集成开发环境。
四、实验内容
构建最小系统,用示波器观察一下晶振电路的波形,测一下晶振正常工作时的电压。编写一个例程,编译并运行。设置ARM仿真器的开发环境。程序架构如下:
1.程序头
IMPORT MDCNFG ;声明MDCNFG(读写寄存器)物理地址0x48000000
IMPORT MDREFR ;声明MDREFR(刷新寄存器)0x48000004
IMPORT MDMRS ;声明MDMRS(模式/设置寄存器0x48000040
IMPORT init_MDCNFG ; 声明init_MDCNFG 0x02000ac9
IMPORT init_MDREFR ; 声明init_MDREFR 0x0011e018
IMPORT init_MDMRS ; 声明init_MDMRS 0x320032
IMPORT StackSvc ; 声明StackSvc 0xa0600000
IMPORT StackIrq ; 声明StackIrq 0xa0605000
IMPORT StackFiq ; 声明StackFiq 0xa060a000
IMPORT StackAbt ; 声明StackAbt 0xa060e000
IMPORT StackUnd ; 声明StackUnd 0xa0714000
IMPORT StackUsr ; 声明StackUsr 0xa0720000
IMPORT main
IMPORT宏通知编译器本源码文件需要引用在其他文件中定义的变量或函数。
2.程序入口
AREA boot ,CODE ,READONLY
ENTRY ;初始化入口点
B Reset_Handler
该代码段定义了boot 程序所在的段(CODE)、属性(READONLY)等属性;
图1.1 程序链接配置
ENTRY宏表示程序的入口,一个程序可设置有多个入口,可通过工程配置设置程序执行入口函数(如图1-1),在引导程序中,boot代码段程序初始化入口点。由于AREA和ENTRY都是伪操作,不分配成实质的指令,所以,B Reset_Handler为程序执行第一条指令。
3.设置中断向量表
表1-1 ARM中断向量表
地址异常类型进入时的模式进入时I的状态进入时F的状态
0x0000 0000 复位管理禁止禁止
0x0000 0004 未定义指令未定义I F
0x0000 0008 软件中断管理禁止 F
0x0000 000C 中止(预取)中止I F
0x0000 0010 中止(数据)中止I F
0x0000 0014 保留保留——
0x0000 0018 IRQ 中断禁止 F
0x0000 001C FIQ 快中断禁止禁止
每当一个中断发生后,ARM 处理器便强制把程序计数器(PC)指针置为向量表中对应中断类型所对应的地址值。由于ARM 微处理器每个中断向量中只有4 个字节的大小,所以通常在中断向量位置存放 1 条跳转指令或存放1 条直接对程序计数器(PC)寄存器赋值的指令,使程序能跳转到相应的异常中断处理程序中执行。如果中断处理程序所在的物理地址小于32MB,可使用B 跳转指令;当跳转范围大于32MB 时,需使用LDR 指令。对于程序中未使用的中断,可使中断异常跳转到一个只含返回指令的哑函数或跳转到自身标号地址处,以防止中断异常引起系统的混乱。如:
Undefined_Handler
B Undefined_Handler
下面代码为ARM 微处理器中断向量表的初始化过程。
B Reset_Handler ;跳转复位0x0000,0000 复位管理模式
B Undefined_Handler ;跳转未定义指令0x0000,0004 未定义指令未定义模式
B SWI_Handler ;跳转软件中断0x0000,0008 软件中断管理模式
B Prefetch_Handler ;跳转预取指令0x0000,000
C 预取指令中止模式
B DataAbort_Handler ;跳转数据异常数据异常中止模式
NOP ;延时保留
B IRQ_Handler ;跳转IRQ(中断请求)0x0000,0018 IRQ IRQ
B FIQ_Handler ;跳转FIQ(快速中断请求)0x0000,001
C FIQ FIQ
从表1-1分析可知NOP一定不能去掉,必须要保证中断向量表正确建立。
4.程序初始化部分
;*************************
;Check if run in the SDRAM
;*************************
MOV R0,PC
CMP R0,#0x00000040
BNE SetStack
BL InitMem ;如果相等的话,则跳转到初始化内存代码段InitMem
SetStack ;定义设置堆栈标签
BL InitStack ;设置初始化堆栈