嵌入式系统实验与课程设计指导书.docx

上传人:b****7 文档编号:23834265 上传时间:2023-05-21 格式:DOCX 页数:117 大小:552.50KB
下载 相关 举报
嵌入式系统实验与课程设计指导书.docx_第1页
第1页 / 共117页
嵌入式系统实验与课程设计指导书.docx_第2页
第2页 / 共117页
嵌入式系统实验与课程设计指导书.docx_第3页
第3页 / 共117页
嵌入式系统实验与课程设计指导书.docx_第4页
第4页 / 共117页
嵌入式系统实验与课程设计指导书.docx_第5页
第5页 / 共117页
点击查看更多>>
下载资源
资源描述

嵌入式系统实验与课程设计指导书.docx

《嵌入式系统实验与课程设计指导书.docx》由会员分享,可在线阅读,更多相关《嵌入式系统实验与课程设计指导书.docx(117页珍藏版)》请在冰豆网上搜索。

嵌入式系统实验与课程设计指导书.docx

嵌入式系统实验与课程设计指导书

第一部分实验课程

第一节实验

实验一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_

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机硬件及网络

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1