嵌入式系统与应用实验报告.docx
《嵌入式系统与应用实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式系统与应用实验报告.docx(47页珍藏版)》请在冰豆网上搜索。
嵌入式系统与应用实验报告
嵌
入
式
系
统
与
应
用
实
验
报
告
班级:
网络111
姓名:
石长江
学号:
3
实验一汇编指令试验
一、实验目的
掌握ARM7TMDI汇编指令的用法,并能编写简单的汇编程序;
学习ARM微控制器的16位Thumb汇编指令的使用方法
掌握指令的条件执行
二、实验设备
硬件:
嵌入式实验平台一套、仿真器一个、PC机一台。
软件:
Windows98/2000/NT/XP操作系统、仿真器驱动程序、ADS开发软件一套。
三、实验内容
分别使用ARM、Thumb指令ADD,MOV,CMP,B计算1+2+3+…+N的值。
四、实验原理
ARM处理器共有两种工作状态:
ARM32位,这种状态下执行字对准的ARM指令。
Thumb16位,这种状态下执行半字对准的Thumb指令。
注意:
ARM和Thumb之间状态的切换不影响处理器的模式或寄存器的内容。
ARM处理器在两种工作状态之间可以切换。
(1)进入Thumb状态。
当操作数寄存器的状态位0为1时,执行BX指令进入Thumb状
态。
如果处理器在Thumb状态进入异常,则当从异常出来(IRQ、FIQ、Undef、Abort、SWI)
返回时,自动切换到Thumb状态。
(2)进入ARM状态。
当操作数寄存器的状态位0为0时,执行BX指令进入ARM状态。
处
理器进行异常处理(IRQ、FIQ、Undef、Abort、SWI)。
在此情况下,把PC放入异常模
式链接寄存器中。
从异常向量地址开始执行也可以进入ARM状态。
Thumb状态下的寄存器集是ARM状态下寄存器集的子集。
程序员可以直接访问8个通用
寄存器(R0-R7)、PC、SP、LR和CPSP。
每一种特权模式都有一组SP、LR和SPSR。
Thumb状态的R0-R7与ARM状态的R0-R7一致。
Thumb状态的CPSR和SPSR与ARM状态下的CPSR和SPSR一致。
Thumb状态的SP映射到ARM状态的R13。
Thumb状态的LR映射到ARM状态的R14。
Thumb状态的PC映射到ARM状态的PC(R15)。
本程序使用R0保存结果,所以一开始就要初始化为0;循环执行R0=R0+R1,R1为循环计
数器,从1开始计数,每一次循环R1加1;当循环计数器R1的值到达N时,运算结束。
五、实验操作步骤
1.启动ADS1.2,使用ARMExecuatableImage工程模板建立一个工程ASM_Project。
2.建立源文件test2.s,编写实验程序,然后添加到工程中(ARM指令和Thumb指令实验
的test2.s程序源码分别见下清单)。
3.设置工程链接地址ROBase为0x0C
4.编译链接工程,选择【Project】->【Debug】,启动AXD进行调试。
5.打开寄存器窗口(ProcessorRegisters),选择Current项监视各寄存器的值。
6.单步运行程序,注意执行BXR0指令前后CPSR寄存器的T位。
说明:
在寄存器窗口的CPSR寄存器,大写字母的位表示该位为1,小写字母的位表示该
位为0(比如“T”表示T位为1,“t”表示T位为0)。
7.理解并掌握本实验原理及程序,完成练习题
六、实验参考程序
Thumb汇编指令实验的参考程序代码清单
;文件名:
test.s
;功能:
计算1+2+3+…+N的值
NEQU50定义N的值为50
AREAtestcode,CODE,READONLY区域名为testcode,代码,只读
ENTRY入口
CODE32
ARM_CODELDRSP,=0x40003F00sp=0x40003F00
ADRR0,THUMB_CODE+1将分支目标地址送R0,使R1的bit[0]=1
BXR0分支并且转换为thumb状态
LTORG
CODE16汇编以下代码为thumb指令
THUMB_CODE
LDRR0,=N伪指令R0=50
BLSUM_N跳转到SUM_N执行
BTHUMB_CODE跳转到THUMB_CODE,thumb模式
;名称:
SUM_N
;功能:
计算1+2+3+…+N的值
;入口参数:
R0(N的值)
;出口参数:
R0(运算结果)
SUM_N
PUSH{R1-R7,LR}
MOVSR2,R0R0的内容放入R2
BEQSUM_END相等转到SUM_END
CMPR2,#1R2与1比较,设置标志位
BEQSUM_END相等转到SUM_END
MOVR1,#1将1送入R1
MOVR0,#0将0送入R0
SUM_L1ADDR0,R1R0=R0+R1
BCSSUM_ERR
CMPR1,R2R1与R2比较,设置标志位
BHSSUM_END
ADDR1,#1R0=R0+1
BSUM_L1转到SUM_L1
SUM_ERRMOVR0,#0__将0送入R0
SUM_ENDPOP{R1-R7,PC}
END
ARM汇编指令实验的参考程序代码清单:
;文件名:
add.s
;功能:
计算1+2+3+…+N的值
NEQU5;定义N的内容为5
AREAExample,CODE,READONLY定义区域,区域名为Example,代码,只读
ENTRY入口
CODE32
START
LDRR0,=NR0=5
MOVR2,R0R2=R0
MOVR0,#0R0=0
MOVR1,#0R1=0
LOOP
CMPR1,R2比较R1与R2
BHIADD_END
ADDR0,R0,R1R0=R0+R1
ADDR1,R1,#1R1=R1+1
BLOOP转到loop
ADD_END
BSTART转到start
END
实验二ARM微处理器工作模式实验
一、实验目的
通过实验掌握学会使用MSR/MRS指令实现ARM处理器工作模式的切换,观察
不同模式下的寄存器,加深对CPU结构的理解。
二、实验设备
硬件:
嵌入式实验平台一套、仿真器一个、PC机一台。
软件:
Windows98/2000/NT/XP操作系统、仿真器驱动程序、ADS开发软件一套。
三、实验内容
通过ARM汇编指令,在各种处理器模式下切换并观察各种模式下寄存器的区别;掌握
ARM不同模式的进入与退出。
四、实验原理
1.ARM处理器模式
ARM体系结构支持表1-所示的7种处理器模式。
处理器模式说明
用户usr正常程序执行模式
FIQfiq支持告诉数据传送或通道处
理
IRQirq用于通用中断处理
管理svc操作系统保护模式
中止abt实现虚拟存储器和/或存储器
保护
未定义und支持硬件协处理器的软件仿
真
系统sys运行特权操作系统任务
表1-处理器模式
在软件控制下也可以改变模式,外部中断或异常处理也可以引起模式发生改变。
大多数
应用程序在用户模式下执行。
当处理器工作在用户模式时,正在执行的程序不能访问某些被
保护的系统资源,也不能改变模式,除非异常发生。
这允许适当编写操作系统来控制系统资
源的使用。
除用户模式外的其他模式成为特权模式。
它们可以自由地访问系统资源和改变模
式。
其中5种称为异常模式,即:
FIQ(FastInterruptRequest);
IRQ(InterruptRequest);
管理(Supervisor);
中止(Abort);
未定义(Undefined)
当特定的异常出现时,进入相应的模式。
每种模式都有某些附加的寄存器,以避免异常
出现时用户模式的状态不可靠。
剩下的模式是系统模式。
仅ARM体系结构V4以及以上的
版本有该模式。
不能由于任何异常而进入该模式。
它与用户模式有相同的寄存器,但它是特
权模式,不受用户模式的限制。
它供需要访问系统资源的操作系统任务使用,但希望避免使
用与异常模式有关的附加寄存器。
避免使用附加寄存器保证了当任何异常出现时,都不会使
任务的状态不可靠。
2.程序状态寄存器
在所有处理模式下,都可以访问当前程序状态寄存器CPSR。
CPSR包含条件码标志、中断
禁止位、当前处理器模式以及其他状态和控制信息。
每种异常模式都有一个程序状态保
存寄存器SPSR。
当异常出现时,SPSR用于保存CPSR的状态。
CPSR和SPSR的格式如下:
(1)条件码标志
N、Z、C、V:
大多数指令可以检测这些条码标志,以决定程序指令如何执行。
(2)控制位
最低8位I、F、T和M位用作控制位。
当异常出现时改变控制位。
当处理器在特权模式
下时也可以由软件改变。
l中断禁止位:
I置1则禁止IRQ中断;F置1则禁止FIQ中断。
lT位:
T=0指示ARM执行;T=1指示Thumb执行。
在这些体系结构的系统中,可自由
地使用能在ARM和Thumb状态之间切换的指令。
l模式位:
M0、M1、M2、M3和M4(M[4:
0])是模式位。
这些位决定处理器的工作模
(3)其他位
程序状态寄存器的其他位保留,用作以后扩展。
五、实验操作步骤
1.启动ADS1.2,建立一个新的工程;
2.建立汇编源程序文件TEST3.S,编写实验程序,添加到工程中;
3.编译链接工程,点击Debug按钮,启动AXD进行调试;
4.点击【ProcessorViews】->【Registers】,打开Current项监视个寄存器的值;
5.单步运行程序,注意观察CPSR、SPSR以及R0寄存器值得变化。
说明:
CPSR寄存器显示方式如图1-所示。
显示分为两部分,一部分是各个标志位,另
一部分是工作模式。
标志位NZCVQ为条件码标志N、Z、C、V、Q,显示为大写字母,表示该
位为1;显示为小写字母,表示该位为0。
Q标志在ARM体系结构v5及以上版本的E变量中
才有效。
标志位IFT为IRQ中断禁止位I、FIQ中断禁止位F、ARM微控制器状态位T,显示
为大写字母,表示该位为1;显示为小写字母,表示该位为0。
T标志在ARM体系结构v4及
以上版本的T变量中才有效。
寄存器显示窗口
六、实验参考程序
ARM微控制器工作模式实验的参考程序如下:
USR_STACK_LEGTHEQU64定义各块的长度
SVC_STACK_LEGTHEQU0
FIQ_STACK_LEGTHEQU16
IRQ_STACK_LEGTHEQU64
ABT_STACK_LEGTHEQU0
UND_STACK_LEGTHEQU0
AREAExample3,CODE,READONLY定义区域,区域名为Example3,代码,只读
ENTRY入口
CODE32
STARTMOVR0,#0R0=0
MOVR1,#1R1=1
MOVR2,#2R2=2
MOVR3,#3R3=3
MOVR4,#4R4=4
MOVR5,#5R5=5
MOVR6,#6R6=6
MOVR7,#7R7=7
MOVR8,#8R8=8
MOVR9,#9R9=9
MOVR10,#10R10=10
MOVR11,#11R11=11
MOVR12,#12R12=12
BLInitStack
MRSR0,CPSRR0的内容送入CPSR
BICR0,R0,#0X80
MSRCPSR_cxsf,R0CPSR_cxsf=R0
MSRCPSR_c,#0xd0CPSR_c=0xd0
MRSR0,CPSRR0的内容送入CPSR
MSRCPSR_c,#0xd0CPSR_c=0xd0
MRSR0,CPSRR0的内容送入CPSR
HALTBHALT暂停
;名称:
InitStack
;功能:
堆栈初始化,即初始化各模式下下的堆栈指针。
;入口参数:
无
;出口参数:
无
InitStack
MOVR0,LRLR=R0
MSRCPSR_c,#0xd3CPSR_c=0xd3
LDRSP,StackSvcSP=StackSvc,指针指到StackSvc
MSRCPSR_c,#0xd2CPSR_c=0xd2
LDRSP,StackIrqSP=StackIrq,指针指到StackIrq
MSRCPSR_c,#0xd1CPSR_c=0xd1
LDRSP,StackFiqSP=StackFiq,指针指到StackFiq
MSRCPSR_c,#0xd7CPSR_c=0xd7
LDRSP,StackAbtSP=StackAbt,指针指到StackAbt
MSRCPSR_c,#0xdbCPSR_c=0xdb
LDRSP,StackUndSP=StackUnd,指针指到StackUnd
MSRCPSR_c,#0xdfCPSR_c=0xdf
LDRSP,StackUsrSP=StackUsr,指针指到StackUsr
MOVPC,R0PC=R0
StackUsrDCDUsrStackSpace+(USR_STACK_LEGTH-1)*4字定义
StackSvcDCDSvcStackSpace+(SVC_STACK_LEGTH-1)*4
StackIrqDCDIrqStackSpace+(IRQ_STACK_LEGTH-1)*4
StackFiqDCDFiqStackSpace+(FIQ_STACK_LEGTH-1)*4
StackAbtDCDAbtStackSpace+(ABT_STACK_LEGTH-1)*4
StackUndDCDUndStackSpace+(UND_STACK_LEGTH-1)*4
AREAMyStacks,DATA,NOINIT,ALIGN=2区域名为MyStacks,数据,
UsrStackSpaceSPACEUSR_STACK_LEGTH*4
SvcStackSpaceSPACESVC_STACK_LEGTH*4
IrqStackSpaceSPACEIRQ_STACK_LEGTH*4
FiqStackSpaceSPACEFIQ_STACK_LEGTH*4
AbtStackSpaceSPACEABT_STACK_LEGTH*4
UndStackSpaceSPACEUND_STACK_LEGTH*4
END
各模式下cpsr的值的含义及相关寄存器的值的变化。
实验三通用IO口试验
一、实验目的
熟悉ARM芯片I/O口编程配置方法;
掌握ARM芯片I/O口控制LED显示的方法。
二、实验设备
硬件:
嵌入式实验平台一套、仿真器一个、PC机一台。
软件:
Windows98/2000/NT/XP操作系统、仿真器驱动程序、ADS开发软件一套。
三、实验内容
控制嵌入式实验箱上的LED轮流点亮。
四、实验原理
S3CRRB0X芯片上共有71个多功能I/O引脚,他们分别为7组I/O端口:
2个9位I/O端口(端口E和F)
2个8位I/O端口(端口D和G)
1个16位I/O端口(端口C)
1个10位I/O端口(端口A)
1个11位I/O端口(端口B)
每组端口都可以通过软件配置寄存器来满足不同系统合设计的需要。
在运行主程序之
前,必须先对每一个用到的引脚的功能进行设置。
如果某些引脚的附庸功能没有使用,那么
可以先将该引脚设置为I/O口。
S3C44B0X芯片与端口相关的寄存器
(1)端口控制寄存器(PCONA~G):
在S3C44B0X芯片中,大部分引脚是使用多路复用的,所以要确定每个引脚的功能。
PCONn(端口控制寄存器)能够定义引脚功能。
如果PG0~PG7作为掉电模式下的唤醒信号,那么这些端口必须配置成中断模式。
(2)端口数据寄存器(PDATA~G):
如果端口定义为输出口,那么输出数据可以写入
PDATn中相应的位;如果端口定义为输入口,那么输入数据可以从PDATn相应的位中读入。
(3)端口上拉寄存器(PUPC~G):
通过配置端口上拉寄存器,可以使该组端口与上拉电阻连接或断开。
当寄存器中相应位配置为0时,该引脚接上拉寄存器;当寄存器中相应位配置为1时,该引脚不接上拉电阻。
(4)外部中断寄存器(EXTINT):
通过不同的信号方式可以使8个外部中断被请求。
EXTINT寄存器可以根据外部中断的需求,将中断触发信号配置为低电平触发,高电平触发,下降沿触发,上升沿触发和边沿触发几种方式。
五、实验操作步骤
1.启动ADS1.2,使用ARMExecuatableImage工程模板新建一个工程;
2.添加两个组INC和SRC;
3.将INC文件夹下所有文件添加到组INC中;
4.将SRC文件夹下所有文件添加到组SRC中;
5.建立源文件test5.C,编写实验程序,添加到工程中;
6.编译链接选项的设置同前面实验;
7.编译链接工程,点击Debug按钮,启动AXD进行调试;
8.连续点击stepin按钮,单步运行程序,主板上的三个LED灯循环点亮。
9.理解并掌握本实验原理及程序,完成练习题
六、实验参考程序
#include"option.h"
#include"def.h"
#include"44b.h"
#include"44blib.h"
voidIsr_Init(void);
voidHaltUndef(void);
voidHaltSwi(void);
voidHaltPabort(void);
voidHaltDabort(void);
voidMain(void)
{
rSYSCFG=SYSCFG_8KB;
#if(PLLON1)
ChangePllValue(PLL_M,PLL_P,PLL_S);
#endif
Isr_Init();
Port_Init();
Uart_Init(0,);波特率是
Uart_Select(0);
Delay(0);//calibrateDelay()延迟
Led_Display(7);0111三个灯全亮
Delay(1000);//calibrateDelay()
Led_Display(0);
Delay(5000);//calibrateDelay()
Led_Display(7);
Uart_Printf("\nstart\n");
while
(1)
{
Delay(5000);//calibrateDelay()
Led_Display
(1);亮第一个灯,其他灭
Delay(5000);//calibrateDelay()
Led_Display
(2);亮第二个灯,其他灭
Delay(5000);//calibrateDelay()
Led_Display(4);亮第三个灯,其他灭
}
}
voidIsr_Init(void)
{
U32i;
pISR_UNDEF=(unsigned)HaltUndef;
pISR_SWI=(unsigned)HaltSwi;
pISR_PABORT=(unsigned)HaltPabort;
pISR_DABORT=(unsigned)HaltDabort;
for(i=_RAM_STARTADDRESS;i<(_RAM_STARTADDRESS+0x20);i+=4)
{
*((volatileunsigned*)i)=0xEA+0x1FFE;
}
rINTCON=0x5;//Non-vectored,IRQenable,FIQdisable
rINTMOD=0x0;//All=IRQmode
rINTMSK|=BIT_GLOBAL|BIT_EINT3;//Allinterruptismasked.
}
voidHaltUndef(void)
{
Uart_Printf("Undefinedinstructionexception\n");
while
(1);
}
voidHaltSwi(void)
{
Uart_Printf("SWIexception\n");
while
(1);
}
voidHaltPabort(void)
{
Uart_Printf("Pabortexception\n");
while
(1);
}
voidHaltDabort(void)
{
Uart_Printf("Dabortexception\n");
while
(1);
}
思考题
1.本试验中共用到了那些寄存器,他们的作用是什么?
2.在原程序的基础上改变led灯的闪烁方式。
将其中部分程序改为以下程序,使其变为每次两个灯一起亮
Uart_Printf("\nstart\n");
while
(1)
{
Delay(5000);//calibrateDelay()
Led_Display(3);
Delay(5000);//calibrateDelay()
Led_Display(5);
Delay(5000);//calibrateDelay()
Led_Display(6);
}
}
实验四串口试验
一、实验目的
1.掌握ARM的串行口工作原理
2.学习编程实现ARM的UART通讯
3.掌握CPU利用串口通讯的方法
二、实验设备
硬件:
ARM嵌入式开发板、用于ARM7TDMI的JTAG仿真器、PC、串口线。
软件:
PC机操作系统win98、Win2000或WinXP、ARMSDT2.51或ADS1.2集
成开发环境、仿真器驱动程序、超级终端通讯程序
三、预备知识
1.用ARMADS1.2集成开发环境,编写和调试程序的基本过程
2.ARM应用程序的框架结构
3.了解串行总线
四