嵌入式系统虚拟仪表设计_第1页
嵌入式系统虚拟仪表设计_第2页
嵌入式系统虚拟仪表设计_第3页
嵌入式系统虚拟仪表设计_第4页
嵌入式系统虚拟仪表设计_第5页
已阅读5页,还剩141页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 专业综合实践报告 嵌入式系统虚拟仪表设计学生姓名学号教学院系 电气信息学院专业年级自动化2011级 指导教师 完成日期2015 年3 月20 日 摘 要针对传统仪表和现有仪表存在的不足,本文提出了一种新型的虚拟仪表设计方案,采用arm处理器为核心的硬件平台和以嵌入式linux系统为核心的软件平台,并在此基础上采用开放源代码的图形界面库qt开发仪表终端应用程序。该虚拟仪表可读性好,读数精度高,在可移植性、可维护性和成本方面都得到了良好的改善,具有较大的科研价值和商业使用价值本文所介绍的车载虚拟仪表的基本设计思想是将司钻监控系统上安装的各种传感器采集到的数据进行智能化的处理,然后在运行于嵌入式l

2、inux系统的使用qt设计的虚拟仪表盘上进行显示,以便于监测各系统的工作状况,如悬重 钻压 钻速 泥浆返回流量 泥浆泵冲速 立管压力 转盘转速 转盘扭矩 游车高度等,并在某状态出现异常或存在危险时向操作员提示报警。【关键词】:虚拟仪器、司钻监测系统、Linux系统目录一绪论11.1虚拟仪器的发展11.2 专业综合实践的主要内容1二 嵌入式系统虚拟仪表开发环境32.1 嵌入式系统虚拟仪表设计目标32.2 开发环境3 2.2.1 Qt Creator简介3 2.2.2 Fedora简介3三 基于ARM处理器的便携式仪表人机接口的设计53.1 设计原理及说明5 3.1.1 A/D转换器.5 3.1.

3、2 A/D转换重要指标.53.2 接口总体设计.63.3 ADC及触摸屏接口特殊寄存.7 3.3.1 ADC 控制寄存器.7 3.3.2 ADC 开始延时寄存.8 3.3.3 ADC转换数据寄存器83.4 AD转换程序9四 嵌入式系统虚拟仪表开发224.1 Qt Creator开发224.2 Qt Create编程244.3 虚拟仪表运行界面29五 基于Linux操作系统的程序编译和烧写305.1 Linux操作系统及其常用命令305.2 Linux内核配置315.3 终端编译33六 课程设计收获与体会35参考文献36I一绪论1.1虚拟仪器的发展现代仪器仪表技术是计算机技术和多种基础学科紧密结

4、合的产物。随着微电子技术、计算机技术、软件技术、网络技术的飞速发展,新的测试理论、测试方法、测试领域以及新的仪器结构不断出现,在许多方面已经冲破了传统仪器的概念,电子测量仪器的功能和作用发生了质的变化。在此背景下,1986年美国国家仪器公司(National Instruments,NI)提出了虚拟仪器(Virtual Instrument,VI)的概念。尽管迄今为止虚拟仪器还没有一个统一的定义,但是一般认为:虚拟仪器是在PC基础上通过增加相关硬件和软件构建而成的、具有可视化界面的可重用测试仪器系统。作为一种以计算机软件为核心的新型仪器系统,虚拟仪器具有功能强、测试精度高、测试速度快、自动化程

5、度高、人机界面优异、灵活性强等优点,通常被认为是第三代自动测试系统的同义语。使用虚拟仪器系统可以避免仪器编程过程中的大量重复性劳动,从而大大缩短复杂程序的开发时间,并且客户可以用不同的模块来构造自己的虚拟仪器系统,选择统一的测试策略。由于虚拟仪器的功能和性能已被不断提高,如今在许多应用中它已成为传统仪器的主要替代方式。而虚拟仪器的各种优点让用户可放心地舍弃旧的传统测量设备,接受更新型、以计算机为基础的虚拟仪器系统。由于计算机的性能价格比不断改进,使虚拟仪器的价格更为大众化,用户不必再受限于传统仪器的使用限制和昂贵的价格,进一步降低了使用成本,减少了系统的开发费用和系统的维护费用。此外,新型笔记

6、本电脑又把虚拟仪器的便携性和强大功能推向一个新的水平。所有这些必将加快虚拟仪器的发展,使它的功能和应用领域不断增强和扩大。在测量、检测、电信、监控、教育等方面的应用已广泛开展。1.2 专业综合实践的主要内容 司钻英文名称为driller,指的是石油钻井中带班工人的简称,在本设计中司钻系统则是指一套全自动的油井采集监控系统。本系统包括以下功能:嵌入式系统AD数据采集,嵌入式系统电机控制,嵌入式系统虚拟仪表设计,嵌入式系统绞车数据采集,嵌入式系采集统数据显示,嵌入式系统采集曲线显示,嵌入式系统串口通信,嵌入式系统按键输入,嵌入式系统led控制,嵌入式系统音频输出。在此系统中本人主要负责嵌入式系统虚

7、拟仪表设计。 本设计要求完成虚拟实验室中虚拟信号发生器和虚拟信号采集器的设计。2 嵌入式系统虚拟仪表开发环境2.1 嵌入式系统虚拟仪表设计目标本文设计了一种基于Qt Creator的虚拟仪表设计。它的主要设计目标是:系统的主要工作是对大量的过程状态参数实时监测、数据存储、数据处理、进行实时数据分析等。因此要求硬件上必须要有实时时钟和优先级中断信息处理电路。2.2 开发环境 2.2.1 Qt Creator简介Qt Creator是跨平台的 Qt IDE, Qt Creator 是 Qt 被 Nokia 收购后推出的一款新的轻量级集成开发环境(IDE)。此 IDE 能够跨平台运行,支持的系统包括

8、 Linux(32 位及 64 位)、Mac OS X 以及 Windows。根据官方描述,Qt Creator 的设计目标是使开发人员能够利用 Qt 这个应用程序框架更加快速及轻易的完成开发任务。Qt Creator 包括项目生成向导、高级的 C+ 代码编辑器、浏览文件及类的工具、集成了 Qt Designer、Qt Assistant、Qt Linguist、图形化的 GDB 调试前端,集成 qmake 构建工具等。QtCreator主要是为了帮助新Qt用户更快速入门并运行项目,还可提高有经验的Qt开发人员的工作效率。使用强大的 C+ 代码编辑器可快速编写代码语法标识和代码完成功能输入时进

9、行静态代码检验以及提示样式上下文相关的帮助代码折叠括号匹配和括号选择模式高级编辑功能使用浏览工具管理源代码集成了领先的版本控制软件,包括 Git、Perforce 和 Subversion开放式文件,无须知晓确切的名称或位置搜索类和文件跨不同位置或文件沿用符号在头文件和源文件,或在声明和定义之间切换为Qt跨平台开发人员的需求而量身定制集成了特定于 Qt 的功能,如信号与槽 (Signals & Slots)图示调试器, 对 Qt 类结构可一目了然集成了 Qt Designer 可视化布局和格式构建器只需单击一下就可生成和运行 Qt 项目。 2.2.2 Fedora简介Fedora 是一个知名的

10、Linux发行版,是一款由全球社区爱好者构建的面向日常应用的快速、稳定、强大的操作系统。它允许任何人自由地使用、修改和重发布,无论现在还是将来。它由一个强大的社群开发,这个社群的成员以自己的不懈努力,提供并维护自由、开放源码的软件和开放的标准。Fedora 项目由 Fedora 基金会管理和控制,得到了 Red Hat, Inc. 的支持。Fedora 是一个独立的操作系统,可运行的体系结构包括 x86(即i386-i686), x86_64 和 PowerPC。Fedora (第七版以前为Fedora Core)是一款基于Linux的操作系统,也是一组维持计算机正常运行的软件集合。Fedor

11、a 由Fedora Project社区开发、红帽公司赞助,目标是创建一套新颖、多功能并且自由和开源的操作系统。Fedora 项目以社区的方式工作,引领创新并传播自由代码和内容,是世界各地爱好、使用和构建自由软件的社区朋友的代名词。Fedora基于Red Hat Linux,在Red Hat Linux终止发行后,红帽公司计划以Fedora来取代Red Hat Linux在个人领域的应用,而另外发行的Red Hat Enterprise Linux(Red Hat企业版Linux,RHEL)则取代Red Hat Linux在商业应用的领域。Fedora的功能对于用户而言,它是一套功能完备、更新快

12、速的免费操作系统,而对赞助者Red Hat公司而言,它是许多新技术的测试平台,被认为可用的技术最终会加入到Red Hat Enterprise Linux中。Fedora是一个基于 Linux 的操作系统,旨在为用户提供稳定、安全且易于使用和管理的自由和开源软件。Fedora 发行版是 Fedora 项目的各种自由软件创造中最大的一个。由于其与生俱来的优势,Fedora 这个单词通常可以用于表达 Fedora 项目或 Fedora 发行版二者之中的任意一个。Fedora项目以不同方式发行 Fedora:(1) Fedora DVD/CD 包含了所有主要软件包的DVD或CD套装;(2) Live

13、光盘 CD或DVD大小的光盘镜像,可用于创建Live CD或从USB设备启动,并可选安装到硬盘;(3) 最小CD 用于通过HTTP,FTP或NFS安装。您可以通过Fedora Live USB Creator或UNetbootin创建Live USB版本的Fedora。同时,Fedora项目发布自定义的Fedora版本,称作Fedora spins。这些版本包含特定的软件包集合,以满足特定种类的用户之需要。Fedora spins由一些对Fedora有特殊兴趣的小组开发。Enterprise Linux额外软件包(英文: Extra Packages for Enterprise Linux,

14、EPEL)是由来自Fedora Project的志愿者发起的社区力量,为了创建由高质量的附加软件组成的、用于补足RHEL和其他兼容版本的软件仓库。软件包管理主要由yum实用程序提供。Fedora同样提供图形界面(例如pirut,pup和puplet),用于在更新可用时提供视觉通知。apt-rpm是yum的替代品,对于Debian类发行版的用户来说可能更熟悉。这里,APT被用于管理软件包。额外的软件仓库可以被添加到Fedora,以便安装Fedora软件仓库未提供的软件包。3 基于ARM处理器的便携式仪表人机接口的设计3.1 设计原理及说明3.1.1 A/D转换器 A/D转换器是模拟信号源和CPU

15、之间联系的接口,它的任务是将连续变化的模拟信号转换为数字信号,以便计算机和数字系统进行处理、存储、控制和显示。在工业控制和数据采集及许多其他领域中,A/D转换是不可缺少的。 A/D转换器有以下类型:逐位比较型、积分型、计数型、并行比较型、电压频率型,主要应根据使用场合的具体要求,按照转换速度、精度、价格、功能以及接口条件等因素来决定选择何种类型。常用的有以下两种:1)双积分型的A/D转换器2)逐次逼近型的A/D转换器3.1.2 A/D转换的重要指标(1)分辨率(Resolution)指数字量变化一个最小量时模拟信号的变化量,定义为满刻度与2”的比值。分辨率又称精度,通常以数字信号的位数来表示。

16、(2)转换速率(ConversionRate)指完成一次从模拟到数字的A/D转换所需的时间的倒数。积分型AfD韵转换时间是毫秒级,属低速A/D,逐次逼近型A/D是微秒级,属中速A/D,全并行/串并行型A/D可达到纳秒级。采样时间则是另外一个概念,是指两次转换的间隔。为了保证转换正确完成,采样速率(SampleRate)必须小于或等于转换速率。因此有人习惯上将转换速率在数值上等同于采样速率也是可以接受的。(3) 量化误差(QuantizingError)由AfD的有限分辨率而引起的误差,即有限分辨率A/D的阶梯状转移特性曲线与无限分辨率AfD(理想A/D)的转移特性曲线(直线)之间的最大偏差。通

17、常是1个或半个最小数字量的模拟变化量,表示为1LSB、1/2LSB。(4)偏移误差(OffsetError)输入信号为零时输出信号不为零的值,可外接电位器调至最小。(5)满刻度误差(FullScaleError)满度输出时对应的输入信号与理想输入信号值的差。(6)线性度(Linearity)实际转换器的转移函数与理想直线的最大偏移,不包括以上三种误差。其他指标还有:绝对精度(AbsoluteAccuracy)、相对精度(RelativeAccuracy)、微分非线性、单调性和无错码、总谐波失真(TotalHarmonicDistotortion,THD)和积分非线性。3.2接口总体设计 本文设

18、计的高速高精度数据采集系统有硬件和软件两部分组成。而硬件部分主要完成数据采集、存储功能,软件部分则完成对硬件控制、对采集数据进行处理。Micro2440 开发板由核心板 Micro2440 和底板 Micro2440SDK 组成,因为本手册描述的是整个开发板的使用说明,因此以下我们简称为 Micro2440 开发板。Micro2440 核心板其实是一个最小系统板,它具有最基本的系统配置:* CPU - 三星 S3C2440,运行于 400Mhz* NOR FLASH 2M,很多公司为了节省成本并不提供 NOR FLASH,这对开发和量产是很不利的* NAND FLASH - 256M(可根据用

19、户需求更改为 64M-1G)* SDRAM 64M,由 2 片 16-bit 宽度的 32M SDRAM 组成* 1个电源指示等和 4 个用户指示灯* 专业复位芯片* 在板 JTAG* 专业电压调节芯片Samsung S3C2440 芯片内部总共有 8 路 A/D 转换通道,但其转换器只有一个。在常见的设计中,一般 AIN4、 AIN5、 AIN6、 AIN7 被用作了四线电阻触摸的 YM、 YP、 XM、 XP通道;本开发板引出了剩余的 AIN0-3,它们位于 CON4 接口,为了方便测试,其中 AIN0 直接和一个可调电阻 W1 连接。模块图: 图3.1 AD 转换器的功能模块图 AD 转

20、换时间当GCLK频率为 50MHz和预分频器(预定标器)值为 49,总共 10 位转换时间如下:A D转换器频率 = 50 M Hz/ ( 49 +1) = 1M Hz转换时间 = 1/ ( 1M H z / 5c y c l e s ) = 1/ 20 0 K Hz = 5 u s注: AD转换器设计在最大 2.5MHz时钟下工作,所以转换率最高达到 500KSPS。 AD 转换方式( 1 ) AD转换的数据可以通过中断或查询的方式来访问。使用中断方式整个转换时间(从AD转换器开始到转换数据读取)可能会因为中断服务程序的返回时间和数据访问时间而延长。使用查询方式,通过查看ADCCON15位(

21、转换标志结束位),ADCDAT寄存器的读取时间可以确定。( 2 ) 提供另外的开启 AD转换的方法。在ADCCON1置 1 ( AD转换开始读取模式),只要转换数据被读取, AD转换同时开始。3.3 ADC及触摸屏接口特殊寄存器 3.3.1 ADC 控制寄存器表3.1 ADC 控制寄存器3.3.2 ADC 开始延时寄存器表3.2 ADC 开始延时寄存器 3.3.3 ADC转换数据寄存器表3.3 ADC转换数据寄存器0表3.4 ADC转换数据寄存器13.4 AD转换程序4.1 AD数据转换程序(查询方式) AD转换的数据可以通过中断或查询的方式来访问。使用中断方式整个转换时间(从AD转换器开始到

22、转换数据读取)可能会因为中断服务程序的返回时间和数据访问时间而延长。使用查询方式,通过查看ADCCON15位(转换标志结束位),ADCDAT寄存器的读取时间可以确定。提供另外的开启 AD转换的方法。在ADCCON1置 1 ( AD转换开始读取模式),只要转换数据被读取, AD转换同时开始。noyes开始初始化AD采样通道选择转换是否完成返回启动转换图3.2 AD数据转换程序流程图AD数据转换程序:#include def.h#include option.h#include 2440addr.h#include 2440lib.h#include 2440slib.h #define REQC

23、NT 100 /May 08, 2002 SOP#define ADC_FREQ 2500000 /设定AD的转换频率,应该至少小于PCLK的1/5(10.14Mhz) 2.5MHz#define LOOP 10000 /延迟的循环次数volatile U32 preScaler; /通道设置存储/=int ReadAdc(int ch) /读ADC函数,ch决定那个通道被选择,通道数(ch为0-7) int i; static int prevCh=-1; /定义静态整形变量prevCh存储AD转换通道/ADC设置使能端、设置预分频值为49、选择通道位,选中的通道上的电压被连接到AD rAD

24、CCON = (114)|(preScaler6)|(ch3);/setup channelhttp:分频使能,写入分频值,选择通道 /ADCCON第14位置1,AD转换预分频器始能。 /将preScaler赋给ADCCON第613位,给AD预分频器赋值。 /将Ch值赋给ADCCON第35位选择模拟输入通道。 if(prevCh!=ch)/判断通道是否切换 rADCCON = (114)|(preScaler6)|(ch3); /重新设置设置通道ch和预分频值preScalerfor(i=0;iLOOP;i+);/delay to set up the next channel切换通道要等待一

25、段时间prevCh=ch; rADCCON|=0x1; /start ADCCON第0位置1,AD转换开始且该位在开始后清零 while(rADCCON & 0x1);/check if Enable_start is low等待启动位清零,转换启动结束 while(!(rADCCON & 0x8000);/check if EC(End of Conversion) flag is high判断第15位是否为1等待转换结束 return ( (int)rADCDAT0 & 0x3ff );/返回09位的采样值,01023 AD数据转换测试程序(查询方式) Samsung S3C2440 芯片

26、内部总共有 8 路 A/D 转换通道,但其转换器只有一个。在常见 的设计中,一般 AIN4、 AIN5、 AIN6、 AIN7 被用作了四线电阻触摸的 YM、 YP、 XM、 XP 通道;本开发板引出了剩余的 AIN0-3,它们位于 CON4 接 口,为了方便测试,其中 AIN0 直接和一个可调电阻 W1 连接。可通过旋转板上的 W1 可调电阻,来测试AD数据转换,可以看到不断变化的转换结果,因为是 10 位精度的 转换器,故转换值最小时会接近 0,最大时会接近 1024。AD数据转换测试程序:void Test_Adc(void) int a0=0, a1; /Initialize vari

27、ables/初始化变量U32 rADCCON_save = rADCCON; /用rADCCON_save 存储初始的ADCCON,以备恢复用 Uart_Printf( ADC INPUT Test, press ESC key to exit !n ) /PCLK:50.7MHz 。通过转化频率计算预分频值 /FCLK=400M HCLK=100M PCLK=50M /AD转换器频率=PCLK/(preScaler+1preScaler = ADC_FREQ; /预定标器赋值25MUart_Printf(ADC conv. freq. = %dHzn,preScaler); /串口输出预分频

28、值preScaler = 50000000/ADC_FREQ -1; /PCLK:50.7MHz /preScaler =1转换频率freq=50M/(1+1)=25M,最大不超过PCLK的1/5? /A D转换器频率 = 50 M Hz/ ( preScaler +1) = 1M Hz Uart_Printf(PCLK/ADC_FREQ - 1 = %dn,preScaler); while( Uart_GetKey() != ESC_KEY ) a0=ReadAdc(0); /对应开发板上W1可调电阻 a1=ReadAdc(1); /对应开发板上W2可调电阻 Uart_Printf( AI

29、N0: %04d,AIN1: %04dn, a0, a1 );Delay( 500 ) ; rADCCON = rADCCON_save; /恢复现场 Uart_Printf(nrADCCON = 0x%xn, rADCCON);/输出ADC控制器内容ADC驱动程序#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #incl

30、ude #include /;自己定义的头文件,因原生内核并没有包含#include s3c24xx-adc.h#undef DEBUG/#define DEBUG#ifdef DEBUG#define DPRINTK(x.) printk(_FUNCTION_(%d): ,_LINE_);printk(#x);#else#define DPRINTK(x.) (void)(0)#endif/;定义ADC 转换设备名称,将出现在/dev/adc#define DEVICE_NAME adcstatic void _iomem *adc_base;/*定义了一个用来保存经过虚拟映射后的内存地址*

31、/;定义ADC 设备结构typedef struct wait_queue_head_t wait;int channel;int prescale;ADC_DEV;static ADC_DEV adcdev;/;声明全局信号量,以便和触摸屏驱动程序共享A/D 转换器DECLARE_MUTEX(ADC_LOCK);/;ADC驱动是否拥有A/D 转换器资源的状态变量/static volatile int OwnADC = 0;/*用于标识AD转换后的数据是否可以读取,0表示不可读取*/static volatile int ev_adc = 0;/*用于保存读取的AD转换后的值,该值在ADC中

32、断中读取*/static int adc_data;/*保存从平台时钟队列中获取ADC的时钟*/static struct clk *adc_clk;/;定义ADC 相关的寄存器#define ADCCON (*(volatile unsigned long *)(adc_base + S3C2410_ADCCON) /ADC control#define ADCTSC (*(volatile unsigned long *)(adc_base + S3C2410_ADCTSC) /ADC touch screen control#define ADCDLY (*(volatile unsig

33、ned long *)(adc_base + S3C2410_ADCDLY) /ADC start or IntervalDelay#define ADCDAT0 (*(volatile unsigned long *)(adc_base + S3C2410_ADCDAT0) /ADC conversion data 0#define ADCDAT1 (*(volatile unsigned long *)(adc_base + S3C2410_ADCDAT1) /ADC conversion data 1#define ADCUPDN (*(volatile unsigned long *)

34、(adc_base + 0x14) /Stylus Up/Down interrupt status#define PRESCALE_DIS (0 14)#define PRESCALE_EN (1 14)#define PRSCVL(x) (x) 6)#define ADC_INPUT(x) (x) 3)#define ADC_START (1 0)#define ADC_ENDCVT (1 15)/;定义“开启AD 输入”宏,因为比较简单,故没有做成函数/#define START_ADC_AIN(ch, prescale)#define start_adc(ch, prescale) d

35、o ADCCON = PRESCALE_EN | PRSCVL(prescale) | ADC_INPUT(ch) ; ADCCON |= ADC_START; while(0)/*设置ADC控制寄存器,开启AD转换*/*static void start_adc(int ch,int prescale) unsigned int tmp; tmp = PRESCALE_EN | PRSCVL(prescale) | ADC_INPUT(ch);/(1 14)|(255 6)|(0 3);/ 0 1 00000011 000 0 0 0/此处writl()的原型是void writel(u32

36、 b, volatile void _iomem *addr),addr是经过地址重映射后的地址 writel(tmp, ADCCON);/AD预分频器使能、模拟输入通道设为AIN0 tmp = readl(ADCCON); tmp = tmp | ADC_START;/(1 f_flags & O_NONBLOCK) /*应用程序若采用非阻塞方式读取则返回错误*/ return -EAGAIN; else/*以阻塞方式进行读取*/ /*设置ADC控制寄存器,开启AD转换*/ start_adc(adcdev.channel, adcdev.prescale); /*使等待队列进入睡眠*/ w

37、ait_event_interruptible(adcdev.wait, ev_adc); /*能到这里就表示已有AD转换后的数据,则标识清0,给下一次读做判断用*/ ev_adc = 0; /*将读取到的AD转换后的值发往到上层应用程序*/ copy_to_user(buffer, (char *)&adc_data, sizeof(adc_data); /*释放获取的信号量(即:解锁)*/ up(&ADC_LOCK); return sizeof(adc_data);/;打开ADC设备的函数,一般对应于用户态程序的openstatic int adc_open(struct inode *

38、inode, struct file *filp)int ret;/* normal ADC */ADCTSC = 0;/;初始化中断队列init_waitqueue_head(&(adcdev.wait);adcdev.channel=0;/;缺省通道为“0”adcdev.prescale=0xff;/* 申请ADC中断服务,这里使用的是共享中断:IRQF_SHARED,为什么要使用共享中断,因为在触摸屏驱动中 也使用了这个中断号。中断服务程序为:adc_irq在下面实现,IRQ_ADC是ADC的中断号,这里注意: 申请中断函数的最后一个参数一定不能为NULL,否则中断申请会失败,这里传入的

39、是ADC_DEV类型的变量*/ret = request_irq(IRQ_ADC, adc_irq, IRQF_SHARED, DEVICE_NAME, &adcdev);if (ret) /*错误处理*/ printk(KERN_ERR IRQ%d error %dn, IRQ_ADC, ret); return -EINVAL; DPRINTK( adc openedn); return 0;static int adc_release(struct inode *inode, struct file *filp)DPRINTK( adc closedn);return 0;static

40、struct file_operations dev_fops = owner: THIS_MODULE,open: adc_open,read:adc_read,release: adc_release,;static struct miscdevice adc_miscdev = .minor = MISC_DYNAMIC_MINOR,.name = DEVICE_NAME,.fops = &dev_fops,;static int _init dev_init(void)int ret;/* 1,从平台时钟队列中获取ADC的时钟,这里为什么要取得这个时钟,因为ADC的转换频率跟时钟有关。

41、 系统的一些时钟定义在arch/arm/plat-s3c24xx/s3c2410-clock.c中*/adc_clk = clk_get(NULL, adc);if (!adc_clk) printk(KERN_ERR failed to get adc clock sourcen);return -ENOENT;/*时钟获取后要使能后才可以使用,clk_enable定义在arch/arm/plat-s3c/clock.c中*/clk_enable(adc_clk);/* 2,将ADC的IO端口占用的这段IO空间映射到内存的虚拟地址,ioremap定义在io.h中。 注意:IO空间要映射后才能

42、使用,以后对虚拟地址的操作就是对IO空间的操作, S3C2410_PA_ADC是ADC控制器的基地址,定义在mach-s3c2410/include/mach/map.h中,0x20是虚拟地址长度大小*/adc_base=ioremap(S3C2410_PA_ADC,0x20);if (adc_base = NULL) printk(KERN_ERR Failed to remap register blockn);ret = -EINVAL; goto err_noclk;/* 3,把看ADC注册成为misc设备,misc_register定义在miscdevice.h中 adc_miscd

43、ev结构体定义及内部接口函数在第2步中讲,MISC_DYNAMIC_MINOR是次设备号,定义在miscdevice.h中*/ ret = misc_register(&adc_miscdev); if (ret) /*错误处理*/ printk(KERN_ERR Cannot register miscdev on minor=%d (%d)n, MISC_DYNAMIC_MINOR, ret); goto err_nomap; printk(DEVICE_NAME tinitialized!n);return 0;/以下是上面错误处理的跳转点err_noclk: clk_disable(a

44、dc_clk); clk_put(adc_clk);err_nomap: iounmap(adc_base); return ret;static void _exit dev_exit(void)free_irq(IRQ_ADC, &adcdev);/;释放中断iounmap(adc_base);/*释放虚拟地址映射空间*/if (adc_clk)/*屏蔽和销毁时钟*/clk_disable(adc_clk);clk_put(adc_clk);adc_clk = NULL;misc_deregister(&adc_miscdev);/;导出信号量“ADC_LOCK”,以便触摸屏驱动使用4 嵌入式系统虚拟仪表开发 4.1 Qt Creator开发1、 建立工程图4.1 选择工程类型图4.2 工程名和路径图4.3工程的文件类型图4.5 一个完整工程和Qt开发工具栏2、 虚拟仪表界面搭建图4.6 司钻监测系统虚拟仪表界面4.2 Qt Create编程Mainwindow.cpp#include mainwindow.h#include ui_mainwindow.h#include #include #incl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论