嵌入式系统实验.docx

上传人:b****3 文档编号:12717582 上传时间:2023-04-21 格式:DOCX 页数:59 大小:636KB
下载 相关 举报
嵌入式系统实验.docx_第1页
第1页 / 共59页
嵌入式系统实验.docx_第2页
第2页 / 共59页
嵌入式系统实验.docx_第3页
第3页 / 共59页
嵌入式系统实验.docx_第4页
第4页 / 共59页
嵌入式系统实验.docx_第5页
第5页 / 共59页
点击查看更多>>
下载资源
资源描述

嵌入式系统实验.docx

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

嵌入式系统实验.docx

嵌入式系统实验

 

嵌入式系统实验指导书

 

计算机科学与技术学院

实验教学中心

2007-9-1

 

实验一JediView调试环境及软件编程………………………………………3

实验二系统初始化和存储器实验………………………………………………8

实验三键盘和中断实验………………………………………………………12

实验四S3C44B0X定时器实验…………………………………………………19

实验五LCD显示实验…………………………………………………………22

实验六、uclinux文件系统实验……………………………………………………………26

实验一JediView调试环境及软件编程

一、实验目的

1.了解调试软件JediView,掌握在JediView环境中新建工程,及其编译,调试工程的方法。

2.掌握在JediView环境下arm系统中C语言编程及调试方法

3.掌握arm汇编语言编程及调试方法。

二、实验内容

1.学习使用JediView集成开发环境:

新建一个工程arm1_1,设置并编译该工程,通过JEDI仿真器下载已经编译好的文件到实验仪中运行。

观察实验仪上的执行结果。

掌握调试程序方法,为下面调试应用程序打下基础。

2.建立工程arm1_2,编写C语言程序arm1_2.c实现1+2+3+…+N(arm1_2.c写在预习报告上)。

3.建立工程arm1_3,用arm汇编语言编写程序arm1_3.s,实现带参数的子程序调用(用程序跳转表实现),调用参数r0=0,做r1+r2=>r0;r0=1,做r1-r2=>r0(arm1_3.s写在预习报告上)。

三、预备知识

1.关于JediView调试环境基本使用方法。

JediView具备一个标准调试软件的绝大部分功能,主要由以下模块组成:

源程序编辑器(Editor):

用来完成源程序的编辑、修改等任务。

编译器(BuildSystem):

把源程序(包括C,C++,汇编)编译生成机器码和可调试代码。

调试器(Debugger):

对编译成功的源程序进行调试,如走单步,设断点,全速运行等。

项目管理器(ProjectManager):

管理项目设置,包括运程序路径,编译选项等。

2.ARM指令系统,汇编语言编程知识。

3.C语言编程能力。

四、实验设备及工具(包括软件调试工具)

硬件:

Micetek44B0实验系统,PowerProbeJTAG仿真器,PC机Pentumn100以上

软件:

PC机操作系统win98、win2000、winXP,JediView集成开发环境

五、实验步骤

1.学习使用JediView集成开发环境,建立一个工程,添加源程序、编译、下载、调试。

①系统配置:

在桌面点击图标ConfigurationforARM打开窗口如图1所示,其中

Protocol:

选择与JediView连接的仿真器协议类型:

如果调试软件没有与目标板连接,进行软件仿真选择Simulator

通过计算机并口和Powerprobe与目标板连接,选择PowerProbe

通过JDEI以太网口仿真器连接,选择JEDI

CpuCore:

选择CPU内核类型

CpuName:

选择具体CPU型号

Endian:

选择Memory大小模式

Initial_File:

选择CPU初始化文件

Semihosting:

Semihosting功能开关

SWI_Vector_Address:

SWI异常向量地址

Top_Memory:

当使用Semihosting功能时,设置Momeory的上限地址

Cache_Memory:

如果目标CPU为ARM940T/920T,设置仿真器预留Memory空间

Reset_Option:

选择是否采用硬件复位

请参照图1_1所示进行配置。

一旦配置好后,所有在forARM环境下运行的工程都可沿用此配置,无需再重复配置。

图1_1ConfigurationforARM配置图

在桌面建立一个文件夹arm1_1,将:

Init.s,arm1_1.c拷贝到该文件夹中。

双击桌面JediView图标,进入JediView,新建一个工程文件arm1_1,工程内包括两个源文件:

Init.s,arm1_1.c。

设置工程;

编辑源文件,将源文件加入到工程中。

⑥编译工程。

⑦下载。

⑧运行。

观察实验仪上的运行结果。

2.按步骤1的②—⑦建立工程arm1_2,用C语言编程序arm1_2.c,实现1+2+3+…+N。

下载后设置断点,连续或单步执行程序,参见附录1,设置观察点,调试程序。

3.按步骤2建立工程arm1_3,用arm汇编语言编写程序arm1_3.s,实现带参数的子程序调用(用程序跳转表实现),调用参数r0,若r0=0,做32位加法;r0=1,则做32位减法。

参见附录1,设置观察点,调试程序。

六、参考程序

/*************************************************************

arm1_1.c

**************************************************************/

#defineled_Address0x6000000

voidLed_Display(unsignedchardata);

voidMain(void)

{

inti,j;

while

(1)

{

for(i=0x0a;i<=0xf;i++)

{

Led_Display(i);

for(j=0;j<=0x03ffff;j++)

j++;

}

}

}

/********************S3C44B0XEV.BOARDLED**********************

//-ga:

data0b:

data1

//a/_b/fc:

data2d:

data3dp:

data4

//c/_d/edpe:

data5f:

data6g:

data7

******************************************************************/

voidLed_Display(unsignedchardata)

{

unsignedchar*ledbuffer=(unsignedchar*)led_Address;

switch(data){

case0:

*ledbuffer=0x12;

break;

case1:

*ledbuffer=0x9F;

break;

case2:

*ledbuffer=0x31;

break;

case3:

*ledbuffer=0x15;

break;

case4:

*ledbuffer=0x9C;

break;

case5:

*ledbuffer=0x54;

break;

case6:

*ledbuffer=0x50;

break;

case7:

*ledbuffer=0x1F;

break;

case8:

*ledbuffer=0X10;

break;

case9:

*ledbuffer=0x14;

break;

case0xa:

*ledbuffer=0x8;

break;

case0xb:

*ledbuffer=0xC0;

break;

case0xc:

*ledbuffer=0x62;

break;

case0xd:

*ledbuffer=0x81;

break;

case0xe:

*ledbuffer=0x60;

break;

case0xf:

*ledbuffer=0x68;

break;

}

}

附录1调试工具栏

调试工具栏如图1_2所示:

图1_2调试工具栏图

其中命令按钮功能如图1_3所示:

图1_3命令按钮功能图

 

实验二系统初始化和存储器实验

一、实验目的

1.了解arm系统初始化的方法。

2.熟悉ARM处理器存储器空间分配。

3.掌握用arm指令配置存储空间的方法。

4.掌握对存储区访问的方法。

二、实验内容

1.读懂44binit.S系统初始化程序,跟踪执行44binit.s,了解系统复位后初始化过程。

(44binit.s完成的操作内容示意图见附录2图2_1。

2.编写arm汇编语言程序arm2_1.s,实现字长读/写、半字读/写、字节读/写(将arm2_1.s写在预习报告上)。

3.编写arm汇编语言程序arm2_2.s,实现将一块字数据从源数据区复制到目的数据区(将arm2_2.s写在预习报告上)。

4.编写C语言程序arm2_3.c,实现将一块字数据从源数据区复制到目的数据区(将arm2_3.c写在预习报告上)。

三、预备知识

1.ARM处理器存储器空间分配,ARM用寄存器组配置存储空间的方法。

2.ARM指令系统:

存储器读/写指令,基址加偏址寻址,汇编语言编程知识。

3.C语言编程能力。

四、实验设备及工具(包括软件调试工具)

硬件:

Micetek44B0实验系统,PowerProbeJTAG仿真器,PC机Pentumn100以上

软件:

PC机操作系统win98、win2000、winXP,JediView集成开发环境

五、实验步骤

1.了解系统复位后初始化过程。

建立子目录arm2_0,将44binit.s拷贝到该目录(在44binit.s中BLMain指令处加一个标号Main:

);按照JediView调试环境介绍中的步骤,新建工程arm2_0,设置工程参数,添加源文件,包含文件44binit.s,编译,下载,单步跟踪执行,观察每一步执行结果,了解系统复位后初始化过程。

2.建立工程arm2_1,用arm汇编语言实现字长读/写、半字读/写、字节读/写。

在工程arm2_1中添加源文件44binit.s,arm2_1.s,编译、下载、调试。

3.建立工程arm2_2,用arm汇编语言实现将一块字数据,从源数据区复制到目的数据区。

编译下载后调试方法:

①在arm2_2.s入口处设断点,全速执行程序到断点处后,单步执行程序,观察源数据区地址指针、目的数据区地址指针,打开memery窗口找到相应地址观察数据块复制情况.

②若使用了堆栈,观察堆栈指针,找到栈底,观察堆栈变化

4.建立工程arm2_3,用C语言编写程序arm2_3.c,实现将一块字数据,从源数据区复制到目的数据区。

六、参考程序

/********************************************************

arm2_1.s

********************************************************/

.globalMain

//.text

Main:

ldrr2,=0x0c010000//字写:

0x11223344-->[0xc01000---0xc01003]

ldrr3,=0x11223344//r2=0x0c010000

strr3,[r2]

ldrr3,=0x0//字读

ldrr3,[r2],#4

ldrhr3,[r2]//半字读:

[0x0c010004--0xc010005]-->r3

//r2=0x0c010004

ldrr3,=0x5566//半字写0x5566-->[0xc01004,0xc01005]

strhr3,[r2],#2//后变址r2=0xc01006

ldrr3,=0x7788

strhr3,[r2],#-2//半字写0x7788-->[0xc01006,0xc01007]

//r2=0x0c010004

ldrhr3,[r2],#2//半字读:

[0x0c010004--0xc010005]-->r3ldrhr3,[r2],#2//半字读:

[0x0c010006--0xc010007]-->r3

ldrbr3,=0x99

strbr3,[r2],#1//字节写:

0x99-->[0xc01008],r2=0x0c010009

ldrbr3,=0xaa

strbr3,[r2]//字节写:

0xaa-->[0xc01009],r2=0x0c010009

ldrbr3,[r2,#-1]//字节读:

[0x0c010008]-->r3

ldrbr3,[r2]//字节读:

[0x0c010009]-->r3

stop:

nop

bstop

.end

/*******************************************************

arm2_2.s

********************************************************/

.globalMain

.text

.equnum,20//复制字数

Main:

ldrr0,=src//源数据区指针

ldrr1,=dst//目的数据区指针

movr2,#num

Bcopy:

movsr3,r2,lsr#3//以8个字为单位的复制次数

beqCword//不足8个字的数据,以字为单位拷贝

stmfdsp!

{r4-r11}//保护工作寄存器(SVCstack栈底0xc7ffb00,见44binit.s)

Ocopy:

ldmiar0!

{r4-r11}//将源数据区8个字数据==>目的数据区,并更新地址指针(!

stmiar1!

{r4-r11}//

subsr3,r3,#1//块(8个字)复制次数减一

bneOcopy

ldmfdsp!

{r4-r11}//以8个字为一块复制结束,恢复工作寄存器

Cword:

andsr2,r2,#7//取余下的不足8个字的字数(=>r2),为零则结束stop

beqstop

Wcopy:

ldrr3,[r0],#4//否则,每次拷贝一个字数据,直至r2=0

strr3,[r1],#4

subsr2,r2,#1

bneWcopy

stop:

nop

bstop

//.data

src:

.word1,2,3,4,5,6,7,8,9,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x010,0x011,0x012,0x013,0x014

dst:

.word0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

.end

 

七、附录2

initial.s完成的操作内容示意图见图2_1.

图2_1initial.s完成的操作内容示意图

 

实验三键盘和中断实验

一、实验目的

1.了解ARM处理器的中断机制。

2.掌握S3C44B0X中断的编程方法。

3.学习用中断和查询两种方式实现键盘扫描功能。

二、实验内容

1.编写程序arm3_1.c按中断方式扫描实验仪上的4*4键盘,并在实验仪数码管上显示键码。

(预习:

将arm3_1.c写在预习报告上。

结合教材有关S3C44B0X的中断、I/O端口的章节,阅读参考程序keyboard.c中的几个函数,掌握中断和键盘扫描的编程方法。

main()//

keyboard_ISR()//键盘中断服务(键盘扫描/译码)

Port_Init()//对I/O端口初始化

Isr_Init()//IRQ中断初始化

Led_Display(chardata)//数码管显示)

2.编写程序arm3_2.c按查询方式扫描实验仪上的4*4键盘,并在实验仪数码管上显示键码。

(将arm3_2.c写在预习报告上)。

三、预备知识

1.ARM处理器的中断机制。

2.S3C44B0X的I/O控制寄存器、中断控制寄存器。

3.键盘扫描知识。

4.C语言编程能力。

四、实验设备及工具(包括软件调试工具)

硬件:

Micetek44B0实验系统,PowerProbeJTAG仿真器,PC机Pentumn100以上

软件:

PC机操作系统win98、win2000、winXP,JediView集成开发环境

五、实验步骤

1.实现按中断方式扫描实验仪上的4*4键盘,并在实验仪数码管上显示键码。

建立子目录arm3_1,将44binit.s、keyboard.c(或arm3_1.c)复制到该目录下。

建立工程arm3_1,将44init.s、keyboard.c添加到该工程下,编译、下载、运行,运行中,按4*4键盘上的任一键,应在数码管上显示该键码。

2.编写程序arm3_2.c,实现按查询方式扫描实验仪上的4*4键盘,并在实验仪数码管上显示键码。

建立子目录arm3_2,将44init.s、arm3_2.c复制到该目录下。

建立工程arm3_2,将44init.s、arm3_2.c添加到该工程下,编译、下载、运行,运行中,按4*4键盘上的任一键,应在数码管上显示该键码。

六、键盘硬件电路及arm3_1参考程序keyboard.c

1.键盘硬件电路

实验仪的键盘电路由S3C44B0的I/O口和外部中断构成,见图3_1实验仪的键盘电路图,S3C44B0X处理器G口的PG7—PG4四位作输出,F口的PF8—PF5四位作输入,构成4行4列的4*4键盘。

无键按下时,PF8—PF5四列被上拉为高电平,按键按下将会使行、列连成通路。

扫描键盘时,首先向PG7—PG4四行输出“0”,然后从PF8—PF5读入,若读入的4位列值为全“1”,说明无键按下。

当任一键按下时,从PF8—PF5读入的列值将不是全“1”,此时可向PG7—PG4逐行输出“0”,然后从PF8—PF5读入列值,以判别哪一个键被按下。

F口的PF8—PF5位经负或门接至外部中断EXINT0,没有键按下时,PF8—PF5被上拉至高电平;当F口的PF8—PF5任一列有键按下时,将引发EXINT0键盘中断。

图3_1实验仪键盘电路图

 

2.参考程序

/*************************************

keyboard.c

*************************************/

#include

#include"..\inc\option.h"

#include"..\inc\44b.h"

#include"..\inc\44blib.h"

#include"..\inc\def.h"

#include"..\inc\kb.h"

voidIsr_Init(void);

voidHaltUndef(void);

voidHaltSwi(void);

voidHaltPabort(void);

voidHaltDabort(void);

voidDelay(inttime);

//voidPort_Init(void);

voidLed_Display(unsignedchardata);

voidkeyboard_ISR(void);

voidTest_Kb(void);

 

voidmain(void)

{

rSYSCFG=SYSCFG_8KB;//(0x6)speedfaster

Isr_Init();

Port_Init();

pISR_EINT0=(unsigned)keyboard_ISR;

rINTMSK=~(BIT_GLOBAL|BIT_EINT0);

while

(1);

}

 

voidkeyboard_ISR(void)

{

charx,y,xrecord,yrecord,temp;

rI_ISPC=BIT_EINT0;//clearpending_bit

Delay(400);//delay40ms

if((rPDATF&0x1E0)==0x1E0)

{

return0;//nokeyboardpress,return

}

else

{

x=1;

y=1;

xrecord=(~((rPDATF&0x1E0)>>1));

xrecord=xrecord>>4;

while(xrecord!

=0x1)//judgerow

{

x=x+1;

xrecord=xrecord>>1;

if(xrecord==0)

{

rPDATG=0X0F;//no,return

return0;}

}

Delay(200);//delay20ms

rPDATG=0XEF;//inputhigh

while((rPDATF&0x1E0)==0x1E0)

{

rPDATG=rPDATG<<1;

temp=rPDATG;

if((temp&0xf0)==0XF0)//noboardpress,return

{

rPDATG=0X0F;

return0;}

}

Delay(200);//delay10ms

yrecord=~((rPDATG&0xF0)>>4)&0x0F;

while(yrecord!

=0x1)//judgeline

{

y=y+1;

yrecord=yrecord>>1;

if(yrecord==0)

{

rPDATG=0X0F;//noboardpress,return

return0;}

}

Led_Display(x+(y-1)*4-1);

Delay(1200);//delay40ms

rPDATG=0X0F;

}

}

voidIsr_Init(void)

{

U32i;

pISR_UNDEF=(unsigned)HaltUndef;

pISR_SWI=(unsigned)HaltSwi;

pISR_PABO

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

当前位置:首页 > 初中教育 > 数学

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

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