优质文档武汉大学计算机学院 嵌入式实验报告word范文模板 25页Word文件下载.docx
《优质文档武汉大学计算机学院 嵌入式实验报告word范文模板 25页Word文件下载.docx》由会员分享,可在线阅读,更多相关《优质文档武汉大学计算机学院 嵌入式实验报告word范文模板 25页Word文件下载.docx(25页珍藏版)》请在冰点文库上搜索。
学习RAM6264的扩展
往RAM中写入一串数据,然后读出,进行比较
(1)根据流程图设计程序。
(2)RAM_CS插孔连到译码输出P2.7插孔,P1.0连接到L0。
(3)调试运行程序RAM.ASM。
对62256进行读写。
若L1灯闪动,表示62256RAM读写正常。
一直亮说明扩
展数据存储器有损坏。
(4)读写正确数码管显示“6264—0”。
若读写错误,数码管显示“6264—E”。
程序框图:
连线图案:
程序解读:
ORG0000H
AJMPSTART;
;
无条件跳转到START
ORG0030H;
;
START的首地址
START:
MOVSP,#60H;
设置堆栈段,是个过程化语句,因为堆栈的前端一般有其他内容,
;
此程序用不到。
MOVDPTR,#0000H;
DPTR是数据指针寄存器。
扩展数据存储器62256的地址,
从0000H开始测试,共32K,但下面语句只测试了前4K
MOVR6,#0FH
MOVA,#55H;
测试字,本实验只用了55H
/////////////////
RAM1:
MOVR7,#0FFH
RAM2:
MOVX@DPTR,A;
MOVX读写数据存储器,把55H写到0000H
CLRP1.0;
清零,即为暗状态
INCDPTR;
DJNZR7,RAM2;
R7减1,如不为零则跳转,内循环!
!
256DJNZR6,RAM1;
R6减1,如不为零则跳转,外循环!
16
共测试4K
从新给地址0000H,下步读
MOVR6,#0FH;
写多少,读多少
////////////////////////
RAM3:
RAM4:
MOVXA,@DPTR
CJNEA,#55H,RAM6;
比较前两个操作数,不相等则跳转
SETBP1.0;
亮
INCDPTR
DJNZR7,RAM4
DJNZR6,RAM3
////////////////////
RAM5:
CLRP1.0
CALLDELAY;
延迟,实现闪烁!
SETBP1.0
CALLDELAY
SJMPRAM5;
是个死循环
DELAY:
MOVR5,#0FFH
DELAY1:
MOVR4,#0FFH
DJNZR4,$
DJNZR5,DELAY1
RET
RAM6:
SETBP1.0;
1.0口常亮,相当于设置了一个错态!
SJMPRAM6;
短转移,无限循环!
END
思考与改进:
改进程序清单:
OUTBITequ0e101h
CLK164equ0e102h;
段控制口(接164时钟位)
DAT164equ0e102h;
段控制口(接164数据位)
LEDBufequ40h
INequ0e103h
movsp,#60h
MOVDPTR,#0e100H;
8155初始化
MOVA,#03H
MOVX@DPTR,A
MOVDPTR,#8000H;
往6264的8000H-9FFFH单元送入#55HMOVA,#55H
DD:
MOVX@DPTR,A
movr0,dph
CJNer0,#0A0H,DD
MOVDPTR,#8000h
DD1:
MOVXA,@DPTR;
读出数据进行比较CJNEA,#55H,ERR
MOVR0,DPH
CJNER0,#0A0H,DD1
mov40h,#06h;
显示缓冲器初始化mov41h,#05h
mov42h,#06h
mov43h,#04h
mov44h,#10h
mov45h,#00h
START1:
LCALLDISPLAY;
正确的显示“6464-0”SJMPSTART1
ERR:
mov40h,#06h
mov41h,#05h
mov45h,#0Eh;
不正确的显示“6264-E。
”START2:
LCALLDISPLAY
SJMPSTART2
DISPLAY:
setb0d3h
movr0,#LEDBuf
movr1,#6;
共6个八段管movr2,#00100000b;
从左边开始显示Loop:
movdptr,#OUTBIT
mova,#00h
movx@dptr,a;
关所有八段管
mova,@r0
movdptr,#LEDmap
movca,@a+dptr
movB,#8;
送164
DLP:
rlca
movr3,a
movacc.0,c
anla,#0fdh
movdptr,#DAT164
movx@dptr,a
movdptr,#CLK164
orla,#02h
anla,#0fDh
mova,r3
djnzB,DLP
mova,r2
显示一位八段管
movr6,#01
callDelay
mova,r2;
显示下一位
rRa
movr2,a
incr0
djnzr1,Loop
mova,#0
clr0d3h
ret
LEDMAP:
八段管显示码
db3fh,06h,5bh,4fh,66h,6dh,7dh,07h
db7fh,6fh,77h,7ch,39h,5eh,79h,71h
DB40H
Delay:
movr7,#00H;
延时子程序
DelayLoop:
djnzr7,DelayLoop
djnzr6,DelayLoop
end
实验三嵌入式Linux开发环境熟悉实验
熟悉Linux开发环境,学会基于S3C2410的Linux开发环境的配置和使用。
使用Linux的
armv4l-unknown-linux-gcc编译,使用基于NFS方式的下载调试,了解嵌入式开发的基本过程。
本次实验使用RedhatLinux9.0操作系统环境,安装ARM-Linux的开发库及编译器。
创建一个新目录,并
在其中编写hello.c和Makefile文件。
学习在Linux下的编程和编译过程,以及ARM开发板的使用和开发环境的设置。
下载已经编译好的文件到目标开发板上运行。
硬件:
UP-NETARM2410-S嵌入式实验平台、PC机Pentium500以上,硬盘10G以上。
软件:
PC机操作系统REDHATLINUX9.0+MINICOM+ARM-LINUX开发环境
1、建立工作目录
2、编写程序源代码
在Linux下的文本编辑器有许多,常用的是vim和Xwindow界面下的gedit等,我们在开发过程中推荐使用vim,用户需要学习vim的操作方法,请参考相关书籍中的关于vim的操作指南。
Kdevelope、anjuta软件的界面与vc6.0类似,使用它们对于熟悉windows环境下开发的用户更容易上手。
实际的hello.c源代码较简单,如下:
我们可以是用下面的命令来编写hello.c的源代码,进入hello目录使用vi命令来编辑代码:
按“i”或者“a”进入编辑模式,将上面的代码录入进去,完成后按Esc键进入命令状态,再用命令“:
wq”保存并退出。
这样我们便在当前目录下建立了一个名为hello.c的文件。
3、编写Makefile
要使上面的hello.c程序能够运行,我们必须要编写一个Makefile文件,Makefile文件定义了一系列的规则,它指明了哪些文件需要编译,哪些文件需要先编译,哪些文件需要重新编译等等更为复杂的命令。
使用它带来的好处就是自动编译,你只需要敲一个“make”命令整个工程就可以实现自动编译,当然我们本次实验只有一个文件,它还不能体现出使用Makefile的优越性,但当工程比较大文件比较多时,不使用Makefile几乎是不可能的。
下面我们介绍本次实验用到的Makefile文件。
下面我们来简单介绍这个Makefile文件的几个主要部分:
?
CC指明编译器
EXEC表示编译后生成的执行文件名称OBJS目标文件列表CFLAGS编译参数LDFLAGS连接参数all:
编译主入口
与上面编写hello.c的过程类似,用vi来创建一个Makefile文件并将代码录入其中
4、编译应用程序
在上面的步骤完成后,我们就可以在hello目录下运行“make”来编译我们的程序了。
如果进行了修改,重新编译则运行:
5、下载调试
在宿主PC计算机上启动NFS服务,并设置好共享的目录,具体配置请参照前面第一章第四节中关于嵌入式Linux环境开发环境的建立。
在建立好NFS共享目录以后,我们就可以进入MINICOM中建立开发板与宿主PC机之间的通讯了。
如果不想使用我们提供的源码的话,可以再建立一个NFS共享文件夹。
如/root/share,我们把我们自己编译生成的可执行文件复制到该文件夹下,并通过MINICOM挂载到开发板上。
再进入/host目录运行刚刚编译好的hello程序,查看运行结果。
编写了一个最基本简单的hello.c程序来验证实验是否成功,主要是进行了交叉编译,生成了可在目标试验台上运行的目标文件,然后成功建立了宿主机与目标实验台仿真终端连接,然后我们成功为目标试验台建立了linux系统终端窗口,然后通过linux命令建立宿主机与目标试验台的共享连接,为了最终的下载和运行最终的可执行文件。
运行文件后,屏幕正确输出程序运行结果:
hello,world!
本次实验主要是熟悉嵌入式linux开发环境的使用,编写了一个最基本简单的hello.c程序来验证实验是否成功,主要是进行了交叉编译,生成了可在目标试验台上运行的目标文件,然后成功建立了宿主机与目标实验台仿真终端连接,然后我们成功为目标试验台建立了linux系统终端窗口,然后通过linux命令建立宿主机与目标试验台的共享连接,为了最终的下载和运行最终的可执行文件。
这样,我们就完成了本次实验,熟练掌握了嵌入式实验开发的基本步骤,为以后的实验打下良好基础,我们可以在此基础上完成更多实验,编写更加复杂的程序,从而使的我们的实验顺利进行。
实验四串口通信程序设计实验
了解在linux环境下串行程序设计的基本方法。
掌握终端的主要属性及设置方法,熟悉终端I/O函数的使用。
学习使用多线程来完成串口的收发处理。
读懂程序源代码,学习终端I/O函数的使用方法,学习将多线程编程应用到串口的接收和发送程序设计中。
UP-NETARM2410-S嵌入式实验平台、PC机Pentium500以上,硬盘10G以上
1、阅读理解源码
进入exp\basic\03_tty目录,使用vi编辑器或其他编辑器阅读理解源代码。
2、编译应用程序
运行make产生term可执行文件
3、下载调试
切换到minicom终端窗口,使用NFSmount开发主机的/arm2410s到/host目录。
进入exp\basic\03_tty目录,运行term,观察运行结果的正确性。
由于内核已经将串口1作为终端控制台,所以可以看到term发出的数据,却无法看到开发主机发来的数据,可以使用另外一台主机连接串口2进行收发测试。
实验现象:
“ABCDEF.......abcdef.......12345.......”
Linux操作系统从一开始就对串行口提供了很好的支持,为进行串行通讯提供了大量的函数,我们的实验主要是为掌握在Linux中进行串行通讯编程的基本方法。
本实验的程序流程图如下:
图2.3.3串口通讯实验流程图
设置好串口之后,读写串口就很容易了,把串口当作文件读写就可以了。
实验中通过send函数发送数据,函数定义如下:
void*send(void*data)
{
intc='
0'
printf("
senddata\n"
);
while(STOP==FALSE)
c++;
c%=255;
write(fd,&
c,1);
/*stdout*/
usleep(100000);
}
returnNULL;
/*waitforchildtodieoritwillbecomeazombie*/
对应的通过receive函数接受数据,函数定义如下:
void*receive(void*data)
intc;
readmodem\n"
read(fd,&
/*comport*/
write(1,&
exitfromreadingmodem\n"
键盘线程接受键盘输入的数据,发送给send线程,作为其发送数据,通过改变键盘输入数据,可以得到不同结果。
实验五A/D接口转换编程实验
了解在linux环境下对S3C2410芯片的8通道10位A/D的操作与控制。
学习A/D接口原理,了解实现A/D系统对于系统的软件和硬件要求。
阅读ARM芯片文档,掌握ARM的A/D相关寄存器的功能,熟悉ARM系统硬件的A/D相关接口。
利用外部模拟信号编程实现ARM循环采集全部前4路通道,并且在超级终端上显示。
进入/arm2410s/exp/basic/04_ad目录,使用vi编辑器或其他编辑器阅读理解源代码。
换到minicom终端窗口,使用NFSmount开发主机的/arm2410s到/host目录。
我们可以通过调节开发板上的三个黄色的电位器,来查看a0、a1、a2的变化。
备注:
驱动程序的加载
在实验台的终端提示符【mnt/yaffs】下进入ad目录
【mnt/yaffs】cdad
【mnt/yaffs/ad】insmods3c2410-adc.o
s3c2410-adcinitialized
出现上述提示即加载成功。
初始值为:
a0=0.0032a1=3.2968a2=3.2968;
通过调节电位器,a0、a1、a2的值相应的发生改变。
设定第1个采用次数为100次,统计一个值n1
再设定第2个采用次数为100次,统计一个值n2
再设定第100个采用次数为100次,统计一个值n100
求统计平均值N=(n1+n2+n3+?
+n100)/100。
以列方式显示结果,按回车键开始采样,在按回车键结束。
采样100个之后,a0、a1、a2值趋于相同。
最后平均值得到结果相同。
实验六D/A接口转换编程实验
(1)
(2)
(3)
(4)
学习D/A转换原理掌握MAX504D/A转换芯片的使用方法掌握不带有D/A的CPU扩展D/A功能的主要方法了解D/A驱动程序加入内核的方法
学习D/A接口原理,了解实现D/A系统对于系统的软件和硬件要求。
阅读MAX504芯片文档,掌握
其使用方法。
进入/arm2410s/exp/basic/05_da目录,使用vi编辑器或其他编辑器阅读理解源代码
运行make产生da可执行文件da_main
切换到minicom终端窗口,使用NFSmount开发主机的/arm2410s到/host目录,然后进入
进入/host/exp/basic/05_da目录,运行./da_main,观察运行结果的正确性。
在输入./da_main后会出现下面的提示信息。
这是由于我们没有指定参数造成的,它的格式为./da_main[da的id号][数字],我们可以通过选择0或1来决定输出到开发板上的哪个D/A接口;
同时还需要在0.0~4.096V之间来选择一个输出电压。
下面的例子是用了开发板上的DA0并且输出1V的电压,我们可以使用万用表对其进行测量。
可以通过选择0或1来决定输出到开发板上的哪个D/A接口;
改进:
将D/A接口转换与A/D接口转换结合在一起,使用第一个按钮输入。
具体程序代码da_main.c如下:
#include<
stdio.h>
fcntl.h>
string.h>
unistd.h>
sys/types.h>
sys/ipc.h>
pthread.h>
sys/ioctl.h>
#include"
s3c2410-adc.h"
#defineADC_DEV"
/dev/adc/0raw"
#defineDA0_IOCTRL_WRITE0x10
#defineDA1_IOCTRL_WRITE0x11
#defineDA_IOCTRL_CLR0x12
#defineMax504_FULL4.096f
char*DA_DEV="
/dev/exio/0raw"
staticintda_fd=-1;
staticintadc_fd=-1;
staticintinit_ADdevice(void)
if((adc_fd=open(ADC_DEV,O_RDWR))<
0){
Erroropening%sadcdevice\n"
ADC_DEV);
return-1;
staticintGetADresult(intchannel)
intPRESCALE=0XFF;
intdata=ADC_WRITE(channel,PRESCALE);
write(adc_fd,&
data,sizeof(data));
read(adc_fd,&
returndata;
staticvoid*comMonitor(void*data)
getchar();
stop=1;
Floatad()
floatd;
pthread_tth_com;
void*retval;
//sets3c44b0ADregisterandstartAD
if(init_ADdevice()<
0)
/*Createthethreads*/
pthread_create(&
th_com,NULL,comMonitor,0);
d=((float)GetADresult(0)*3.3)/1024.0;
usleep
(1);
/*Waituntilproducerandconsumerfinish.*/
pthread_join(th_com,&
retval);
returnd;
intmain(intargc,char**argv)
floatv;
unsignedintvalue;
while
(1){
v=ad();
if(v<
0||v>
Max504_FULL){
DAoutmustbetween:
0to%