验证性实验.docx
- 文档编号:26346593
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:23
- 大小:967.05KB
验证性实验.docx
《验证性实验.docx》由会员分享,可在线阅读,更多相关《验证性实验.docx(23页珍藏版)》请在冰豆网上搜索。
验证性实验
验证性实验:
实验2.1
1.实验内容
(1)建立一个新的工程。
(2)建立一个C源文件,并添加到工程中。
(3)设置文本编辑器支持中文。
(4)设置编译链接控制选项。
(5)编译链接工程。
(6)调试工程。
2.实验步骤:
(1)建立一个新的工程。
启动ADSl.2IDE集成开发环境,选择File→New,使用ARMExecutableImage工程模板建立一个工程,工程名称为ADS,保存到D/ARM/ADS目录中。
(2)建立一个C源文件,并添加到工程中。
选择File→New建立一个新的文件Testl.S,设置直接添加到项目中,输入如下程序代码并保存。
(3)设置文本编辑器支持中文。
选择Edit→Perferences,弹出如下图所示对话框。
在Font选颂设置字体为Fixedsys,Script为CHINESE—GB2312.由于Tab在不同文本编辑器解释不同,建议在TabInsertsSpaces前打勾。
使Tab键插入的是多个空格。
(4)设置编译链接控制选项。
选择Edit→DebugRelSettings,在DebugRelSettings对话框的左边选择ARMLinker项,然后在Output页设置连接地址,在Options页设置调试入口地址。
(5)编译链接工程。
选择Project→Make.将编译链接整个工程。
若编译成功,则如下图所示,Errors&Warnings对话框会报告编译错误为0,此时即可对工程进行仿真。
(6)调试工程
如下图:
在代码第8行双击,出现红点表示在该行设置了断点,选择Execute—>Go全速执行,可以发现程序就停在第8行,左边ARM寄存器显示信息框中,对应寄存器发生变化。
其中显示,r0和r1分别为23和8,实验结果正确。
2.4汇编指令实验
1.实验目的
●了解ADS1.2集成开发环境及ARMulator软件仿真。
●掌握ARM7TDMI汇编指令的用法.并能编写简单的汇编程序。
●掌握指令的条件执行以及使用LDR/STR指令完成存储器的访问。
2.实验内容
使用STMFD/LDMFD、MUL指令编写一个整数乘方的子程序.然后使用BL指令调用子程序计算Xn的值。
3.实验原理
Xn=X×X×X×…×X,其中相乘的x的个数为”。
先将x的值装入R0和R1,使用寄存器R2进行计数,循环”一1次R0一R0×R1。
运算结果保存在R0中。
(不考虑结果溢出问题。
)
注意:
若”为0·则运算结果直接赋l;若”为1,则运算结果直接赋x。
4.实验步骤
打开ADS,建立工程,并新建文件,输入程序;并添加到工程中。
经过编译无错误;
打开寄存器窗口(ProcessorRegisters),选择Current项监视寄存器R0、R1、R13(SP)和R14(LR)的值。
由程序可知,
R0装入初始化值中的幂是X的值,X的值是9,并装入每次累乘之后的结果,作为返回值。
R1装入初始化值中的指数是n的值,n=8。
R2被R1赋入初始化值n=8,作为计数器,每次实现一次累乘后,R2自动减1。
R13为堆栈指针寄存器SP,入栈地址为0x40003F00,出栈地址为0x40003ECC。
R14为链接寄存器LR,,先后用于保存POW子程序返回地址和DO_MUL子程序返回地址。
经过单不运行程序,能够得到正确的结果。
实验程序
;文件名:
乘法指令
;功能:
计算X的n的次方
;说明:
X和n都是无符号整数
XEQU9;定义X的值为9
nEQU8;定义n的值为8
AREAExample4,CODE,READONLY;声明代码段Example4
ENTRY;标志程序入口
CODE32;声明32位ARM代码指令
STARTLDRSP,=0X40003F00;设置堆栈(满递减堆栈,使用STMFD/LMDFD指令)
LDRR0,=X
LDRR1,=n
BLPOW;调用子程序POW,返回值为R0
HALTBHALT
;名称:
POW
;功能:
整数乘方运算
;入口参数:
R0底数
;R1指数
;出口参数:
R0运算结果
;占用资源:
R0,R1
;说明:
本子程序不考虑溢出问题
POW
STMFDSP!
{R1-R12,LR};寄存器入栈保护
MOVSR2,R1;将指数值复制到R2,并影响条件码标志
MOVEQR0,#1;若指数为0,则设置R0=1
BEQPOW_END;若指数为0,则返回
CMPR2,#1
BEQPOW_END;若指数为1,则返回
MOVR1,R0;设置DO_MUL子程序的入口参数R0和R1
SUBR2,R2,#1;计数器R2-指数值减1
POW_L1BLDO_MUL;调用DO_MUL子程序,R0=R1*R0
SUBSR2,R2,#1;每循环一次计数器R2减101
BNEPOW_L1;若计数器R2不为0,跳转到POW_L1
POW_ENDLDMFDSP!
{R1-R12,PC};寄存器出栈返回
;名称:
DO_MUL
;功能:
32位乘法运算
;入口参数;R0乘数
;R1被乘数
;出口参数:
R0计算结果
;占用资源:
R0,R1
;说明:
本子程序不会破坏R1
DO_MULMULR0,R1,R0;R0=R1*R0
MOVPC,LR;返回
END
2.7ARM微控制器工作模式实验
1.实验目的
●掌握如何使用MRS/MSR指令实现ARM微控制器工作模式的切换。
●了解在各个工作模式下的寄存器。
2.实验内容
(1)使用MRS/MSR指令切换工作模式,并初始化各种模式下的堆栈指针。
(2)观察ARM微控制器在各种模式下寄存器的区别。
3.实验步骤
①启动ADS12,使用ARMExecutableImage工程模板建立一个工程2.7。
②建立汇编源文件ARM微控制器工作模式实验.s,编写实验程序,然后添加到工程中。
③设置工程链接地址ROBase为0x40000000,RWBase为0x40003000。
设置调试入口地址Imageentrypoint为0x40000000。
如下图:
④编译链接工程,选择Project—Debug,启动AXD进行软件仿真调试。
⑤打开寄存器窗口(ProcessorRegisters),选择Current项监视各寄存器的值。
经过单步运行到START后,R0到R12分别被赋值以对应的编号的值,在执行Initstack到后,R0被赋予LR寄存器中的值。
之后每执行一次MSRCPSR#立即数这句命令后,就改变为相应的堆栈模式。
然后将对应地址存储到堆栈(SP)单元中。
之后切换为快中断(FIQ)模式后,R8到R12都为0x00000000,再切换到用户模式后,R8到R13恢复到原值,最后切换到管理模式。
⑥单步运行程序,注意观察CPSR、SPSR、R13(SP)、R14(LR)和R15(PC)寄存器。
单步执行到initstack时,R14的值变为0x00008038,之后再将R14的值赋给R0,R15值在每执行完一段子程序后总是加4。
工作模式:
指示ARM微控制器当前的工作模式,包括user(用户模式)、FIQ(FIQ中断模式)、IRQ(中断模式)、Svc(:
(管理模式)、Abort(中止模式)、Undef(未定义模式)和SYS(系统模式)。
4.实验程序
ARM微控制器工作模式实验的参考程序见程序清单2.7。
;定义堆栈的大小
USR_STACK_LEGTHEQU64
SVC_STACK_LEGTHEQU0
FIQ_STACK_LEGTHEQU16
IRQ_STACK_LEGTHEQU64
ABT_STACK_LEGTHEQU0
UND_STACK_LEGTHEQU0
REAExample7,CODE,READONLY;声明代码段Example7
ENTRY;标志程序入口
CODE32;声明ARM32位指令
STARTMOVR0,#0
MOVR1,#1
MOVR2,#2
MOVR3,#3
MOVR4,#4
MOVR5,#5
MOVR6,#6
MOVR7,#7
MOVR8,#8
MOVR9,#9
MOVR10,#10
MOVR11,#11
MOVR12,#12
BLInitStack;初始化各种工作模式下的堆栈指针
;打开IRQ中断(将CPSR寄存器的I位清0)
MRSR0,CPSR;R0<=CPSR
BICR0,R0,#0X80
MSRCPSR_cxsf,R0;CPSR<=R0
;切换到用户模式
MSRCPSR_c,#0xd0
MRSR0,CPSR
;切换的到管理模式
MSRCPSR_c,#0xdf
MRSR0,CPSR
HALTBHALT
;名称:
initstack
;功能:
堆栈初始化,即初始化各模式下的堆栈指针
;入口指针:
无
;出口指针:
无
;说明:
在特权模式下,调用此子程序,如复位后的管理模式
InitStack
MOVR0,LR;R0<=LR,因为各种模式下RO是相同的
;设置管理模式堆栈
MSRCPSR_c,#0xd3
LDRSP,StackSvc
;设置中断模式堆栈
MSRCPSR_c,#0xd2
LDRSP,StackIrq
;设置快速中断模式堆栈
MSRCPSR_c,#0xd1
LDRSP,StackFiq
;设置中止模式堆栈
MSRCPSR_c,#0xd7
LDRSP,StackAbt
;设置未定义模式堆栈
MSRCPSR_c,#0xdb
LDRSP,StackUnd
;设置系统模式堆栈
MSRCPSR_c,#0xdf
LDRSP,StackUsr
MOVPC,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
;分配堆栈空间
AREAMystack,DATA,NOINIT,ALIGN=2
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
2.15外部存储器接口实验
1.实验目的
通过实验掌握外部存储器控制器(EMC)的设置及外部存储器接口的应用。
2.实验内容
使用外部存储器接口的Bank1连接一片16位总线接口的FLASH,然后使用程序初始化EMC,接着对FLASH进行全片擦除,编写两字节数据,再读出来校验,若校验通过则蜂鸣器响一声,否则不断地蜂鸣报警。
3.实验原理
JP6跳线设置为Bank0-RAM、Bank1-Flash,芯片SST39VF160与LPC2210的连接如下图所示。
根据硬件电路正确设置PINSEL2寄存器和BCFG1寄存器,然后向SST39VF160发送命令进行擦除、编程操作。
地址为0x81000000—0x811fffff
4.实验步骤
(1)启动ADS1.2,使用ARMExecutableImageforlpc22xx工程模板建立一个工程ADS2.15;建立C源文件SST39VF160.c,编写实验程序,然后添加到工程中;
(2)在Startup.s文件的ResetInit子程序中,修改PINSEL2寄存器和BCFG1寄存器的设置值。
对于本实验,PINSEL2寄存器的值使用模板默认设置即可,而BCFG1寄存器的值,可以修改IDCY、WST1、WST2域的值,也可以使用模板默认设置;
(3)选用DebugInExram生成目标,然后编译连接工程。
(4)选择【Project】->【Debug】,启动AXD进行JTAG仿真调试。
(5)打开存储器观察窗口(Memory)设置观察地址为0x81000000,显示方式大小为16Bit,监视片外FLASH的数据。
(6)可以单步运行程序,观察片外FLASH的数据,观察err变量的值。
(7)可以全速运行程序,若蜂鸣器响一声,表示FLASH擦除、编程操作成功。
若不断的蜂鸣报警,表示FLASH擦除或编程操作失败。
5实验程序
外部存储器接口实验的参考程序如下
/********************************************************************
*文件名:
main.c
*功能:
对SST39VF160进行全片擦除,然后写两字节数据到芯片0地址,再读出来校验,
*若校验通过则蜂鸣器响一声,否则不断地蜂鸣报警。
*说明:
无。
********************************************************************/
#include"config.h"
#defineBEEPCON1<<7//P0.7引脚控制B1,低电平蜂鸣
#defineFLASH_ADDR0x80000000//FLASH的起始地址(分配为Bank1块)
/*转换地址。
将要发送给SST39VF160的地址值进行转换,以便于LPC2210输出。
*/
/*由于SST39VF160的A0是与LPC2210的A1相连,所以addr要左移1位。
*/
#defineGetAddr(addr)(volatileuint16*)(FLASH_ADDR|(addr<<1))
/********************************************************************
*名称:
DelayNS()
*功能:
长软件延时。
*入口参数:
dly延时参数,值越大,延时越久
*出口参数:
无
********************************************************************/
voidDelayNS(uint32dly)
{uint32i;
for(;dly>0;dly--)
{
for(i=0;i<5000;i++);
}
}
/********************************************************************
*名称:
WordProgram()
*功能:
半字(16位)数据编程。
*入口参数:
Addr编程地址(SST39VF160内部地址)
*Data编程数据
*出口参数:
返回TRUE表示操作成功,返回FALSE表示操作失败
********************************************************************/
uint8WordProgram(uint32Addr,uint16Data)
{volatileuint16*ip;
uint16temp1,temp2;
ip=GetAddr(0x5555);//转换地址0x5555
ip[0]=0xaaaa;//第一个写周期,地址0x5555,数据0xAA
ip=GetAddr(0x2aaa);
ip[0]=0x5555;//第二个写周期,地址0x2aaa,数据0x55
ip=GetAddr(0x5555);
ip[0]=0xa0a0;//第三个写周期,地址0x5555,数据0xA0
ip=(volatileuint16*)(FLASH_ADDR|(Addr&0x1FFFFF));
*ip=Data;//第四个写周期,地址Addr,数据Data
while
(1)//等待操作完成(若编程操作没有完成,每次读操作DQ6会跳变)
{
temp1=*ip;
temp2=*ip;
if(temp1==temp2)
{
if(temp1!
=Data)
{
return(FALSE);
}
else
{
return(TRUE);
}
}
}
return(TRUE);
}
/********************************************************************
*名称:
ChipErase()
*功能:
芯片全片擦除。
*入口参数:
无
*出口参数:
返回TRUE表示操作成功,返回FALSE表示操作失败
********************************************************************/
uint8ChipErase(void)
{
volatileuint16*ip;
uint16temp1,temp2;
ip=GetAddr(0x5555);
ip[0]=0xaaaa;//第一个写周期,地址0x5555,数据0xAA
ip=GetAddr(0x2aaa);
ip[0]=0x5555;//第二个写周期,地址0x2aaa,数据0x55
ip=GetAddr(0x5555);
ip[0]=0x8080;//第三个写周期,地址0x5555,数据0x80
ip=GetAddr(0x5555);
ip[0]=0xaaaa;//第四个写周期,地址0x5555,数据0xAA
ip=GetAddr(0x2aaa);
ip[0]=0x5555;//第五个写周期,地址0x2aaa,数据0x55
ip=GetAddr(0x5555);
ip[0]=0x1010;//第六个写周期,地址0x5555,数据0x10
while
(1)//等待操作完成(若擦除操作没有完成,每次读操作DQ6会跳变)
{
temp1=*ip;
temp2=*ip;
if(temp1==temp2)
{
if(temp1!
=0xffff)
{
return(FALSE);
}
else
{
return(TRUE);
}
}
}
return(TRUE);
}
/********************************************************************
*名称:
main()
*功能:
SST39VF160擦除、编程操作。
********************************************************************/
intmain(void)
{uint8i;
uint8err=0;
volatileuint16*addr;
PINSEL0=0x00000000;//设置管脚连接GPIO
IO0DIR=BEEPCON;//设置I/O为输出
ChipErase();//FLASH全片擦除
//校验是否真正擦除。
若发现有非0xFFFF的存储单元,设置err=1
addr=(volatileuint16*)FLASH_ADDR+0;
for(i=0;i<100;i++)
{
if(0xFFFF!
=(*addr))err=1;
addr++;
}
WordProgram(0x0,0x55AA);//向FLASH的0地址写入0x55AA
addr=(volatileuint16*)FLASH_ADDR+0;
if(0x55AA!
=(*addr))err=1;//读出校验,若数据错误则设置err=1
if(0==err)
{
IO0CLR=BEEPCON;//BEEPCON=0
DelayNS(20);
IO0SET=BEEPCON;//BEEPCON=1
DelayNS(20);
}
else
{
while
(1)
{
IO0CLR=BEEPCON;//BEEPCON=0
DelayNS(10);
IO0SET=BEEPCON;//BEEPCON=1
DelayNS(10);
}
}
while
(1);
return(0);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 验证 实验