资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第,5,章 嵌入式系统输入输出设备接口,1,5.1 GPIO,(通用输入,/,输出接口),2,5.1.1 GPIO,原理与结构,GPIO,(,General Purpose I/O,,通用输入,/,输出接口)也称为并行,I/O,(,parallel I/O,),是最基本的,I/O,形式,由一组输入引脚、输出引脚或输入,/,输出引脚组成,,CPU,对它们能够进行存取操作。有些,GPIO,引脚能够通过软件编程改变输入,/,输出方向。,一个双向,GPIO,端口(,D0,)的简化功能逻辑图如图,5.1.1,所示,图中,PORT,为数据寄存器和,DDR,(,Data Direction Register,)为数据方向寄存器。,3,图,5.1.1,双向,GPIO,功能逻辑图,4,DDR,设置端口的方向。如果,DDR,的输出为,1,,则,GPIO,端口为输出形式;如果,DDR,的输出为零,则,GPIO,端口为输入形式。写入,WR,DDR,信号能够改变,DDR,的输出状态。,DDR,在微控制器地址空间中是一个映射单元。这种情况下,如果需要改变,DDR,,则需要将恰当的值置于数据总线的第,0,位(即,D0,),同时激活,WR,DDR,信号。读,DDR,,就能得到,DDR,的状态,同时激活,RD,DDR,信号。,如果设置,PORT,引脚端为输出,则,PORT,寄存器控制着该引脚端状态。如果将,PORT,引脚端设置为输入,则此输入引脚端的状态由引脚端上的逻辑电路层来实现对它的控制。对,PORT,寄存器的写操作,需要激活,WR,PORT,信号。,PORT,寄存器也映射到微控制器的地址空间。需指出,即使当端口设置为输入时,如果对,PORT,寄存器进行写操作,并不会对该引脚产生影响。但从,PORT,寄存器的读出,不管端口是什么方向,总会影响该引脚端的状态。,5,5.1.2 S3C2410A,输入输出端口编程实例,S3C2410A,共有,117,个多功能复用输入输出端口(,I/O,口),分为端口,A,端口,H,共,8,组。为了满足不同系统设计的需要,每个,I/O,口可以很容易地通过软件对进行配置。每个引脚的功能必须在启动主程序之前进行定义。如果一个引脚没有使用复用功能,那么它可以配置为,I/O,口。注意:端口,A,除了作为功能口外,只能够作为输出口使用。,在,S3C2410A,中,大多数的引脚端都是复用的,所以对于每一个引脚端都需要定义其功能。为了使用,I/O,口,首先需要定义引脚的功能。每个引脚端的功能通过端口控制寄存器(,PnCON,)来定义(配置)。与配置,I/O,口相关的寄存器包括:端口控制寄存器(,GPACON,GPHCON,)、端口数据寄存器(,GPADAT,GPHDAT,)、端口上拉寄存器(,GPBUP,GPHUP,)、杂项控制寄存器以及外部中断控制寄存器(,EXTINTN,)等。,S3C2410A,的,I/O,口配置情况请参考第,3,章如表,3.4.1,3.4.7,所列。,6,下面介绍一个通过,G,口的控制发光二极管,LED1,和,LED2,轮流闪烁,I/O,口编程实例,徐英慧,。,对,I/O,口的操作是通过对相关各个寄存器的读写实现的。要对寄存器进行读写操作,首先要对寄存器进行定义。有关,I/O,口相关寄存器的宏定义代码如下:,/Port A,控制寄存器,#definerGPACON,(*(,volatile unsigned*,),0 x56000000,),/Port A,数据寄存器,#definerGPADAT,(*(,volati1e unsigned*,),0 x56000004,),/Port B,控制寄存器,#definerGPBCON,(*(,volatile unsigned*,),0 x56000010,),/Port B,数据寄存器,#definerGPBDAT,(*(,volatile unsigned*,),0 x56000014,),/Port B,上拉电阻禁止寄存器,#definerGPBUP,(*(,volatile unsigned*,),0 x56000018,),7,/Port C,控制寄存器,#definerGPCCON,(*(,volatile unsigned*,),0 x56000020,),/Port C,数据寄存器,#definerGPCDAT,(*(,volatile unsigned*,),0 x56000024,),/Port C,上拉电阻禁止寄存器,#definerGPCUP,(*(,volatile unsigned*,),0 x56000028,),/Port D,控制寄存器,#definerGPDCON,(*(,volatile unsigned*,),0 x56000030,),/Port D,数据寄存器,#definerGPDDAT,(*(,volatile unsigned*,),0 x56000034,),/Port D,上拉电阻禁止寄存器,#definerGPDUP,(*(,volatile unsigned*,),0 x56000038,),8,/Port E,控制寄存器,#definerGPECON,(*(,volatile unsigned*,),0 x56000040,),/Port E,数据寄存器,#definerGPEDAT,(*(,volatile unsigned*,),0 x56000044,),/Port E,上拉电阻禁止寄存器,#definerGPEUP,(*(,volatile unsigned*,),0 x56000048,),/Port F,控制寄存器,#definerGPFCON,(*(,volatile unsigned*,),0 x56000050,),/Port F,数据寄存器,#definerGPFDAT,(*(,volatile unsigned*,),0 x56000054,),/Port F,上拉电阻禁止寄存器,#definerGPFUP,(*(,volatile unsigned*,),0 x56000058,),9,/Port G,控制寄存器,#definerGPGCON,(*(,volati1e unsigned*,),0 x56000060,),/Port G,数据寄存器,#definerGPGDAT,(*(,volatile unsigned*,),0 x56000064,),/Port G,上拉电阻禁止寄存器,#definerGPGUP,(*(,volatile unsigned*,),0 x56000068,),/Port H,控制寄存器,#definerGPHCON,(*(,volatile unsigned*,),0 x56000070,),/Port H,数据寄存器,#definerGPHDAT,(*(,volatile unsigned*,),0 x56000074,),/Port H,上拉电阻禁止寄存器,#definerGPHUP,(*(,volatile unsigned*,),0 x56000078,),10,要想实现对,G,口的配置,只要在地址,0 x5600 0060,中给,32,位的每一位赋值就可以了。如果,G,口的某个引脚被配置为输出引脚,在,PDATG,对应的地址位写入,1,时,该引脚输出高电平;写入,0,时该引脚输出低电平。如果该引脚被配置为功能引脚,则该引脚作为相应的功能引脚使用。,下面是实现,LED1,和,LED2,轮流闪烁的程序代码。,11,void Main,(,void,),int flag,,,i,;,Target Init,();,/,进行硬件初始化操作,,,包括对,I,O,口的初始化操作,for,(;),if,(,flag=0,),for,(,i=0,;,i 1000000,;,i+,);,/,延时,rGPGCON,rGPGCON,0 xfff0ffff|0 x00050000,;,/,配置第,8,、,第,/9,位为输出引脚,rGPGDAT,rGPGDAT,0 xeff|0 x200,;,/,第,8,位输出为低电平,/,第,9,位输出高电平,for,(,i=0,;,i 10000000,;,i+,);,/,延时,flag=1,;,12,else,for,(,i=0,;,i 1000000,;,i+,);,/,延时,rGPGCON,rGPGCON,0 xfff0ffff,(,0 x00050000,;,/,配置第,8,、,/,第,9,位为输出引脚,rGPGDAT,rGPGDAT,Oxdff|0 x100,;,/,第,8,位输出为高电平,/,第,9,位输出低电平,for,(,i=0,;,iVi,的情况时,此时,比较器的输出为低电平,使计数控制信号,C,为,0,,计数器停止计数。这时候数字输出量,D7,D0,就是与模拟电压等效的数字量。计数控制信号由高变低的负跳变也是,A/D,转换的结束信号,表示已完成一次,A/D,转换。,计数式,A/D,转换器结构简单,但转换速度较慢。,17,2,双积分式,A/D,转换器原理,双积分式,A/D,转换器对输入模拟电压和参考电压进行两次积分,将电压变换成与其成正比的时间间隔,利用时钟脉冲和计数器测出其时间间隔,完成,A/D,转换。双积分式,A/D,转换器主要包括积分器、比较器、计数器和标准电压源等部件,其电路结构图如图,5.2.2,(,a,)所示。,双积分式,A/D,转换器的转换过程如下:,首先对输入待测的模拟电压,Vi,进行固定时间的积分;,然后转换到标准电压,VR,进行固定斜率的反向积分(定值积分),如图,5.2.2,(,b,)所示。反向积分进行到一定时间,便返回起始值。从图,5.2.2,(,b,)中可看出对标准电压,VR,进行反向积分的时间,T2,正比于输入模拟电压,输入模拟电压越大,反向积分回到起始值的时间,T,越长,有,Vi,(,T2/T1,),VR,。,用标准时钟脉冲测定反向积分时间(如计数器),就可以得到对应于输入模拟电压的数字量,实现,A/D,转换。,双积分式,A/D,转换器具有很强的抗工频干扰能力,转换精度高,但速度较慢。,18,图,5.2.2,(,a,)双积分式,A/D,转换器电路结构图,双积分式,A/D,转换图,19,图,5.2.2,(,b,)积分输出波形,20,3,逐次逼近式,A/D,转换器原理,逐次逼近式,A/D,转换器电路结构如图,5.2.3,所示,其工作过程可与天平称重物类比,图中的电压比较器相当于天平,被测电压,Ux,相当于重物,基准电压,Ur,相当于电压法码。该方案具有各种规格的按,8421,编码的二进制电压法码,Ur,,根据,UxUr,,比较器有不同的输出以打开或关闭逐次逼近寄存器的各位。输出从大到小的基准电压法码,与被测电压,Ux,比较,并逐渐减小其差值,使之逼近平衡。当,Ux=Ur,时,比较器输出为零,相当于天平平衡,最后以数字显示的平衡值即为被测电压值。,逐次逼近式,A/D,转换器转换速度快,转换精度较高,对,N,位,A/D,转换只需,N,个时钟脉冲即可完成,可用于测量微秒级的过渡过程的变化,是在计算机系统中采用最多的一种,A/D,转换方法。,21,图,5.2.3,逐次逼近式,A/D,转换器电路结构,22,4,A/D,转换器的主要指标,(,1,)分辨率(,Resolution,),分辨率用来反映,A/D,转换器对输入电压微小变化的响应能力,通常用数字输出最低位(,LSB,)所对应的模拟输入的电平值表示。,n,位,A/D,转换能反应,1/2n,满量程的模拟输入电平。分辨率直接与转换器的位数有关,一般也可简单地用数字量的位数来表示分辨率,即,n,位二进制数,最低位所具有的权值,就是它的分辨率。,值得注意的是,分辨率与精度是两个不同的概念,不要把两者相混淆。即使分辨率很高,也可能由于温度漂移、线性度等原因,而使其精度不够高。,(,2,)精度(,Accuracy,),精度有绝对精度(,Absolute Accuracy,)和相对精度(,Relative Accuracy,)两种表示方法。,绝对精度:,在一个转换器中,对应于一个数字量的实际模拟输入电压和理想的模拟输入电压之差并非是一个常数。把它们之间的差的最大值,定义为,“,绝对误差,”,。通常以数字量的最小有效位(,LSB,)的分,23,数值来表示绝对精度,如,1LSB,。绝对误差包括量化精度和其他所有精度。,相对精度,是指整个转换范围内,任一数字量所对应的模拟输入量的实际值与理论值之差,用模拟电压满量程的百分比表示。,例如,满量程为,l0V,,,10,位,A/D,芯片,若其绝对精度为,1/2LSB,,则其最小有效位的量化单位为,9.77mV,,其绝对精度为,4.88mV,,其相对精度为,0.048%,。,转换时间(,Conversion Time,),转换时间是指完成一次,A/D,转换所需的时间,即由发出启动转换命令信号到转换结束信号开始有效的时间间隔。,转换时间的倒数称为转换速率。例如,AD570,的转换时间为,25us,,其转换速率为,40kHz,。,量程,量程是指所能转换的模拟输入电压范围,分单极性、双极性两种类型。,例如,单极性的量程为,0,+5V,,,0,+10V,,,0,+20V,;双极性的量程为,-5,+5V,,,-10,+l0V,。,24,5.2.2 S3C2410A,的,A,D,转换器,1,S3C2410A A/D,转换器和触摸屏接口电路,S3C2410A,包含一个,8,通道的,A/D,转换器,内部结构见图,5.2.4,,该电路可以将模拟输入信号转换成,10,位数字编码(,10,位分辨率),差分线性误差为,1.0 LSB,,积分线性误差为,2.0 LSB,。在,A/D,转换时钟频率为,2.5 MHz,时,其最大转换率为,500 KSPS,(,Kilo Samples Per Second,,千采样点每秒),输入电压范围是,0,3.3V,。,A/D,转换器支持片上操作、采样保持功能和掉电模式。,S3C2410A,的,A/D,转换器和触摸屏接口电路如图,5.2.4,所示,25,图,5.2.4 S3C2410A,的,A/D,转换器和触摸屏接口电路,26,2,与,S3C2410A A/D,转换器相关的寄存器,使用,S3C2410A,的,A/D,转换器进行模拟信号到数字信号的转换,需要配置以下相关的寄存器。,(,1,),ADC,控制寄存器(,ADCCON,),ADC,控制寄存器(,ADCCON,)是一个,16,位的可读写的寄存器,地址为,0 x5800 0000,,复位值为,0 x3FC4,。,ADCCON,位的功能描述如表,5.2.1,所列。,27,表,5.2.1 ADC,控制寄存器(,ADCCON,)的位功能,ADCCON,符号,位,描述,初始状态,ECFLG,15,A/D,转换状态标志(只读)。,0,:,A/D,转换中;,1,:,A/D,转换结束,0,PRSCEN,14,A/D,转换器前置分频器使能控制。,0,:禁止;,1,:使能,0,PRSCVL,13:6,A/D,转换器前置分频器数值设置,数值取值范围:,1,255,。,注意:当前置分频器数值为,N,时,分频数值为,N,1,。,0 xFF,SEL_MUX,5:3,模拟输入通道选择。,000,:,AIN0,;,001,:,AIN1,;,010,:,AIN2,;,011,:,AIN3,;,100,:,AIN4,;,101,:,AIN5,;,110,:,AIN6,;,111,:,AIN7,0,28,STDBM,2,备用(,Standby,)模式选择。,0,:正常模式;,1,:备用模式,1,READ_START,1,利用读操作来启动,A/D,转换。,0,:不使能读操作启动;,1,:使能读操作启动,0,ENABLE_START,0,A/D,转换通过将该位置,1,来启动,如果,READ_START,有效(,READ_START,置,1,),则该位无效。,0,:不操作;,1,:启动,A/D,转换,,A/D,转换开始后该位自动清零,0,29,(,2,),ADC,触摸屏控制寄存器(,ADCTSC,),ADC,触摸屏控制寄存器(,ADCTSC,)是一个可读写的寄存器,地址为,0 x5800 0004,,复位值为,0 x058,。,ADCTSC,的位功能描述如表,5.2.2,所列。在正常,A/D,转换时,,AUTO_PST,和,XY_PST,都置成,0,即可,其他各位与触摸屏有关,不需要进行设置。,30,表,5.2.2 ADC,控制寄存器(,ADCTSC,)的位功能,ADCTSC,符号,位,描述,初始状态,Reserved,8,保留位,0,YM_SEN,7,选择,YMON,的输出值。,0,:,YMON,输出,0,(,YM=,高阻),1,:,YMON,输出,1,(,YM=GND,),0,YP_SEN,6,选择,nYPON,的输出值。,0,:,nYPON,输出,0,(,YP=,外部电压),1,:,nYPON,输出,1,(,YP,连接到,AIN5,),1,XM_SEN,5,选择,XMON,的输出值。,0,:,XMON,输出,0,(,XM=,高阻),1,:,XMON,输出,1,(,XM=GND,),0,31,XP_SEN,4,选择,nXPON,的输出值。,0,:,nXPON,输出,0,(,XP=,外部电压),1,:,nXPON,输出,1,(,XP,连接,AIN7,),0,PULL_UP,3,上拉开关使能。,0,:,XP,上拉使能;,1,:,XP,上拉不使能,1,AUTO_P5T,2,X,位置和,Y,位置自动顺序转换。,0,:正常,ADC,转换模式,1,:自动顺序,X/Y,位置转换模式,0,XY_PST,1:0,X,位置或,Y,位置的手动测量。,00,:无操作模式;,01,:,X,位置测量,10,:,Y,位置测量;,11,:等待中断模式,0,32,(,3,),ADC,启动延时寄存器(,ADCDLY,),ADC,启动延时寄存器(,ADCDLY,)是一个可读写的寄存器,地址为,0 x5800 0008,,复位值为,0 x00FF,。,ADCDLY,的位功能描述如表,5.2.3,所列。,表,5.2.3 ADC,启动延时寄存器(,ADCDLY,)的位功能,ADCDLY,符号,位,描述,DELAY,15:0,(,1,)在正常转换模式、分开的,X/Y,位置转换模式和,X/Y,位置自动(顺序)转换模式的,X/Y,位置转换延时值。,(,2,)在等待中断模式:当在此模式按下触笔时,这个寄存器在几,ms,时间间隔内产生用于进行,X/Y,方向自动转换的中断信号(,INT_TC,)。,注意:不能使用零位值(,0 x0000,),33,(,4,),ADC,转换数据寄存器(,ADCDAT0,和,ADCDAT1,),S3C2410A,有,ADCDAT0,和,ADCDAT1,两个,ADC,转换数据寄存器。,ADCDAT0,和,ADCDAT1,为只读寄存器,地址分别为,0 x5800 000C,和,0 x5800 0010,。在触摸屏应用中,分别使用,ADCDAT0,和,ADCDAT1,保存,X,位置和,Y,位置的转换数据。对于正常的,A/D,转换,使用,ADCDAT0,来保存转换后的数据。,ADCDAT0,的位功能描述如表,5.2.4,所列,,ADCDAT1,的位功能描述如表,5.2.5,所列,除了位,9:0,为,Y,位置的转换数据值以外,其他与,ADCDAT0,类似。通过读取该寄存器的位,9:0,,可以获得转换后的数字量。,34,表,5.2.4 ADCDAT0,的位功能,ADCDATO,位名,位,描述,UPDOWN,15,在等待中断模式时,触笔的状态为上还是下。,0,:触笔为下状态;,1,:触笔为上状态,AUTO_PST,14,X,位置和,Y,位置的自动顺序转换。,0,:正常,A/D,转换;,1,:,X/Y,位置自动顺序测量,XY_PST,13:12,手动测量,X,位置或,Y,位置。,00,:无操作模式;,01,:,X,位置测量,10,:,Y,位置测量;,11,:等待中断模式,Reserved,11:10,保留,XPDATA,(正常,ADC,),9:0,X,位置的转换数据值(包括正常,A/D,转换的数据值)。取值范围:,0,3FF,35,表,5.2.5 ADCDAT1,的位功能描述,ADCDATO,位名,位,描述,15:10,与,ADCDAT0,的位功能相同,YPDATA,(正常,ADC,),9:0,Y,位置的转换数据值(包括正常,A/D,转换的数据值)。取值范围:,0,3FF,36,5.2.3 S3C2410A A,D,接口编程实例,下面介绍一个,A,D,接口编程实例,徐英慧,,其功能实现从,A/D,转换器的通道,0,获取模拟数据,并将转换后的数字量以波形的形式在,LCD,上显示。模拟输入信号的电压范围必须是,0,2.5V,。程序如下:,1,定义与,A,D,转换相关的寄存器,定义如下:,#define rADCCON,(*(,volatile unsigned*,),0 x58000000,),/ADC,控制寄存器,#define rADCTSC,(*(,volatile unsigned*,),0 x58000004,),/ADC,触摸屏控制寄存器,#define rADCDLY,(*(,volatile unsigned*,),0 x58000008,),/ADC,启动或间隔延时寄存器,#define rADCDAT0,(*(,volatile unsigned*,),0 x5800000c,),/ADC,转换数据寄存器,0,#define rADCDAT1,(*(,volati1e unsigned*,),0 x58000010,),/ADC,转换数据寄存器,37,2,对,A/D,转换器进行初始化,程序中的参数,ch,表示所选择的通道号,程序如下:,void AD_Init,(,unsigned char ch,),rADCDLY=100;/ADC,启动或间隔延时,rADCTSC=0;/,选择,ADC,模式,rADCCON=,(,114,),|,(,496,),|,(,ch3,),|,(,02,),|,(,07,),return 0;/,通道不能大于,7,for,(,i=0;i 16;i+,),/,为转换准确,转换,16,次,rADCCON|=0 x1;/,启动,A/D,转换,rADCCON=rADCCON,0 xffc7|,(,ch 4,),;/,为转换准确,除以,16,取均值,39,4.,主函数,实现将转换后的数据在,LCD,上以波形的方式显示,程序如下:,void Main,(,void,),int i,,,P,0;,unsigned short bufferLength;/,显示缓冲区,Target_Init,();,GUI_Init,();,/,图形界面初始化,Set_Color,(,GUI_BLUE,);,/,画显示背景界面,Fill_Rect,(,0,0,319,239,);,Set_Color,(,GUI_RED,);,Draw Line,(,0,119,319,119,);,Set_Font,(,GUI_Font 8x16,);,/,设定字体类型,API,Set_Color,(,GUI_WHITE,);,Set_BKColor,(,GUI_BLUE,);,/,设定背景颜色,API,Fill_Rect,(,0,0,319,3,);,40,Fill_Rect,(,0,0,3,239,);,Fill_Rect,(,316,0,319,239,);,Fill_Rect,(,0,236,319,239,);,Disp_String,(,“,ADC DEMO,”,,(,320,8*8,),2,30,);,for,(,i,0,;,i Length,;,i+,),buffer,i,0,;,while,(,1,),p,0,;,for,(,i,0,;,i Length,;,i+,),bufferp=Get _AD,(,0,),;/,从通道获取转换后的数据,Delay,(,20,);,p+,;,p,0,;,for,(,i,0,;,i,(,Length,;,i+,),Uart _Printf,(,“,dn,”,,,bufferp,);,41,P+,;,P,0,;,for,(,i,0,;,i,(,Length,;,i+,),buffer p,AD2Y,(,bufferp,);,P+,;,P=0,;,for,(,i,0;i,Length,;,i+,),Uart _Printf,(,量化后:,dn,,,bufferp,);,P+,;,ShowWavebuffer,(,buffer,),;/,在,LCD,上显示,A/D,转换后的波形,Delay,(,1000,);,42,
展开阅读全文