北邮实用信号源实验报告

实用信号源的设计和制作

学院:

专业:

班级:

姓名:

学号:

光信息科学与技术 [键入文字] 目录

一、 实验要求 ............................................................................. 2

1. 任务: ................................................................................ 2

2. 技术指标: ......................................................................... 2

3. 要求: ................................................................................ 3

4. 主要参考元件: ................................................................. 3

二、 设计方案 ............................................................................. 4

1. 设计思路 ............................................................................. 4

2. 参数计算 ............................................................................. 5

1)

2)

3)

三、 信号发生电路 ................................................................ 5 放大电路 ....................................................................... 6 计数显示电路 ................................................................ 7 电路测试与遇到的问题 ..................................................... 8

1. 信号频率及失真的调节 ..................................................... 8

2. 功率放大电路 ..................................................................... 9

3. 计数显示电路 ..................................................................... 9

4. 连接全部电路 ................................................................... 10

四、

五、

试验总结 ........................................................................... 10 总体电路图 ....................................................................... 13

1

光信息科学与技术 [键入文字]

一、 实验要求

1. 任务:

在给定15V电源电压条件下, 设计并制作一个信号源。

2. 技术指标:

【要求1】:

(1) 正弦波信号源(20HZ~10KHZ)

a、信号频率:20HZ~10KHZ连续可调;b、频率稳定度:优于10?4c、非线性失真系数:?3?;

(2) 脉冲波信号源(20HZ~10KHZ)

a、信号频率:20HZ~10KHZ连续可调, b、上升和下降时间:?1us; c、平顶斜降:? 5?。

d、脉冲占空比:2?到98?连续可调。

(3) 上述两个信号源公共要求

a、频率可预置, b、在负载为600?时,输出幅度为3V, c、完成5位频率的数字显示

d、在信号频率:20HZ~10KHZ连续可调时,占空比不变,波形对称不失真。

【要求2】

(1)

(2) 正弦波和脉冲波频率可连续调整。 正弦波和脉冲波幅度可调整,调整范围可分为3档,

2

光信息科学与技术 [键入文字] (100mV~1V, 1V~2V, 2V~3V),在负载为600?时。(峰-峰值6V)

(3) 降低正弦波非线性失真系数。

3. 要求:

设计与总结报告:有方案设计与论证,理论分析与计算,完整的电路原理图,测试方法与数据,结果分析。要有特色与创新。

4. 主要参考元件:

ICL8038, CD4026, NE556或NE555, CD4001或CD4004,LF356 或LM318,等

注:1不采用单片机控制, 2请不要选用ICM7216芯片

3

光信息科学与技术 [键入文字]

二、 设计方案

1. 设计思路

按照将复杂问题拆分成简单问题的思路,我将电路分为了三个部分:信号发生电路、功率放大电路、计数显示电路。将电路分为三个模块可以让思路清晰,并且在实际搭建电路的时候,可以逐级实现,方便电路错误的查找。

如图所示,信号发生电路应用8038芯片,该芯片具有生成方波三角波和正弦波的功能,并且波形的频率及占空比都可调;功率放大电路采用通用的LM318芯片;计数显示电路采用CD4026芯片CD4001芯片和NE555芯片,其中4026实现对输入波形的技术以及对数码管控制两种功能,CD4001为多个或非门,起滤波的作用,NE555实现周期震荡,为4026提供使能信号。

北邮实用信号源实验报告

4

光信息科学与技术 [键入文字]

2. 参数计算

1) 信号发生电路

该电路可以产生稳定的频率控制,但如果想同时实现占空比的调节,需要在5脚和4脚上使用较大的可变电阻,而固定电阻的值作为限流保护可适可而止就好。从理论上看本方案除了调节占空比的时候频率会受到一定的扰动,而且正弦波也会在调节方波占空比时发生失真这两点,其他方面都没有问题。从电路的简洁上看,是可行的。

占空比调节:

占空比=[(R5+R2左)-(R4+R2右)]/2(R5+R2左)]

正弦波失真调节:

调节R1与R12之间的100k滑动变阻器,可以改善失真。

频率调节:

由手册公式

北邮实用信号源实验报告

5

光信息科学与技术 [键入文字]

可知大体的电容选取:

f=20Hz 对应474

f=200Hz 对应473

f=2kHz 对应472

f=10kHz 对应471(由于实验过程中未能找到471,可用681亦能很方便地调节到10kHZ)

2) 放大电路

但通过实验测试,由于上述所提到的在占空比调节过程中5脚和4脚分配电流发生变化,使输出频率受到影响,最终在某些频段占空比并不能实现理想调节,满足不了2%到98%连续可调的要求,所以将模块功能分开设计:ICL8038负责占空比为50%的波形产生,力求使失真达到最小;而将方波占空比的调节交给比较器LM318完成。

其中104和105电容作用为为防止自激。

北邮实用信号源实验报告

北邮实用信号源实验报告

6

光信息科学与技术 [键入文字]

3) 计数显示电路

NE555的3脚输出占空比,即跳动的高低电平控制计数。

根据手册提供的公式:

T1=0.683*(RA+RB)*CT2=0.683*RB*C

F=1.443/((RA+2RB)*C)

由6、7脚间和7、8脚间电阻阻值决定,由于后者阻值相对2M电位器可以忽略,T1=T2=0.683*R*C,F=1.443/(2*R*C),经计算可得知当F大致取0.5Hz时,C取值为约为1uF。由于是使用电位器,阻值可调所以电容取1uf数量级的电容都可以的。

在实现计数和清零的功能后,手动调整电位器,使其输出的频率值能和示波器上的频率值对应,而且一段时间内稳定不变。即让其在1s计数。

北邮实用信号源实验报告

7

光信息科学与技术 [键入文字]

4026的2管脚为时钟使能信号,控制技术的开始和暂停;3管脚为显示使能端口,控制数码管的开关;15管脚为技术复位端口,控制技术清零。

数码管的全动电压为5V。应该再在共阴极接一小电阻,以防止数码管电流过大。

三、 电路测试与遇到的问题

1. 信号频率及失真的调节

当搭建好第一级以后需要测试信号的频率及失真等性能。通过调节电容331、742、743三个档位以及8脚的电位器,可以实现频率从10Hz到20kHz的变化。通过调节1脚和12

北邮实用信号源实验报告

脚之间的电位器可以实现

8

光信息科学与技术 [键入文字] 对失真的改善。

如果不能输出波形,应迅速关闭电源。在电路没有错误的情况下,首先检查电位器的偏置,一般调节到中点比较合适。

此时应注意,为防止电路烧坏,应供给5V电源。8038为一款已经停产的芯片,目前市面上比较的珍贵,请学弟学妹们多加爱惜。

2. 功率放大电路

当搭建好放大电路以后,请不要直接链接信号发生电路,以防止烧坏前级电路。打开信号发生器,测量方波的幅值。然后接入放大级的输入端,测量输出幅值。可以通过改变10K电位器调节输出幅值在100mV~3V之间变化。

之后连接前级电路,对信号的占空比,失真等进行进一步的调节。 如果输出信号有自己的现象,可以尝试在高低电源处分别加1u和0.1u的电容。

3. 计数显示电路

这个部分是本次课程设计的难点。

搭建好电路以后,还是先用信号发生源进行实验。将信号发声源接入4026的1管脚。观察数码管是否实现开灯关灯的功能,并且在数码管开时,显示的数值是否为信号发生源的频率。

如果数码管显示全0,可能是由于4026芯片1管脚输入时钟的幅度太小,可以适当调整信号发生器输出幅值并观察现象;如果不停计数,请检查4026芯片15管脚以及555芯片的3管脚链接是否正确,

9

光信息科学与技术 [键入文字] 如果仍然不能排除,请更换所有的元器件,可能是由于人品不好的缘故;数码管显示的频率很稳定,但是与信号发生器频率不符,很高兴的告诉你,你的电路已经没有问题了,现在调整555芯片的电位器,直到目测数码管开关的频率为2Hz左右(即一秒开一秒关),然后进行微调即可。

4. 连接全部电路

如果以上各个部分的信号都准确无误,现在可以链接全部电路了。注意信号发生电路的电源现在应加到正负15V,放大电路的电源仍为15V不变,计数显示电路供电为5V。

此时如果不能出现预期效果,请立即切断电源。并把电路重新拆分为三个部分分别进行测试,如有问题调试方法见上。如各个分电路没有问题,请检查三部分电路之间的连接是否健康。

如果此时顺利实现所有的功能,请迅速通知老师验收,切勿等到第二天。因为在面包板上搭建的模拟电路十分不稳定,有时只是导线的松动,也会让电路失效,甚至烧毁芯片。

祝好运!

四、 试验总结

在本次实验开始前,我一直担心自己没有电路设计的经验,可能这些题目难度比较的大,最终不能完成。本次实验安排了三个星期,我同大部分同学都用十个工作日就基本已经完成了所有的任务。事实

10

光信息科学与技术 [键入文字] 证明只要足够努力,是可以高效高质的完成任务的。

在初期选题的时候,出于对物联网的兴趣,我选的可以应用在物联网中端的无限收发装置。经过了三天的网络检索,我已经了解了装置的设计思路,并且学习了几幅前人设计的电路图,对电路各个部分的功能已经十分了解。但是在配料的时候,发现需要用到的几个主要芯片实验室都没有,一些同学去中发采购元件时也反应很难找到这些元件。除此之外,电路中还用到极其罕见的电感。要知道,在电路设计中,电感远远没有电阻电容那样常用,实验室也没有配备。并且由于没有对电路进行仿真,所以对于元器件的可替换性并不了解。最终,不得不更换选题。

信号发生器的电路并不难,其中的重点在于555芯片和4026芯片的链接,以及8038芯片各个管脚的作用。只要明确这些知识,无论是在设计电路,还是检查电路方面,都会势如破竹。

在调测电路时,最应该注意一下几点:

电路图的原理图应该准确无误,如果是自己设计的电路图,请对其认真仿真,如果用前人留下的电路图,一定要保证电路的正确性。并且在加电的时候,应注意电源正负极,接地级的连接是否正确。

电路发生错误时,首先检查电路链接是否正确,其次应检查电位器的偏置。如果以上步骤都没有问题,可以借用已经成功同学的板子,测试主要芯片是否烧毁。

切记磨刀不误砍柴工,所有快速完成电路的同学都在前期花费了大量的精力研究电路图原理。只有对原理透彻理解,才能在发生错误时准确的找到解决方法。

11

光信息科学与技术 [键入文字]

通过两周的实验,我成功的完成了自己的电路。在电路设计方面积累了一定的经验,掌握了电路设计的流程,注意事项。并且在电路调测方面也有极大的经验积累。身为一个即将成为理学学士的学生,这些工程方面的宝贵经验,必将在我以后的学习工作中给我极大的帮助。

12

光信息科学与技术 [键入文字]

五、 总体电路图

13

光信息科学与技术 [键入文字]

14

北邮实用信号源实验报告

 

第二篇:北邮嵌入式实验报告 学长

嵌入式系统开发实验报告

班 级:

姓 名:

班内序号:

学 号:

日 期:

目录

一、 实验目的 .............................................................................................. 1 二、 实验设备 .............................................................................................. 1 三、 基础实验(实验一~实验七) ............................................................ 1

1. 实验五 .................................................................................................. 1 2. 实验六 .................................................................................................. 1 3. 实验七 .................................................................................................. 1 四、 驱动程序 .............................................................................................. 5

1. 设备驱动程序的概念 .......................................................................... 5 2. 驱动程序结构 ...................................................................................... 6 3. 设备注册和初始化 .............................................................................. 7 4. 设备驱动程序的开发过程 .................................................................. 8 五、 基本接口实验 ...................................................................................... 8

1. 实验十二简单设备驱动程序 .............................................................. 9 2. 实验十三 CPU GPIO驱动程序设计 ................................................... 9 3. 实验十四中断实验 ........................................................................... 10 4. 实验十五数码管显示实验 ................................................................ 11 5. 实验十六 LED点阵驱动程序设计 ................................................... 12 6. 实验十七 AD驱动实验 .................................................................... 13 7. 实验十八 DA驱动实验 .................................................................... 13 8. 实验十九键盘驱动实验 .................................................................... 14 9. 实验二十 LCD控制实验 ................................................................... 17 10. 实验二十一触摸屏数据采集与控制实验 ...................................... 18 11. 实验二十二 VGA显示实验 ............................................................ 19 12. 实验二十三 Web服务器实验 ....................................................... 19 13. 实验二十四网络文件传输实验 ...................................................... 19 14. 实验二十五多线程应用实验 .......................................................... 19 六、 实验中遇到的问题及解决方法 ........................................................ 19 七、 实验总结及心得 ................................................................................ 20

一、 实验目的

通过实验熟悉Linux环境,并掌握一些基本接口驱动的写法和用C语言编写简单的实验程序。学习LINUX开发环境的搭建,通讯配置等。并熟练掌握LINUX驱动程序的编写及开发流程。对嵌入式系统有进一步的了解。

二、 实验设备

1.一套PXA270EP嵌入式实验箱

2.安装Redhat9的宿主PC机,并且配置好ARM Linux的开发环境

三、 基础实验(实验一~实验七)

实验一~七为基础实验,目的是为后续实验搭建好软、硬件环境,配置好相关的协议、服务,并通过编写最简单的HelloWorld程序进行测试。由于后面的实验都要依靠前面实验的配置,故本段只着重叙述实验七的具体实现。

1. 实验五

实验五为宿主PC机配置了TFTP服务。TFTP(Trivial File Transfer Protocol)是简单文件传输协议,由于特定开发环境的制约,这一服务是必须的。在配置完成后,每次重启宿主PC机时,都须先输入命令:service xinetd restart,以启动TFTP服务。

2. 实验六

实验六为宿主PC机配置了NFS服务。NFS(Network File System)指网络文件系统,它实现了文件在不同的系统间使用。当我们想用远端档案时,只需调用“mount”就可以远端系统挂接在自己的档案系统之下。每次重启宿主PC机时,都须先输入命令:service nfs restart,以启动nfs服务。

3. 实验七

实验七通过用c语言编写的简单程序HelloWorld,测试前面几个实验是否成功配置好环境,从超级终端可以看到HelloWorld程序的运行结果。

实验步骤如下:

1

1) 硬件连接:

连接宿主 PC 机和一台 PXA270-RP目标板。

2) 打开宿主PC 机电源,进入 Linux操作系统。

3) 启动RedHat 9.0 的图形界面,如下图,若您是以 root 身份登陆在文本模式下,则输入命令startx启动图形界面。进入RedHat 9.0 图形界面后,打开一个终端窗(Terminal)。

4) 输入minicom然后回车,minicim设置为115200 8NI无流控。

5) 打开PXA270_RP目标板电源,按目标板上的BOOT键,在minicom中应该会看到如下图:

6) 在minicom终端窗口中,如图,输入下列四条命令

root

ifconfig eth 192.168.0.50 up

mount -o nolock 192.168.0.100:/ /mnt

cd /mnt

此时,先将该窗口最小化,在后面的第 10 操作步骤中还将会回到该窗口中进行操作。

北邮嵌入式实验报告学长

2

7) 宿主机上打开一个终端窗口(Terminal),点击【红帽/System Tools/Terminal】启动终端窗口,输入下列 4 条命令:

① cd /home

②mkdir HW

③ cd HW

④ vi HelloWorld.c /*请您输入程序 7.1 程序清单*/

此时会显示一个空白的屏幕,这条命令的含义是,使用 Vi 编辑器,对一个名叫HelloWorld.c的文件进行编辑,我们看到的空白窗口是对文件进行编辑的窗口,如下图。就像在 Windows系统下面使用写字板等一样道理。

在 vi 里面先单击键盘 A 键,然后左下角会变成—INSER。输入程序的时候和其他编辑器是一样的,如下图。

北邮嵌入式实验报告学长

北邮嵌入式实验报告学长

北邮嵌入式实验报告学长

3

当输入程序完毕后,单击键盘 Esc 键,然后按“:”(冒号)此时左下角会出现冒号然后输入“wq”最后按“Enter”确认存盘退出 vi 编辑器,如下图。

8) 在上面同一个终端窗口中,输入下列 2 条命令交叉编译HelloWorld.c源程序,并查看生成的.o 目标文件,如图 7-10,图7-11:

① arm-linux-gcc–oHelloWorldHelloWorld.c

②ls

等到再次出现提示符,代表程序已经正确编译。如果此步出现错误信息,请查看错误信息,并且重新编辑原来的 C文件,修改错误。直到正确编译。

9) 重新打开第 7 步最小化的开有minicom的终端窗口,即到 PXA270-RP 目标板的mnt目录下,请您输入下列 3 条命令,运行HelloWorld编译成功的HelloWorld目标程序:

① cd home/HW /*回到minicom中目标板的/mnt/home/HW目录下*/

北邮嵌入式实验报告学长

北邮嵌入式实验报告学长

北邮嵌入式实验报告学长

4

②ls

③./ HelloWorld /*此时会看到如下图*/

四、 驱动程序

1. 设备驱动程序的概念

设备驱动程序实际是处理和操作硬件控制器的软件,从本质上讲,是内核中具有最高特权级的、驻留内存的、可共享的底层硬件处理例程。驱动程序是内核的一部分,是操作系统内核与硬件设备的直接接口,驱动程序屏蔽了硬件的细节,完成以下功能:

?对设备初始化和释放;

?对设备进行管理,包括实时参数设置,以及提供对设备的操作接口;

?读取应用程序传送给设备文件的数据或者回送应用程序请求的数据;

?检测和处理设备出现的错误。

Linux操作系统将所有的设备全部看成文件,并通过文件的操作界面进行操作。对用户程序而言,设备驱动程序隐藏了设备的具体细节,对各种不同设备提供了一致的接口,一般来说,是把设备映射为一个特殊的设备文件,用户程序可以像对其他文件一样对此设备文件进行操作。这意味着:

?由于每一个设备至少由文件系统的一个文件代表,因而都有一个“文件名”。 ?应用程序通常可以通过系统调用open()打开设备文件,建立起与目标设备的连接。

?打开了代表着目标设备的文件,即建立起与设备的连接后,可以通过read()、write()、ioctl()等常规的文件操作对目标设备进行操作。

设备文件的属性由三部分信息组成:第一部分是文件的类型,第二部分是一个主设备号,第三部分是一个次设备号。其中类型和主设备号结合在一起惟一地

北邮嵌入式实验报告学长

确定了设备文件驱动程序及其界面,而次设备号则说明目标设备是同类设备中的

5

第几个。

由于Linux 中将设备当做文件处理,所以对设备进行操作的调用格式与对文件的操作类似,主要包括open()、read()、write()、ioctl()、close()等。应用程序发出系统调用命令后,会从用户态转到核心态,通过内核将open()这样的系统调用转换成对物理设备的操作。

2. 驱动程序结构

一个设备驱动程序模块的基本框架

在系统内部,I/O设备的存取通过一组固定的入口点来进行,入口点也可以理解为设备的句柄,就是对设备进行操作的基本函数。字符型设备驱动程序提供如下几个入口点:

? open入口点。打开设备准备I/O操作。对字符设备文件进行打开操作,都会调用设备的open入口点。open子程序必须对将要进行的I/O操作做好必要的准备工作,如清除缓冲区等。如果设备是独占的,即同一时刻只能有一个程序访问此设备,则open子程序必须设置一些标志以表示设备处于忙状态。

? close入口点。关闭一个设备。当最后一次使用设备完成后,调用close子程序。独占设备必须标记设备方可再次使用。

? read入口点。从设备上读数据。对于有缓冲区的I/O操作,一般是从缓冲区里读数据。对字符设备文件进行读操作将调用read子程序。

? write入口点。往设备上写数据。对于有缓冲区的I/O操作,一般是把数据写入缓冲区里。对字符设备文件进行写操作将调用write子程序。

?ioctl入口点。执行读、写之外的操作。

select入口点。检查设备,看数据是否可读或设备是否可用于写数据。select系统调用在检查与设备文件相关的文件描述符时使用select入口点。

北邮嵌入式实验报告学长

6

3. 设备注册和初始化

设备的驱动程序在加载的时候首先需要调用入口函数init_module(),该函数最重要的一个工作就是向内核注册该设备,对于字符设备调用register_chrdev()完成注册。register_chrdev的定义为:intregister_chrdev(unsigned int major, const char *name, struct file_ operations *fops);

其中,major是为设备驱动程序向系统申请的主设备号,如果为0,则系统为此驱动程序动态分配一个主设备号。name是设备名,fops是对各个调用的入口点说明。此函数返回0时表示成功;返回-EINVAL,表示申请的主设备号非法,主要原因是主设备号大于系统所允许的最大设备号;返回-EBUSY,表示所申请的主设备号正在被其他设备程序使用。如果动态分配主设备号成功,此函数将返回所分配的主设备号。如果register_chrdev()操作成功,设备名就会出现在/proc/dvices文件中。

Linux在/dev目录中为每个设备建立一个文件,用ls–l命令列出函数返回值,若小于0,则表示注册失败;返回0或者大于0的值表示注册成功。注册以后,Linux将设备名与主、次设备号联系起来。当有对此设备名的访问时,Linux通过请求访问的设备名得到主、次设备号,然后把此访问分发到对应的设备驱动,设备驱动再根据次设备号调用不同的函数。

当设备驱动模块从Linux内核中卸载,对应的主设备号必须被释放。字符设备在cleanup_ module()函数中调用unregister_chrdev()来完成设备的注销。unregister_chrdev()的定义为:intunregister_chrdev(unsigned int major, const char *name);

包括设备注册在内,设备驱动的初始化函数主要完成的功能是有以下5项。

(1)对驱动程序管理的硬件进行必要的初始化。

对硬件寄存器进行设置。比如,设置中断掩码,设置串口的工作方式、并口的数据方向等。

(2)初始化设备驱动相关的参数。

一般说来,每个设备都要定义一个设备变量,用以保存设备相关的参数。在这一步骤里对设备变量中的项进行初始化。

(3)在内核注册设备。

调用register_chrdev()函数来注册设备。

(4)注册中断。

如果设备需要IRQ支持,则要使用request_irq()函数注册中断。

(5)其他初始化工作。

初始化部分一般还负责给设备驱动程序申请包括内存、时钟、I/O端口等在内的系统资源,这些资源也可以在open子程序或者其他地方申请。这些资源不用时,

7

应该释放,以利于资源的共享。

若驱动程序是内核的一部分,初始化函数则要按如下方式声明:

int __initchr_driver_init(void);

其中__init是必不可少的,在系统启动时会由内核调用chr_driver_init,完成驱动程序的初始化。

当驱动程序是以模块的形式编写时,则要按照如下方式声明:

intinit_module(void)

当运行后面介绍的insmod命令插入模块时,会调用init_module函数完成初始化工作。

4. 设备驱动程序的开发过程

由于嵌入式设备由于硬件种类非常丰富,在默认的内核发布版中不一定包括所有驱动程序。所以进行嵌入式Linux系统的开发,很大的工作量是为各种设备编写驱动程序。除非系统不使用操作系统,程序直接操纵硬件。嵌入式Linux系统驱动程序开发与普通Linux开发没有区别。可以在硬件生产厂家或者Internet上寻找驱动程序,也可以根据相近的硬件驱动程序来改写,这样可以加快开发速度。实现一个嵌入式Linux设备驱动的大致流程如下。

(1)查看原理图,理解设备的工作原理。一般嵌入式处理器的生产商提供参考电路,也可以根据需要自行设计。

(2)定义设备号。设备由一个主设备号和一个次设备号来标识。主设备号惟一标识了设备类型,即设备驱动程序类型,它是块设备表或字符设备表中设备表项的索引。次设备号仅由设备驱动程序解释,区分被一个设备驱动控制下的某个独立的设备。

(3)实现初始化函数。在驱动程序中实现驱动的注册和卸载。

(4)设计所要实现的文件操作,定义file_operations结构。

(5)实现所需的文件操作调用,如read、write等。

(6)实现中断服务,并用request_irq向内核注册,中断并不是每个设备驱动所必需的。

(7)编译该驱动程序到内核中,或者用insmod命令加载模块。

(8)测试该设备,编写应用程序,对驱动程序进行测试。

五、 基本接口实验

在完成了基本实验后,我们开始着手基本接口实验。在这些实验中,我们学

8

习如何编写设备驱动程序,及如何用测试程序检验驱动程序是否正确,并通过改写测试程序正常地对驱动程序进行相关操作。

1. 实验十二 简单设备驱动程序

本次实验的任务是编写一个字符型设备驱动程序,并学习在应用程序中调用驱动。考虑到我们初次接触驱动程序的编写,对此还十分陌生,因此指导书中提供了本次实验所要用到的程序源代码。虽然这样一个字符型设备驱动程序并没有任何实际作用,但是它让我们轻松掌握了嵌入式驱动的编写过程,因为复杂繁琐的驱动,其骨架都是相同的。因此,看懂本实验的源代码,学习并模仿其编写方法,对于后续实验有着非常重要的意义。

2. 实验十三 CPU GPIO驱动程序设计

在本实验中,我们要编写第一个针对实际硬件的驱动程序。我们知道,凡是操作系统控制外部设备,即使是最简单的硬件电路,也是需要驱动的。本实验涉及的外部硬件只有电阻和发光二极管。我们使用自己编写的驱动程序与应用程序控制 GPIO96的电平,通过 LED 的亮灭来判断,是否 CPU 做出了正确的响应。

实验第一步是编写 PXA270 GPIO 驱动程序。驱动的写法参照实验十二,大体相同,主要区别如下:

// -------------------控制IO设备-----------------------

switch (cmd)

{

case LED_ON : {GPCR3 |= 0x1;break;}

为1

case LED_OFF: {GPSR3 |= 0x1;break;}

为1 default : { //如果cmd=LED_OFF,那么GPSR3置//如果cmd=LED_ON,那么GPCR3置

printk ("lcd control : no cmd run [ --kernel-- ]\n");

return (-EINVAL);

}

// -------------------驱动程序初始化--------------------------

GPDR3 |= 0x00000001; //设置GPIO96输出模式:开灯

GPSR3 |= 0x00000001; // 关灯

9

对Makefile中的目标体和依赖文件也要做相应的修改,此处省略。

在测试程序中有这样一段代码:

while(1)

{ ioctl(fd,LED_OFF);

sleep(1); // 休眠1秒

ioctl(fd,LED_ON);

sleep(1); }

实验作业要求在目标板上LED闪烁产生亮7秒,灭5秒的效果,很容易实现,只需将上面的代码改为如下代码即可:

while(1)

{ ioctl(fd,LED_OFF);

sleep(5);

sleep(7);

3. 实验十四 中断实验 } // 灭5秒 // 亮7秒 ioctl(fd,LED_ON);

在理论课中,我们学习了许多中断方面的知识,包括中断向量、中断优先级、中断过程等。在PXA270系统里,中断控制器分外部设备和 PXA270X 处理器设备产生的两个层次的中断,前者是初级的中断源,后者是次级中断源,大量的次级中断源通常被映射为一个初级中断源。

在此实验中,我们要编写一个中断程序,利用目标板上的按键SW2来产生中断,使得当每次按下此按键时,在超级终端上打印出响应的信息。编写中断程序与前两个实验的主要区别如下:

/* ---------------------------------------------------------

初始化

request_irq申请硬件中断,参数包括申请的硬件中断号、设备id、中断处理的一些属性(SA_INTERRUPT是快速处理程序,调用时屏蔽所有中断)等

------------------------------------------------ */

ret = request_irq(SIMPLE_INT_IRQ, &SIMPLE_INT_interrupt, SA_INTERRUPT, "int_ctl", NULL);

// --------------------卸载,对应request_irq释放中断---------------------

free_irq(SIMPLE_INT_IRQ,NULL);

10

通过此实验,我了解了硬件中断管脚与中断号的对应关系,以及中断号与中断处理程序的对应关系,对于今后编写更为复杂的中断程序打下基础。

4. 实验十五 数码管显示实验

在此实验中,我们要编写针对 74LV164 的驱动程序,并用其串并转换功能来控制八段LED数码管的显示。

在编写驱动程序时,主要有以下需要注意的:

// 按位写入

voidwrite_bit(intdata)

{

{

}

else

{GPCR2|=(0x1<<26);

}

GPSR2|=(0x1<<27);

}

GPCR2|=(0x1<<27); GPSR2|=(0x1<<26); if((data&0x80)==0x80)

// 按字节写,一次写8位

voidwrite_byte(intdata)

{

{

}

} inti; write_bit(data<<i); for(i=0;i<8;i++)

使用测试程序看到的测试结果是数码管按0-9显示输出。

实验作业要求在上述基础上,分别实现一下两个功能:

①要求您再编写一个测试程序,实现 PXA270-EP 目标板上的 LED 数码管循环显示的数字9-0。

②要求您再编写一个测试程序,实现 PXA270-EP 目标板上的 LED 数码管循环显示的数字02468。

由于在测试程序中定义了数组buf[10]分别存储了0-9是个数,因此上述功能的实现方法是,分别对测试程序做如下修改:

原测试程序:

while(1)

{

{

}

11 for(count=0;count<10;count++) data[0]=buf[count]; ret=write(fd,data,1); sleep(1);

}

实现功能①:

while(1)

{

{

}

} for(count=9;count>=0;count--) // 倒序显示数字 data[0]=buf[count]; ret=write(fd,data,1); sleep(1);

实现功能②:

while(1)

{

{

}

} for(count=0;count<9;count=count+2) // 更改显数顺序 data[0]=buf[count]; ret=write(fd,data,1); sleep(1);

通过更改显数的顺序,很容易实现实验作业里要求的功能。

5. 实验十六 LED点阵驱动程序设计

通过本实验的操作,我们将 8X8 的点阵 LED 驱动起来并通过编写测试程序,使其能够按照您的意图进行显示。要求您还编写更多的测试程序

①要求您再编写一个测试程序,实现按横的方向隔行顺序扫描 LED 点阵数码管。

②要求您再编写一个测试程序,实现按竖的方向顺序扫描 LED 点阵数码管。 作业一,隔行扫描:

for (i=1;i<=8;i2++) { buf[0]=c; buf[1]=~r; // row for (j=1;j<=8;j++) { } r = 1; c = c<<1; write(fd,buf,2); printf ("buf[0],buf[1]: [%x,%x]\n",buf[0],buf[1]); usleep(200000); // sleep 0.2 second r=r<<1; buf[1]=~r; // column 作业二,竖向扫描: for (i=1;i<=8;i++) { buf[0]=c; buf[1]=~r; // row for (j=1;j<=8;j++) {

12

} write(fd,buf,2); printf ("buf[0],buf[1]: [%x,%x]\n",buf[0],buf[1]); usleep(200000); // sleep 0.2 second r=r<<1; buf[1]=~r; // column r = 1; c = c<<1;

6. 实验十七 AD驱动实验

通过本实验的操作,我们将 AD 转换器驱动起来并通过编写测试程序,使其能够将模拟信号量按照我们的要求转换成数字信号量。为了更加清楚地理解 AD 转换器的工作过程,请您再编写一个测试程序,将 UCB_ADC_INP_AD0 换成其他通道,来观察其他 AD 通道情况。

主要代码:

for(i=0;i<50;i++)

{

val0 = ioctl(fd,UCB_ADC_INP_AD1,0);

val2 = ioctl(fd,UCB_ADC_INP_AD2,0); usleep(100); usleep(100); val1 = ioctl(fd,UCB_ADC_INP_AD0,0); usleep(100);

7. 实验十八 DA驱动实验

通过本实验的操作,我们使用示波器看到了通过DA转换而输出的波形。在此基础上,要求试写一个实现输出三角波的测试程序。

主要代码:

while (flag_func_run == FUNC_RUN)

{

print_prompt(); // print select functions

scanf("%d",&flag_select_func); // user input select

getchar(); // get ENTER <LF>

switch(flag_select_func)

{

13

case DA_SIN : {da_create_sin(fd); break; }

case DA_FANG : {da_create_fang(fd); break; }

case FUNC_QUIT :

{

flag_func_run = FUNC_NOT_RUN;

printf("Quit DA function. byebye\n"); break;

}

case DA_TRI :{da_create_tri(fd); break; }

default :

{

printf ("input = %x\n",flag_select_func); printf ("statys = %x\n",flag_func_run);

printf(" -- please input your select use 1 to 4 --\n"); }

}

8. 实验十九键盘驱动实验

通过本实验,我们学习了键盘的工作原理,若您能独立完成本实验的驱动部分的编写,那您已经有了很大的进步了。请您再接再厉,继续完成后续实验,相信您在不久的将来,一定能编写出更加高效,准确地驱动程序。

主要代码:

int main(void)

{

int fd1; int fd2; int ret; unsignedchar buf[2] ; int data[10]; double x; int num1; int num2; int sig; int ans; int ans_tmp; int num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; int number[10]={0,1,2,3,4,5,6,7,8,9}; char pre_scancode = 0xff;

14 // int i;

printf("\nstart keypad_driver test\n\n");

fd1 = open(DEVICE_NAME1, O_RDWR);

printf("open device %s error\n",DEVICE_NAME1); if (fd1 == -1) { }

else {

num1_in:

{ }

15 fd2 = open(DEVICE_NAME2, O_RDWR); // printf("fd = %d\n",fd); buf[0]=0x22; while (1) { while (1) usleep(150000); read (fd1,buf,1); num1=0; num2=0; sig=0; ans=0; if(buf[0]!= pre_scancode) { } pre_scancode = buf[0]; num1 = number[buf[0]]; if (num1!=0) { printf("num1 read.. %d\n",num1); buf[0]=0; goto signal_in; } if(buf[0]!=0xff) data[0] = num[buf[0]]; printf("key =%x\n",buf[0]); if(buf[0]!=0) ret = write(fd2,data,1);

signal_in:

while(1) { usleep(150000); read (fd1,buf,1); if(buf[0]!= pre_scancode) { if(buf[0]!=0xff) data[0] = num[buf[0]];

num2_in:

get_ans:

printf("key =%x\n",buf[0]); if(buf[0]!=0) ret = write(fd2,data,1); } pre_scancode = buf[0]; sig = buf[0]; if (sig!=0) { printf("sig read.. %d\n",sig); buf[0]=0; goto num2_in; } } while(1) { usleep(150000); read (fd1,buf,1); if(buf[0]!= pre_scancode) { if(buf[0]!=0xff) data[0] = num[buf[0]]; printf("key =%x\n",buf[0]); if(buf[0]!=0) ret = write(fd2,data,1); } pre_scancode = buf[0]; num2 = number[buf[0]]; if (num2!=0) { printf("num2 read.. %d\n",num2); buf[0]=0; goto get_ans; } usleep(50000); } if (sig==19) ans=num1+num2; elseif (sig==20) ans=num1-num2;

16

elseif (sig==21) ans=num1*num2; elseif (sig==22) ans=num1/num2; else ans=ans; data[0]=num[ans]; write(fd2,data,1); if (ans_tmp!=ans) { printf("The answer is %d\n",ans); ans_tmp = ans; } else ans_tmp = ans; printf("buf[0]=%x\n",buf[0]); sleep(1); usleep(50000);} // //

}

// close ret = close(fd1); printf ("ret=%d\n",ret); printf ("close keypad_driver test\n");

return 0;

}// end main

9. 实验二十 LCD控制实验

通过本实验操作,我们在LCD上显示了彩色条纹,由于LCD的驱动程序比较复杂,我们已经直接将其编译入内核,为了让您能进一步利用LCD显示您要的图像,请您写一个测试程序,实现PXA270-EP目标板上的LCD上显示为七彩的竖向条纹。

主要代码:

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

{

for(i=640*j;i<640*j+80;i++) { buf[i]=0x0001;

17

} for(i=640*j+80;i<640*j+160;i++) { buf[i]=0xf800; } for(i=640*j+160;i<640*j+240;i++) { buf[i]=0x07ef; } for(i=640*j+240;i<640*j+320;i++) { buf[i]=0x001f; } for(i=640*j+320;i<640*j+400;i++)

{

buf[i]=0xffe0;

}

for(i=640*j+400;i<640*j+480;i++)

{

buf[i]=0x07ff;

}

for(i=640*j+480;i<640*j+560;i++)

{

buf[i]=0xf81f;

}

for(i=640*j+560;i<640*j+640;i++)

{

buf[i]=0xffff;

}

}

10. 实验二十一触摸屏数据采集与控制实验

随着使用电脑作为信息来源的与日俱增,触摸屏以其易于使用、坚固耐用、反应速度快、节省空间等优点,使得系统设计师们越来越多的感到使用触摸屏的确具有相当大的优越性。通过此试验,我们学习了触摸屏原理,并通过编写测试程序验证了触摸屏的工作过程。学习它,掌握它是非常必要的。

18

11. 实验二十二 VGA显示实验

通过本实验的操作,VGA设备成功启动,在液晶屏和显示器上可以看到完全同步的画面。由于两者格式和刷新频率的差别,实验中做了折中处理,可能显示效果没有达到最优。

12. 实验二十三 Web服务器实验

学习使用socket 进行通讯编程的过程,了解一个实际的网络通讯应用程序整体设计,阅读HTTP协议的相关内容,学习几个重要的网络函数的使用方法。读懂HTTPD.C源代码。在此基础上增加一些其他功能。在宿主PC机上使用浏览器测试嵌入式WEB服务器的功能。

通过此实验,我们实现了嵌入式Web服务器的基本功能。

13. 实验二十四网络文件传输实验

通过网络在宿主PC机与PXA270-EP目标板之间进行文件传输。

14. 实验二十五多线程应用实验

读懂pthread.c的源代码,熟悉几个重要的PTHREAD 库函数的使用。掌握共享锁和信号量的使用方法。

六、 实验中遇到的问题及解决方法

每一次上课重新启动后,当需要将宿主PC机的根目录挂在到PXA270-EP目标板的mnt目录下(即在超级终端中输入命令“mount –o soft,timeo=100,rsize=1024 192.168.0.100:/ /mnt”)时,常显示无法挂载。

解决方法:在超级终端下的挂载命令应该用”mount –o nolock 192.168.0.100:/ /mnt”,如果依然不能挂载需要重启NFS服务,即在PC机终端中输入命令”service nfs restart”两遍后就可以挂载,当然有时候也可能是因为网线没插好。

在每次重启机器之后都需要将PC机终端的IP地址和开发板中的系统的IP地址设定正确,不然也无法挂载。

19

七、 实验总结及心得

本学期的所有实验均在宿主PC机与PXA270-EP目标板上进行。在实验中,我们先建立硬件实验平台,又建立主机软件开发环境,接着为实验进行各项配置,最后完成了各个实验中的多种功能。值得注意的是,前期的硬件、软件准备必须完整无误地实现,后续的实验才能顺利进行。所以,打基础的工作一定要仔细谨慎。后续实验中虽然给出了驱动程序的框架,仍需要我们自己补充完整,并开动脑筋举一反三,在原代码的基础上进行一定修改以实现新的功能。

通过这学期的实验,我逐步完成了建立实验软件开发平台,搭建实验编译软件环境,在PC上编辑、编译一个应用程序,并且在嵌入式系统上运行和调试它的过程。在实验中,不难发现,编译驱动程序大体框架都是一样的,比如里面的读函数、写函数、ioctl函数、打开、关闭以及函数模块的初始化并且在超级终端上显示出等。但所不同的是,要根据不同的实验要求修改名称,并且对其中必要的部分进行修改。

除此之外,我认为很多基础知识对实验的进行也起着非常大的作用,例如数码管的显示原理。在掌握了基础知识之后,上机的过程会显得相对简单,尤其是代码框架已经给出,我们所以需要做的就是根据需要稍作改动来得到我们想要的结果。

之后,我们又进行了更加深入的应用试验,如人机接口方面的键盘驱动实验、LCD控制实验和触摸屏数据采集与控制实验,应用方面的多线程应用实验等。由于涉及到嵌入式实验板的开发、模型化Qt编程,我们在之前实验基础上自己动手编写了程序,对算法和开发环境有了更深入的掌握,在自我与互相学习中解决了许多问题,受益匪浅。

整个实验让我了解了一套完整的嵌入式系统驱动程序开发的全过程,学到的内容非常丰富,相信在学习了这些内容后,在今后的学习工作中接触到类似内容,我不会感到无从下手,而是能够有条不紊。

感谢老师的辛勤指导!

20

相关推荐