嵌入式技术应用教程——基于S3C2410第八章.doc_第1页
嵌入式技术应用教程——基于S3C2410第八章.doc_第2页
嵌入式技术应用教程——基于S3C2410第八章.doc_第3页
嵌入式技术应用教程——基于S3C2410第八章.doc_第4页
嵌入式技术应用教程——基于S3C2410第八章.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

第八章 UART串口8.1 概述S3C2410A的UART(通用异步收发器)提供了三个独立的异步串行口(SIO),每个串口都可以用中断方式或DMA方式与CPU传输数据。如果采用S3C2410A内部的系统时钟,UART的波特率可达230.4kbps。如果用外部时钟UEXTCLK来驱动UART,那么UART还可以运行在更高的速率上。每个UART通道都包括了收发两个16byte的FIFO(first in first out)。S3C2410A中每个UART都包括了一个波特率发生器、一个发送器、一个接收器和一个控制单元。波特率发生器可由时钟PCLK或UEXTCLK来驱动。收发器包括了16byte的FIFO和数据移位器。写入到FIFO内的数据在发送前会被拷贝到发送移位器中去,然后数据由Pin TxD上移出发送移位器中的数据。从外部接收到的数据从Pin RxD上移入芯片并拷贝到接收FIFO中去。S3C2410A中UART的帧格式为1bit起始位、58bit数据位、可选校验位和12bit停止位。UART0UART2都支持红外收发,UART0和UART1带有流控信号nRTS0、nCTS0、nRTS1和nCTS1。另外,S3C2410A中的UART支持收发握手协议。图8.1为带FIFO功能的UART框图。图8.18.2 UART的操作UART的操作包括数据发送、数据接收、中断产生、波特率发生、自环模式、红外模式和自动流控。1. 数据发送发送的数据帧是可编程的,它由1bit起始位、58bit数据位、可选校验位和12bit停止位组成。这些选择项都由寄存器ULCONn来控制。发送器可产生break条件(停发),这个break信号迫使发送器向外发送逻辑0信号。Break信号必须在当前数据发送完毕后才能生效。2. 数据接收与发送类似,接收的数据帧也是可编程的,具体设置与发送的数据帧相同。接收器可以检测溢出错误和帧错误。overrun error(溢出错误)为:在上一帧数据还没有完全从FIFO或保持寄存器中取走,新的数据就覆盖了老的数据。frame error(帧错误为):接收到的数据帧没有可用的停止位。当在3个字(字长为用户定义)的时间内接收器没有接收到数据,那么就启动接收超时操作,此时在FIFO模式下,Rx FIFO不为空。3. AFC-Auto Flow Control(自动流控制)S3C2410A中的UART0和UART1支持自动流控。自动流控必须采用nRTS和nCTS两个信号。采用流控后,可以将这两个UART与外部UART相连接。如果用户要将UART与一个Modem(调制解调器)相连接,那么在UMCONn寄存器中禁止自动流控并且用软件方式控制nRTS信号。在AFC模式下,nRTS信号在接收器上起作用,nCTS在发送器上起作用。当nCTS信号被激活时,UART发送器发送FIFO中的数据(nCTS激活意味着其他UART设备已经准备好接收数据了)。在UART接收数据之前,当接收FIFO内有至少2byte空间时,nRTS信号被激活;当接收FIFO内的空间少于1byte时,nRTS信号无效(nRTS激活意味着自己的UART接收FIFO准备好接收数据了)。图8.2为采用流控的连接示意图。注意:UART2不支持AFC功能。图8.2如果没有自动流控,可以靠软件控制nRTS和nCTS来完成数据传输操作。4. 采用FIFO作为数据缓冲的Rx操作:(1)选择接收模式(中断或DMA)。(2) 在UFSTATn寄存器中,检查Rx FIFO计数器的值。如果该值小于15,用户必须将UMCONn0设置为“1”(激活nRTS);如果这个值大于或等于15,用户就要将UMCONn0设置为“0”(禁止nRTS)。(3)重复步骤(2)。5. 采用FIFO作为数据缓冲的Tx操作:(1)选择发送模式(中断或DMA)。(2)检查UMSTATn0的值,如果这个值为“1”(nCTS已经被激活),那么用户就要写数据到Tx FIFO寄存器,准备发送数据。6. RS-232C接口如果要将UART连接到modem接口上(不是null modem),nRTS、nCTS、nDSR、nDTR、nDCD和nRI这些信号都是必须的。在这种情况下,用户可以用软件的方式配合I/O口来控制这些信号(用I/O口来模拟上述这些信号)。S3C2410A不支持RS-232C接口。7. 中断/DMA每个UART都有5个状态信号:溢出错误、帧错误、接收数据缓冲区准备好、发送缓冲区空和发送移位器空。这些状态都在状态寄存器UTRSTATn和UERSTATn中有定义。溢出错误和帧错误都是针对接收器而言的。如果UCONn中的接收中断是是呢个的,那么每种错误状态都会引起中断请求。当检测到接收错误状态中断请求,引起错误的原因可由寄存器UERSTATn中读出判断。在接收器将接收移位器中的数据转移到FIFO中(FIFO模式),并且接收数据的数量达到了Rx FIFO的触发值时,产生Rx中断(必须保证中断是使能的)。在非FIFO模式下,接收器会将接收移位器中的数据转移到接收保持寄存器中。在将发送FIFO中的数据转移到发送移位器中且留在发送FIFO中的数据的数量达到Tx FIFO触发值时,产生Tx中断(必须保证中断是使能的)。在非FIFO模式下,将发送保持移位寄存器中的数据转移到发送移位器中会引起Tx中断。如果接收和发送模式选择了DMA方式,那么前面描述的中断状态将变为DMA请求方式。表8.1说明了在FIFO模式和非FIFO模式下中断的具体操作。表8. 1类型FIFO模式非FIFO模式Rx中断无论何时接收数据量达到了Rx FIFO的触发值,中断都会产生。当FIFO中的数据个数没有达到Rx FIFO的触发值并且在3个字长的时间内没有收到任何数据(接收超时),中断都会发生。这3个字长是由字长设置bit来进行配置的。当接收缓存满了以后,中断发生。Tx中断当发送的数据量达到发送FIFO的触发值时,中断发生。当发送缓存为空时,中断发生。错误中断检测到帧错误时,中断发生。当接收的数据已经将接收FIFO填满而不取走数据时(溢出),中断发生。所有错误都产生中断,但只有一个中断产生。8. UART错误状态FIFOUART除了Rx FIFO外还有错误状态FIFO。这个FIFO说明了FIFO中接收到的数据有错误。当要试图去读取发生错误的数据时,错误中断产生。为了清零错误状态FIFO,必须去读取UERSTATn和带有错误的URXHn寄存器。例如:如果UART的Rx FIFO顺序收到了字符A、B、C和D,在收到B时出现了帧错误。实际上UART接收错误不会产生任何中断,因为错误的数据还没有被读出。当试图去读取这个错误数据时,中断才会发生。9. 波特率发生器波特率发生器为收发操作提供时钟驱动。波特率发生器的时钟源可以是S3C2410A中的系统时钟或UEXTCLK。由UCONn寄存器来设置时钟源选择。波特率发生器的时钟计算是由寄存器UBRDIVn来确定的,计算公式为:UBRDIVn=intPCLKBaudrate16-1UBRDIVn的值在1216 -1之间,(int)为下取整为了对UART进行更为精确地操作,S3C2410A还支持采用外部UEXTCLK时钟源来代替芯片的系统时钟源。如果S3C2410A采用了UEXTCLK(UEXTCLK由外部UART设备或系统提供),则UART的串行时钟将和UEXTCLK同步。这样用户可以更为精准对进行UART操作。此时寄存器UBRDIVn的值为:UBRDIVn=intUEXTCLKBaudrate16-1UBRDIVn的值在1216-1之间且UEXTCLK的频率要小于PCLK的频率波特率计算举例:取波特率为115200bps,PCLK=UEXTCLK=40MHz,则UBRDIVn=int4000000011520016-1UBRDIVn=int21.7-1UBRDIVn=21-1UBRDIVn=2010. 波特率计算精度UART的帧错误率应小于1.87%。tUPCLK=(UBRDIVn+1)161FramePCLKtUEXACT=1FrameBaudrateUART error=tUPCLK-tUEXACTtUEXACT100%其中tUPCLK为实际的UART时钟,tUEXACT为理想的UART时钟。注意:1Frame=start bit+data bit+parity bit+stop bit实际上,S3C2410A的波特率可以支持到921.6kbps。例如,在UART error=1.69%,PCLK=60MHz的条件下,S3C2410A的UART波特率可达921.6kbps。11. Loopback模式Loopback模式是一种自环检测模式,即将TXD和RXD在S3C2410A的内部直接连接起来实现检测功能。设置UCONn中的loopback bit来启动这项功能。12. Infra-Red(IR)模式S3C2410A的UART支持红外模式。在UCONn中设置Infra-red-mode bit来开启这项功能。在IR发送模式下,发送时钟脉冲的宽度为正常UART帧数据宽度的3/16,且这个正常的UART帧数据是发送“0”时的数据宽度。在IR接收模式下,接收器必须检测3/16的脉冲周期以便可以辨识出一个“0”。如图8.3、8.4和8.5所示。图8.3 正常模式下帧时序图8.4 IR发送模式下帧时序图8.5 IR接收模式下帧时序8.3 UART寄存器描述1. UART LINE CONTROL REGISTER(ULCON)ULCON包括了ULCON0ULCON2三个寄存器,分别对应UART0UART2。ULCONnBit功能复位值Reserved(保留)70红外模式60=正常操作模式;1=红外操作模式0校验模式5:30xx=无校验位;100=奇校验;101=偶校验110=强制校验位“1”;111=强制校验位“0”000停止位个数20=每帧1bit停止位;1=,每帧2bit停止位0字长1:000=5bit;01=6bit;10=7bit;11=8bit002. UART CONTROL REGISTER(UCON)UCON包括了三个寄存器UCON0UCON2。UCONnBit功能复位值时钟选择100=PCLK;1=UEXTCLK(GPH8)0Tx中断类型90=脉冲(在非FIFO模式下,Tx缓冲区为空时,中断发生;在FIFO模式下,达到Tx FIFO触发值时,中断发生)1=电平(在非FIFO模式下,Tx缓冲区为空时,中断发生;在FIFO模式下,达到Tx FIFO触发值时,中断发生)0Rx中断类型80=脉冲(在非FIFO模式下,只要Rx缓冲区收到数据,中断就发生;在FIFO模式下,达到Rx FIFO触发值时,中断发生)1=电平(在非FIFO模式下,只要Rx缓冲区收到数据,中断就发生;在FIFO模式下,达到Rx FIFO触发值时,中断发生)0接收超时使能7当UART FIFO使能时,使能或禁止接收超时中断。0=禁止;1=使能0接收错误状态中断使能60=不产生接收错误状态中断1=产生接收错误状态中断0自环模式50=正常模式;1=自环模式0保留40发送模式3:200=禁止;01=中断或查询10=DMA0(UART0)/DMA3(UART2)11=DMA1(UART1)00接收模式1:000=禁止;01=中断或查询10=DMA0(UART0)/DMA3(UART2)11=DMA1(UART1)003. UART FIFO CONTROL REGISTER(UFCON)UFCON包括了三个寄存器UFCON0UFCON2。UFCONnBit功能复位值Tx FIFO触发值7:600=空;01=4byte;10=8byte;11=16byte00Rx FIFO触发值5:400=4byte;01=8byte;10=12byte;11=16byte00保留30Tx FIFO复位2复位FIFO后自动清零。0=正常;1=Tx FIFO 复位0Rx FIFO复位1复位FIFO后自动清零。0=正常;1=Rx FIFO 复位0FIFO使能00=禁止;1=使能04. UART MODEM CONTROL REGISTER(UMCON)UMCON包括了两个寄存器UMCON0和UMCON1。UMCONnBit功能复位值保留7:5这两位必须为000AFC40=禁止;1=使能0保留3:1这两位必须为000RTS0如果AFC使能,则这位被忽略。这种情况下,S3C2410A将自动控制nRTS。如果AFC被禁止,nRTS由软件来控制。0=高电平(nRTS无效);1=低电平(nRTS有效)05. UART TX/RX STATUS REGISTER(UTRSTAT) UTRSTAT包括了三个寄存器UTRSTAT0 UTRSTAT2。UTRSTATnBit功能复位值发送器空2在发送缓存寄存器没有可用数据发送并且发送移位器也为空时,该位自动置“1”。0=不为空;1=发送器空(发送缓冲和移位器空)1发送缓存空1当发送缓存为空时,该位自动置“1”。0=缓存不为空1=空(在非FIFO模式下,直接产生中断或DMA请求;在FIFO模式下,当Tx FIFO触发值为00时,产生中断或DMA请求)如果UART采用FIFO模式,用户要检查在寄存器UFSTAT中的Tx FIFO计数器bit和Tx FIFO Full bit,而不是该bit位。1接收缓存准备好0当接收缓存内有可用数据时,该位自动设置为“1”。0=空1=缓存已经收到数据(在非FIFO模式下,直接产生中断或DMA请求)如果UART采用FIFO模式,用户要检查在寄存器UFSTAT中的Rx FIFO计数器bit和Rx FIFO Full bit,而不是该bit位。06. UART ERROR STATUS REGISTER(UERSTAT) UERSTAT包括了三个寄存器UERSTAT0UERSTAT2。UERSTATnBit功能复位值保留30=接收过程中无帧错误;1=存在帧错误(产生中断)0帧错误2当在接收过程中产生帧错误时,该位自动置“1”。0=接收过程中无帧错误;1=存在帧错误(产生中断)0保留10=接收过程中无帧错误;1=存在帧错误(产生中断)0溢出错误0当在接收过程中出现溢出错误,该位自动置“1”。0=接收过程中无溢出错误;1=溢出(发生中断)0注意:当进行读取UART错误状态寄存器时,UERSTATn3:0自动被清零。7. UART FIFO STATUS REGISTER(UFSTAT) UFSTAT包括三个寄存器UFSTAT0UFSTAT2。UFSTATnBit功能复位值保留15:100Tx FIFO满9在发送操作过程中当发送FIFO满以后自动置“1”。0=0byteTx FIFO数据量15byte;1=满0Rx FIFO满8在接收操作过程中当接收FIFO满以后自动置“1”。0=0byteRx FIFO数据量15byte;1=满0Tx FIFO计数7:4Tx FIFO中的数据个数0Rx FIFO计数3:0Rx FIFO中的数据个数08. UART MODEM STATUS REGISTER(UMSTAT) UMSTAT包括了两个寄存器UMSTAT0和UMSTAT1。UMSTATnBit功能复位值Delta CTS4说明输入给S3C2410A的nCTS信号是否发生变化(从上一次变化开始算起)0=没有变化;1=有变化0保留3:10清除发送00=nCTS信号无效(高电平);1=nCTS信号有效(低电平)09. UART TRANSMIT BUFFER REGISTER (HOLDING REGISTER & FIFO REGISTER) UTXH包括了三个寄存器UTXH0UTXH2。UTXHnBit功能复位值TXDATAn(发送的数据)7:0UARTn要发送的数据-10. UART RECEIVE BUFFER REGISTER (HOLDING REGISTER & FIFO REGISTER) URXH包括了三个寄存器URXH0URXH2。URXHnBit功能复位值RXDATAn(发送的数据)7:0UARTn接收到的数据-11. UART BAUD RATE DIVISOR REGISTER(UBRDIV) UBRDIV包括了三个寄存器UBRDIV0UBRDIV2。UBRDIVnBit功能复位值UBRDIV15:0波特率分频值UBRDIVn0-8.4 程序分析文件Uart_driver.h定义了一些相关于UART的操作函数,这些函数在文件Uart_driver.c被实现。Uart_driver.h程序:void Uart_Init(int pclk,int baud);char Uart_Getch(void);char Uart_GetKey(void);void Uart_GetString(char *string);void Uart_SendByte(int data);void Uart_SendString(char *pt);void Uart_Printf(char *fmt,.);void Uart_Select(int ch);Uart_driver.c程序分析:1. void Uart_Init(int pclk,int baud); /UART初始化函数void Uart_Init(int pclk,int baud) int i; if(pclk = 0) pclk = PCLK; rUFCON0 = 0x0; /UART channel 0 FIFO control register, FIFO disable rUFCON1 = 0x0; /UART channel 1 FIFO control register, FIFO disable rUFCON2 = 0x0; /UART channel 2 FIFO control register, FIFO disable rUMCON0 = 0x0; /UART chaneel 0 MODEM control register, AFC disable rUMCON1 = 0x0; /UART chaneel 1 MODEM control register, AFC disable /UART0 rULCON0 = 0x3; rUCON0 = 0x245; rUBRDIV0=( (int)(pclk/16./baud+0.5) -1 );/UART1 rULCON1 = 0x3; rUCON1 = 0x245; rUBRDIV1=( (int)(pclk/16./baud) -1 ); /UART2 rULCON2 = 0x3; rUCON2 = 0x245; rUBRDIV2=( (int)(pclk/16./baud) -1 ); for(i=0;i100;i+);if(pclk = 0)pclk= PCLK; PCLK在option.h中有定义,PCLK= 202800000/4即S3C2410A的系统时钟PCLK。在TARGET.c中调用Uart_Init函数的调用值为pclk=0、baud=115200,即采用S3C2410A的系统时钟作为波特率发生器的时钟源,且波特率为115200bps。rUFCON0 = 0x0;禁止使用UART0的FIFO。rUFCON1 = 0x0;和rUFCON2 = 0x0;分别是禁止使用UART1和UART2的FIFO。rUMCON0 = 0x0;和rUMCON1 = 0x0;是禁止UART0和UART1的AFC功能。rULCON0=0x3;(0011b)即定义UART的帧格式。8bit数据位,1bit停止位,无校验位,正常模式操作。rUCON1= 0x245;(0010_0100_0101b)即定义接收和发送模式都采用中断或查询方式;正常操作不自环;产生接收错误状态中断;禁止接收超时中断;接收中断请求为脉冲式;发送中断请求为电平式;UART工作时钟选择PCLK。rUBRDIV0=( (int)(pclk/16./baud+0.5) -1 );计算波特率分频寄存器的值。至此UART0设置完毕。后面的程序中又分别对UART1和UART2进行了设置,具体参数与UART0相同。for(i=0;i100;i+);为延时程序。2. void Uart_Select(int ch)这个函数的功能是选择串口通道。S3C2410A共有三个UART。void Uart_Select(int ch) whichUart = ch;3. void Uart_TxEmpty(int ch)void Uart_TxEmpty(int ch) if(ch=0) while(!(rUTRSTAT0 & 0x4); /Wait until tx shifter is empty. else if(ch=1) while(!(rUTRSTAT1 & 0x4); /Wait until tx shifter is empty. else if(ch=2) while(!(rUTRSTAT2 & 0x4); /Wait until tx shifter is empty.ch为UART的通道标号,即whichUart。这个程序分别判断了UART0UART2的发送器(发送缓存和移位寄存器)是否为空,如果不为空,那么程序处于等待状态。具体是依靠判断寄存器UTRSTATn的第三位的值来确认发送器是否为空。如果UTRSTATn2=1b,那么发送器为空。4. char Uart_Getch(void)char Uart_Getch(void) if(whichUart=0) while(!(rUTRSTAT0 & 0x1); /Receive data ready return RdURXH0(); else if(whichUart=1) while(!(rUTRSTAT1 & 0x1); /Receive data ready return RdURXH1(); else if(whichUart=2) while(!(rUTRSTAT2 & 0x1); /Receive data ready return RdURXH2(); else return 0;从UART接口获取一个字符。程序中RdURXH0()、RdURXH1()和RdURXH2()在文件2410addr.h中有定义,分别对应三个UART接收缓存寄存器的地址(小端格式)。RdURXH0()为URXH0的地址,RdURXH1()为URXH1的地址,RdURXH2()为URXH2的地址。在程序中,检查寄存器UTRSTATn0的值,判断是否已经接收到数据(UTRSTATn0=1b即接收到了数据)。如果接收到了数据,那么返回接收缓存寄存器内的数据;如果没有收到数据,那么程序处于等待状态直到收到数据为止。此程序中whichuart为UART通道号,分别判断三个UART通道有没有收到数据。5. char Uart_GetKey(void)char Uart_GetKey(void) if(whichUart=0) if(rUTRSTAT0 & 0x1) /Receive data ready return RdURXH0(); else return 0; else if(whichUart=1) if(rUTRSTAT1 & 0x1) /Receive data ready return RdURXH1(); else return 0; else if(whichUart=2) if(rUTRSTAT2 & 0x1) /Receive data ready return RdURXH2(); else return 0; else return 0; 这个程序与Uart_Getch函数很类似,也是从UART返回一个字符,不同的是当UART没有收到数据时,不会进行等待而直接返回“0”值。这个函数是用来从UART返回一个键值。6. void Uart_GetString(char *string)void Uart_GetString(char *string) char *string2 = string; char c; while(c = Uart_Getch()!=r) if(c=b) if( (int)string2 (int)string ) Uart_Printf(b b); string-; else *string+ = c; Uart_SendByte(c); *string=0; Uart_SendByte(n);该函数的功能就是从UART返回一个一个的字符,然后组成一个字符串存储到指针变量string定义的地址空间中去。string是一个字符型指针变量,也即string定义了一个存储字符的内存空间的起始地址,这个变量和单片机中MOV 32H,A的中32H很类似。该函数还有自动回传功能,即收到字符串后自动从UART上将收到的字符串发送回上位机。改程序还可以实现退格操作。附:C语言常用的转义字符b 退格f 换页n 换行r 回车t 水平制表v 垂直制表 反斜杠? 问号字符 单引号字符 双引号字符空字符ddd 一到三位八进制xhh 一到二位十六进制7. int Uart_GetIntNum(void)int Uart_GetIntNum(void) char str30; char *string = str; int base = 10; int minus = 0; int result = 0; int lastIndex; int i; Uart_GetString(string);/接收字符串 if(string0=-) /判断数据是否是负数 minus = 1; string+;/负号后面才是数据 if(string0=0 & (string1=x | string1=X) /判断数据是否 /是十六进制数 base = 16; string += 2; /移位2位,字符串“0x”后面才是十六进制数 /strlen求出了字符串的长度 lastIndex = strlen(string) - 1; if(lastIndex0) return -1; /用h或H来表示的十六进制数 if(stringlastIndex=h | stringlastIndex=H ) base = 16; stringlastIndex = 0; lastIndex-; if(base=10) /默认数制是十进制数 result = atoi(string); /将字符串转

温馨提示

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

评论

0/150

提交评论