嵌入式系统实验与课程设计指导书.docx
《嵌入式系统实验与课程设计指导书.docx》由会员分享,可在线阅读,更多相关《嵌入式系统实验与课程设计指导书.docx(117页珍藏版)》请在冰豆网上搜索。
嵌入式系统实验与课程设计指导书
第一部分实验课程
第一节实验
实验一ADS1.2集成开发环境练习
1、实验目的
了解ADS1.2集成开发环境的使用方法
2、实验设备
硬件:
PC机一台
软件:
Windows98/XP/2000系统,ADS1.2集成开发环境
3、实验内容
(1)建立一个新的工程
(2)建立一个汇编源文件,添加到工程
(3)设置文本编译器支持中文
(4)设置编译链接控制选项
(5)编译连接工程
(6)调试工程
4、源代码:
AREAExample1,CODE,READONLY;声明代码段Example1
ENTRY;标识程序入口
CODE32;声明32位ARM指令
STARTMOVR0,#15;设置参数
MOVR1,#8
ADDSR0,R0,R1;R0=R0+R1
BSTART
END
/********************************************************************/
实验二:
汇编指令实验1
1、实验目的
(1)了解ADS1.2集成开发环境以及ARMulator软件仿真
(2)掌握ARM7TDMI汇编指令的用法,编写简单的汇编程序
(3)掌握指令的条件执行和使用LDR/STR完成存储器的访问
2、实验设备
硬件:
PC机一台
软件:
Windows98/XP/2000系统,ADS1.2集成开发环境
3、实验内容
(1)使用LDR读取0x40003100的数据,将数据加1,如小于10则用STR将结果写回原地址,如大于等于10,把0写回原地址。
再次读出0x40003100数据,加1,判断……周而复此循环。
(2)使用ADS1.2单步、全速运行程序,设置断点,打开寄存器窗口监视R0、R1的值,打开存储器观察窗口监视0x40003100上的值。
4、源代码:
COUNTEQU0x40003100;定义一个变量,地址为0x40003100
AREAExample2,CODE,READONLY;声明代码段Example2
ENTRY;标识程序入口
CODE32;声明32位ARM指令
STARTLDRR1,=COUNT;R1<=COUNT
MOVR0,#0;R0<=0
STRR0,[R1];[R1]<=R0,即设置COUNT为0
LOOPLDRR1,=COUNT;伪指令加载地址到R1
LDRR0,[R1];R0<=[R1]
ADDR0,R0,#1;R0<=R0+1
CMPR0,#10;R0与10比较,影响条件码标志
MOVHSR0,#0;若R0大于等于10,
;则此指令执行,R0<=0
STRR0,[R1];[R1]<=R0,即保存COUNT
BLOOP
END
实验三:
汇编指令实验2
1、实验目的
(1)掌握ARM数据处理指令的使用方法。
(2)了解ARM指令灵活的第2个操作数。
2、实验设备
硬件:
PC机一台
软件:
Windows98/XP/2000系统,ADS1.2集成开发环境
3、实验内容
(1)使用MOV和MON指令访问ARM通用寄存器。
(2)使用ADD/SUB/AND/ORR/CMP/TST等指令完成数据加减运算及逻辑运算。
4、源代码:
XEQU11;定义X的值为11
YEQU8;定义Y的值为8
BIT23EQU(1<<23);定义BIT23的值为0x00800000
AREAExample3,CODE,READONLY;声明代码段Example3
ENTRY;标识程序入口
CODE32;声明32位ARM指令
START;使用MOV、ADD指令实现:
R8=R3=X+Y
MOVR0,#X;R0<=X,X的值必须是8位图数据
MOVR1,#Y;R1<=Y,Y的值必须是8位图数据
ADDR3,R0,R1;即是R3=X+Y
MOVR8,R3;R8<=R3
;使用MVN、SUB指令实现:
R5=0x5FFFFFF8-R8*8
MVNR0,#0xA0000007;0xA0000007的反码为0x5FFFFFF8
SUBR5,R0,R8,LSL#3;R8左移3位,结果即是R8*8
;使用CMP指令判断(5*Y/2)>(2*X)吗?
若大于则R5=R5&0xFFFF0000,
;否则R5=R5|0x000000FF
MOVR0,#Y
ADDR0,R0,R0,LSL#2;计算R0=Y+4*Y=5*Y
MOVR0,R0,LSR#1;计算R0=5*Y/2
MOVR1,#X
MOVR1,R1,LSL#1;计算R1=2*X
CMPR0,R1;比较R0和R1,即(5*Y/2)和(2*X)进行比较
LDRHIR2,=0xFFFF0000;若(5*Y/2)>(2*X),则R2<=0xFFFF0000
ANDHIR5,R5,R2;若(5*Y/2)>(2*X),则R5=R5&R2
ORRLSR5,R5,#0x000000FF;若(5*Y/2)≤(2*X),则R5=R5|0x000000FF
;使用TST指令测试R5的bit23是否为1,
;若是则将bit6位清零(使用BIC指令)
TSTR5,#BIT23
BICNER5,R5,#0x00000040
BSTART
END
/******************************************************************************
第二节实验
实验四:
ARM微控制器工作模式实验
1、实验目的
(1)掌握使用MRS/MSR实现ARM工作模式的切换。
(2)了解各模式下的寄存器。
2、实验设备
硬件:
PC机一台
软件:
Windows98/XP/2000系统,ADS1.2集成开发环境
3、实验内容
(1)使用MRS/MSR指令切换工作模式,并初始化各模式下的堆栈指针。
(2)观察ARM在各模式下寄存器的区别。
4、源代码:
;定义堆栈的大小
USR_STACK_LEGTHEQU64
SVC_STACK_LEGTHEQU0
FIQ_STACK_LEGTHEQU16
IRQ_STACK_LEGTHEQU64
ABT_STACK_LEGTHEQU0
UND_STACK_LEGTHEQU0
AREAExample7,CODE,READONLY;声明代码段Example7
ENTRY;标识程序入口
CODE32;声明32位ARM指令
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位清零)
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,因为各种模式下R0是相同的
;设置管理模式堆栈
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
;数据定义伪指令DCD,分配一段字内存空间,用(UsrStackSpace+(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
StackUndDCDUndtStackSpace+(UND_STACK_LEGTH-1)*4
;分配堆栈空间
AREAMyStacks,DATA,NOINIT,ALIGN=2
UsrStackSpaceSPACEUSR_STACK_LEGTH*4;用户(系统)模式堆栈空间
;数据定义伪指令SPACE,分配一块内存单元,用0初始化
SvcStackSpaceSPACESVC_STACK_LEGTH*4;管理模式堆栈空间
IrqStackSpaceSPACEIRQ_STACK_LEGTH*4;中断模式堆栈空间
FiqStackSpaceSPACEFIQ_STACK_LEGTH*4;快速中断模式堆栈空间
AbtStackSpaceSPACEABT_STACK_LEGTH*4;中止义模式堆栈空间
UndtStackSpaceSPACEUND_STACK_LEGTH*4;未定义模式堆栈
END
/******************************************************************************
实验五:
C语言程序实验
1、实验目的
通过实验了解ADS1.2编写C程序,并进行调试
2、实验设备
硬件:
PC机一台
软件:
Windows98/XP/2000系统,ADS1.2集成开发环境
3、实验内容
编写一个汇编程序文件和C程序文件。
汇编为简单的启动程序。
C程序计算1+2+3…..+N的值。
4、源代码(简单的启动代码startup.s)
;启动文件。
初始化C程序的运行环境,然后进入C程序代码。
IMPORT|Image$$RO$$Limit|;伪指令IMPORT,指示编译器当前符号不是在本源文件中定义的
;变量指定了R0的结束地址
IMPORT|Image$$RW$$Base|;变量指定了RW的基地址
IMPORT|Image$$ZI$$Base|;变量指定了ZI的基地址
IMPORT|Image$$ZI$$Limit|;变量指定了ZI的结束地址
IMPORTMain;声明C程序中的Main()函数
AREAStart,CODE,READONLY;声明代码段Start
ENTRY;标识程序入口
CODE32;声明32位ARM指令
ResetLDRSP,=0x40003F00;设置堆栈指针
;初始化C程序的运行环境
LDRR0,=|Image$$RO$$Limit|;指向ROM的数据区?
得到RW的数据源的起始地址?
都是
LDRR1,=|Image$$RW$$Base|;指向RW的起始地址
LDRR3,=|Image$$ZI$$Base|;指向ZI的起始地址,即RW的结束地址
;在【R0,=|Image$$RO$$Limit|】中,是指定加载RW的起始地址
;在【LDRR1,=|Image$$RW$$Base|】是实际的RW运行地址
CMPR0,R1;比较他们是否相等?
BEQLOOP1;相等,跳转到LOOP1
LOOP0CMPR1,R3;拷贝初始化数据
LDRCCR2,[R0],#4;-->LDRCCR2,[R0]+ADDR0,R0,#4
STRCCR2,[R1],#4;-->STRCCR2,[R0]+ADDR0,R0,#4
BCCLOOP0
LOOP1LDRR1,=|Image$$ZI$$Limit|;ZI的结束地址
MOVR2,#0
LOOP2CMPR3,R1;将ZI区域全部清零
STRCCR2,[R3],#4
BCCLOOP2
BMain;跳转到C程序代码Main()函数
END
源代码(C语言部分):
#defineuint8unsignedchar
#defineuint32unsignedint
#defineN100
uint32sum;
//使用加法运算来计算1+2+3+...+(N-1)+N的值。
(N>0)
voidMain(void)
{uint32i;
sum=0;
for(i=0;i<=N;i++)
{sum+=i;
}
while
(1);
}
/******************************************************************************
第三节实验
实验六:
GPIO输出控制实验1
1、实验目的
(1) 掌握LPC2200专用工程模块的使用
(2) 掌握EASYJTAG仿真器的安装与使用
(3) 在开发平台上运行第一个程序
(4) 熟悉ARM7的GPIO控制
2、实验设备
硬件:
PC机 一台
MAGICARM2200-S教学实验开发平台一套
软件:
Windows98/XP/2000系统,ADS1.2集成开发环境
3、实验内容
控制开发平台的蜂鸣器报警。
4、原理图:
5、源代码:
/****************************************************************************
*文件名:
main.c
*功能:
蜂鸣器控制。
对蜂鸣器B1进行控制,采用软件延时方法。
*使用I/O口直接控制,采用灌电流方式。
*说明:
短接蜂鸣器跳线JP7。
断开CF卡跳线JP13、GPIO接口J17。
****************************************************************************/
#include"config.h"
#defineBEEPCON0x00000080//P0.7引脚控制B1,低电平蜂鸣
/****************************************************************************
*名称:
DelayNS()
*功能:
长软件延时。
*入口参数:
dly延时参数,值越大,延时越久
*出口参数:
无
****************************************************************************/
voidDelayNS(uint32dly)
{uint32i;
for(;dly>0;dly--)
{
for(i=0;i<5000;i++);
}
}
/****************************************************************************
*名称:
main()
*功能:
控制蜂鸣器蜂鸣。
****************************************************************************/
intmain(void)
{
PINSEL0=0x00000000;//设置管脚连接GPIO
IO0DIR=BEEPCON;//设置I/O为输入输出模式
//设置P0.7为输出
while
(1)
{
IO0SET=BEEPCON;//BEEPCON=1
DelayNS(15);
IO0CLR=BEEPCON;//BEEPCON=0
DelayNS(15);
}
return(0);
}
/******************************************************************************
实验七:
GPIO输出控制实验2
1、实验目的
熟悉ARM的GPIO控制
2、实验设备
硬件:
PC机 一台
MAGICARM2200-S教学实验开发平台一套
软件:
Windows98/XP/2000系统,ADS1.2集成开发环境
3、实验内容
控制LED显示
4、原理图
5、源代码:
/****************************************************************************
*文件名:
main.c
*功能:
LED显示控制。
*通过GPIO直接控制8个LED产生流水灯效果
*说明:
短接LED跳线JP5。
*这个警告可忽略,C2892E:
signedconstantoverflow
****************************************************************************/
#include"config.h"
#defineLED11<<16//P1.16
#defineLED21<<17//P1.17
#defineLED31<<18//P1.18
#defineLED41<<19//P1.19
#defineLED51<<20//P1.20
#defineLED61<<21//P1.21
#defineLED71<<22//P1.22
#defineLED81<<23//P1.23
#defineLEDCON0x00ff0000
constuint32DISP_TAB[8]={0xff01ffff,0xff02ffff,0xff04ffff,0xff08ffff,
0xff10ffff,0xff20ffff,0xff40ffff,0xff80ffff};
/****************************************************************************
*名称:
DelayNS()
*功能:
长软件延时
*入口参数:
dly延时参数,值越大,延时越久
*出口参数:
无
****************************************************************************/
voidDelayNS(uint32dly)
{uint32i;
for(;dly>0;dly--)
{
for(i=0;i<5000;i++);
}
}
/****************************************************************************
*名称:
main()
*功能:
根据表DISP_TAB来控制LED显示。
****************************************************************************/
intmain(void)
{uint8i;
PINSEL1=0x00000000;//端口配置为GPIO
IO1DIR=LEDCON;//配置LED控制I/O方向为输出
while
(1)
{
for(i=0;i<8;i++)
{
IO1CLR=DISP_