嵌入式技术应用教程基于S3C2410第八章.docx

上传人:b****5 文档编号:7648029 上传时间:2023-01-25 格式:DOCX 页数:26 大小:323.81KB
下载 相关 举报
嵌入式技术应用教程基于S3C2410第八章.docx_第1页
第1页 / 共26页
嵌入式技术应用教程基于S3C2410第八章.docx_第2页
第2页 / 共26页
嵌入式技术应用教程基于S3C2410第八章.docx_第3页
第3页 / 共26页
嵌入式技术应用教程基于S3C2410第八章.docx_第4页
第4页 / 共26页
嵌入式技术应用教程基于S3C2410第八章.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

嵌入式技术应用教程基于S3C2410第八章.docx

《嵌入式技术应用教程基于S3C2410第八章.docx》由会员分享,可在线阅读,更多相关《嵌入式技术应用教程基于S3C2410第八章.docx(26页珍藏版)》请在冰豆网上搜索。

嵌入式技术应用教程基于S3C2410第八章.docx

嵌入式技术应用教程基于S3C2410第八章

第八章UART串口

8.1概述

S3C2410A的UART(通用异步收发器)提供了三个独立的异步串行口(SIO),每个串口都可以用中断方式或DMA方式与CPU传输数据。

如果采用S3C2410A内部的系统时钟,UART的波特率可达230.4kbps。

如果用外部时钟UEXTCLK来驱动UART,那么UART还可以运行在更高的速率上。

每个UART通道都包括了收发两个16byte的FIFO(firstinfirstout)。

S3C2410A中每个UART都包括了一个波特率发生器、一个发送器、一个接收器和一个控制单元。

波特率发生器可由时钟PCLK或UEXTCLK来驱动。

收发器包括了16byte的FIFO和数据移位器。

写入到FIFO内的数据在发送前会被拷贝到发送移位器中去,然后数据由PinTxD上移出发送移位器中的数据。

从外部接收到的数据从PinRxD上移入芯片并拷贝到接收FIFO中去。

S3C2410A中UART的帧格式为1bit起始位、5~8bit数据位、可选校验位和1~2bit停止位。

UART0~UART2都支持红外收发,UART0和UART1带有流控信号nRTS0、nCTS0、nRTS1和nCTS1。

另外,S3C2410A中的UART支持收发握手协议。

图8.1为带FIFO功能的UART框图。

图8.1

8.2UART的操作

UART的操作包括数据发送、数据接收、中断产生、波特率发生、自环模式、红外模式和自动流控。

1.数据发送

发送的数据帧是可编程的,它由1bit起始位、5~8bit数据位、可选校验位和1~2bit停止位组成。

这些选择项都由寄存器ULCONn来控制。

发送器可产生break条件(停发),这个break信号迫使发送器向外发送逻辑0信号。

Break信号必须在当前数据发送完毕后才能生效。

2.数据接收

与发送类似,接收的数据帧也是可编程的,具体设置与发送的数据帧相同。

接收器可以检测溢出错误和帧错误。

overrunerror(溢出错误)为:

在上一帧数据还没有完全从FIFO或保持寄存器中取走,新的数据就覆盖了老的数据。

frameerror(帧错误为):

接收到的数据帧没有可用的停止位。

当在3个字(字长为用户定义)的时间内接收器没有接收到数据,那么就启动接收超时操作,此时在FIFO模式下,RxFIFO不为空。

3.AFC-AutoFlowControl(自动流控制)

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寄存器中,检查RxFIFO计数器的值。

如果该值小于15,用户必须将UMCONn[0]设置为“1”(激活nRTS);如果这个值大于或等于15,用户就要将UMCONn[0]设置为“0”(禁止nRTS)。

(3)重复步骤

(2)。

5.采用FIFO作为数据缓冲的Tx操作:

(1)选择发送模式(中断或DMA)。

(2)检查UMSTATn[0]的值,如果这个值为“1”(nCTS已经被激活),那么用户就要写数据到TxFIFO寄存器,准备发送数据。

6.RS-232C接口

如果要将UART连接到modem接口上(不是nullmodem),nRTS、nCTS、nDSR、nDTR、nDCD和nRI这些信号都是必须的。

在这种情况下,用户可以用软件的方式配合I/O口来控制这些信号(用I/O口来模拟上述这些信号)。

S3C2410A不支持RS-232C接口。

7.中断/DMA

每个UART都有5个状态信号:

溢出错误、帧错误、接收数据缓冲区准备好、发送缓冲区空和发送移位器空。

这些状态都在状态寄存器UTRSTATn和UERSTATn中有定义。

溢出错误和帧错误都是针对接收器而言的。

如果UCONn中的接收中断是是呢个的,那么每种错误状态都会引起中断请求。

当检测到接收错误状态中断请求,引起错误的原因可由寄存器UERSTATn中读出判断。

在接收器将接收移位器中的数据转移到FIFO中(FIFO模式),并且接收数据的数量达到了RxFIFO的触发值时,产生Rx中断(必须保证中断是使能的)。

在非FIFO模式下,接收器会将接收移位器中的数据转移到接收保持寄存器中。

在将发送FIFO中的数据转移到发送移位器中且留在发送FIFO中的数据的数量达到TxFIFO触发值时,产生Tx中断(必须保证中断是使能的)。

在非FIFO模式下,将发送保持移位寄存器中的数据转移到发送移位器中会引起Tx中断。

如果接收和发送模式选择了DMA方式,那么前面描述的中断状态将变为DMA请求方式。

表8.1说明了在FIFO模式和非FIFO模式下中断的具体操作。

表8.1

类型

FIFO模式

非FIFO模式

Rx中断

无论何时接收数据量达到了RxFIFO的触发值,中断都会产生。

当FIFO中的数据个数没有达到RxFIFO的触发值并且在3个字长的时间内没有收到任何数据(接收超时),中断都会发生。

这3个字长是由字长设置bit来进行配置的。

当接收缓存满了以后,中断发生。

Tx中断

当发送的数据量达到发送FIFO的触发值时,中断发生。

当发送缓存为空时,中断发生。

错误中断

检测到帧错误时,中断发生。

当接收的数据已经将接收FIFO填满而不取走数据时(溢出),中断发生。

所有错误都产生中断,但只有一个中断产生。

8.UART错误状态FIFO

UART除了RxFIFO外还有错误状态FIFO。

这个FIFO说明了FIFO中接收到的数据有错误。

当要试图去读取发生错误的数据时,错误中断产生。

为了清零错误状态FIFO,必须去读取UERSTATn和带有错误的URXHn寄存器。

例如:

如果UART的RxFIFO顺序收到了字符A、B、C和D,在收到B时出现了帧错误。

实际上UART接收错误不会产生任何中断,因为错误的数据还没有被读出。

当试图去读取这个错误数据时,中断才会发生。

9.波特率发生器

波特率发生器为收发操作提供时钟驱动。

波特率发生器的时钟源可以是S3C2410A中的系统时钟或UEXTCLK。

由UCONn寄存器来设置时钟源选择。

波特率发生器的时钟计算是由寄存器UBRDIVn来确定的,计算公式为:

UBRDIVn的值在1~216-1之间,(int)为下取整

为了对UART进行更为精确地操作,S3C2410A还支持采用外部UEXTCLK时钟源来代替芯片的系统时钟源。

如果S3C2410A采用了UEXTCLK(UEXTCLK由外部UART设备或系统提供),则UART的串行时钟将和UEXTCLK同步。

这样用户可以更为精准对进行UART操作。

此时寄存器UBRDIVn的值为:

UBRDIVn的值在1~216-1之间且UEXTCLK的频率要小于PCLK的频率

波特率计算举例:

取波特率为115200bps,PCLK=UEXTCLK=40MHz,则

10.波特率计算精度

UART的帧错误率应小于1.87%。

其中tUPCLK为实际的UART时钟,tUEXACT为理想的UART时钟。

注意:

①1Frame=startbit+databit+paritybit+stopbit

②实际上,S3C2410A的波特率可以支持到921.6kbps。

例如,在UARTerror=1.69%,PCLK=60MHz的条件下,S3C2410A的UART波特率可达921.6kbps。

11.Loopback模式

Loopback模式是一种自环检测模式,即将TXD和RXD在S3C2410A的内部直接连接起来实现检测功能。

设置UCONn中的loopbackbit来启动这项功能。

12.Infra-Red(IR)模式

S3C2410A的UART支持红外模式。

在UCONn中设置Infra-red-modebit来开启这项功能。

在IR发送模式下,发送时钟脉冲的宽度为正常UART帧数据宽度的3/16,且这个正常的UART帧数据是发送“0”时的数据宽度。

在IR接收模式下,接收器必须检测3/16的脉冲周期以便可以辨识出一个“0”。

如图8.3、8.4和8.5所示。

图8.3正常模式下帧时序

图8.4IR发送模式下帧时序

图8.5IR接收模式下帧时序

8.3UART寄存器描述

1.UARTLINECONTROLREGISTER(ULCON)

ULCON包括了ULCON0~ULCON2三个寄存器,分别对应UART0~UART2。

ULCONn

Bit

功能

复位值

Reserved(保留)

[7]

0

红外模式

[6]

0=正常操作模式;1=红外操作模式

0

校验模式

[5:

3]

0xx=无校验位;100=奇校验;101=偶校验

110=强制校验位“1”;111=强制校验位“0”

000

停止位个数

[2]

0=每帧1bit停止位;1=,每帧2bit停止位

0

字长

[1:

0]

00=5bit;01=6bit;10=7bit;11=8bit

00

2.UARTCONTROLREGISTER(UCON)

UCON包括了三个寄存器UCON0~UCON2。

UCONn

Bit

功能

复位值

时钟选择

[10]

0=PCLK;1=UEXTCLK(@GPH8)

0

Tx中断类型

[9]

0=脉冲(在非FIFO模式下,Tx缓冲区为空时,中断发生;在FIFO模式下,达到TxFIFO触发值时,中断发生)

1=电平(在非FIFO模式下,Tx缓冲区为空时,中断发生;在FIFO模式下,达到TxFIFO触发值时,中断发生)

0

Rx中断类型

[8]

0=脉冲(在非FIFO模式下,只要Rx缓冲区收到数据,中断就发生;在FIFO模式下,达到RxFIFO触发值时,中断发生)

1=电平(在非FIFO模式下,只要Rx缓冲区收到数据,中断就发生;在FIFO模式下,达到RxFIFO触发值时,中断发生)

0

接收超时使能

[7]

当UARTFIFO使能时,使能或禁止接收超时中断。

0=禁止;1=使能

0

接收错误状态中断使能

[6]

0=不产生接收错误状态中断

1=产生接收错误状态中断

0

自环模式

[5]

0=正常模式;1=自环模式

0

保留

[4]

0

发送模式

[3:

2]

00=禁止;01=中断或查询

10=DMA0(UART0)/DMA3(UART2)

11=DMA1(UART1)

00

接收模式

[1:

0]

00=禁止;01=中断或查询

10=DMA0(UART0)/DMA3(UART2)

11=DMA1(UART1)

00

3.UARTFIFOCONTROLREGISTER(UFCON)

UFCON包括了三个寄存器UFCON0~UFCON2。

UFCONn

Bit

功能

复位值

TxFIFO触发值

[7:

6]

00=空;01=4byte;10=8byte;11=16byte

00

RxFIFO触发值

[5:

4]

00=4byte;01=8byte;10=12byte;11=16byte

00

保留

[3]

0

TxFIFO复位

[2]

复位FIFO后自动清零。

0=正常;1=TxFIFO复位

0

RxFIFO复位

[1]

复位FIFO后自动清零。

0=正常;1=RxFIFO复位

0

FIFO使能

[0]

0=禁止;1=使能

0

4.UARTMODEMCONTROLREGISTER(UMCON)

UMCON包括了两个寄存器UMCON0和UMCON1。

UMCONn

Bit

功能

复位值

保留

[7:

5]

这两位必须为0

00

AFC

[4]

0=禁止;1=使能

0

保留

[3:

1]

这两位必须为0

00

RTS

[0]

如果AFC使能,则这位被忽略。

这种情况下,S3C2410A将自动控制nRTS。

如果AFC被禁止,nRTS由软件来控制。

0=高电平(nRTS无效);1=低电平(nRTS有效)

0

5.UARTTX/RXSTATUSREGISTER(UTRSTAT)

UTRSTAT包括了三个寄存器UTRSTAT0~UTRSTAT2。

UTRSTATn

Bit

功能

复位值

发送器空

[2]

在发送缓存寄存器没有可用数据发送并且发送移位器也为空时,该位自动置“1”。

0=不为空;1=发送器空(发送缓冲和移位器空)

1

发送缓存空

[1]

当发送缓存为空时,该位自动置“1”。

0=缓存不为空

1=空(在非FIFO模式下,直接产生中断或DMA请求;在FIFO模式下,当TxFIFO触发值为00时,产生中断或DMA请求)

如果UART采用FIFO模式,用户要检查在寄存器UFSTAT中的TxFIFO计数器bit和TxFIFOFullbit,而不是该bit位。

1

接收缓存准备好

[0]

当接收缓存内有可用数据时,该位自动设置为“1”。

0=空

1=缓存已经收到数据(在非FIFO模式下,直接产生中断或DMA请求)

如果UART采用FIFO模式,用户要检查在寄存器UFSTAT中的RxFIFO计数器bit和RxFIFOFullbit,而不是该bit位。

0

6.UARTERRORSTATUSREGISTER(UERSTAT)

UERSTAT包括了三个寄存器UERSTAT0~UERSTAT2。

UERSTATn

Bit

功能

复位值

保留

[3]

0=接收过程中无帧错误;1=存在帧错误(产生中断)

0

帧错误

[2]

当在接收过程中产生帧错误时,该位自动置“1”。

0=接收过程中无帧错误;1=存在帧错误(产生中断)

0

保留

[1]

0=接收过程中无帧错误;1=存在帧错误(产生中断)

0

溢出错误

[0]

当在接收过程中出现溢出错误,该位自动置“1”。

0=接收过程中无溢出错误;1=溢出(发生中断)

0

注意:

当进行读取UART错误状态寄存器时,UERSTATn[3:

0]自动被清零。

7.UARTFIFOSTATUSREGISTER(UFSTAT)

UFSTAT包括三个寄存器UFSTAT0~UFSTAT2。

UFSTATn

Bit

功能

复位值

保留

[15:

10]

0

TxFIFO满

[9]

在发送操作过程中当发送FIFO满以后自动置“1”。

0=0byte≤TxFIFO数据量≤15byte;1=满

0

RxFIFO满

[8]

在接收操作过程中当接收FIFO满以后自动置“1”。

0=0byte≤RxFIFO数据量≤15byte;1=满

0

TxFIFO计数

[7:

4]

TxFIFO中的数据个数

0

RxFIFO计数

[3:

0]

RxFIFO中的数据个数

0

8.UARTMODEMSTATUSREGISTER(UMSTAT)

UMSTAT包括了两个寄存器UMSTAT0和UMSTAT1。

UMSTATn

Bit

功能

复位值

DeltaCTS

[4]

说明输入给S3C2410A的nCTS信号是否发生变化(从上一次变化开始算起)

0=没有变化;1=有变化

0

保留

[3:

1]

0

清除发送

[0]

0=nCTS信号无效(高电平);1=nCTS信号有效(低电平)

0

9.UARTTRANSMITBUFFERREGISTER(HOLDINGREGISTER&FIFOREGISTER)

UTXH包括了三个寄存器UTXH0~UTXH2。

UTXHn

Bit

功能

复位值

TXDATAn(发送的数据)

[7:

0]

UARTn要发送的数据

-

10.UARTRECEIVEBUFFERREGISTER(HOLDINGREGISTER&FIFOREGISTER)

URXH包括了三个寄存器URXH0~URXH2。

URXHn

Bit

功能

复位值

RXDATAn(发送的数据)

[7:

0]

UARTn接收到的数据

-

11.UARTBAUDRATEDIVISORREGISTER(UBRDIV)

UBRDIV包括了三个寄存器UBRDIV0~UBRDIV2。

UBRDIVn

Bit

功能

复位值

UBRDIV

[15:

0]

波特率分频值UBRDIVn>0

-

8.4程序分析

文件Uart_driver.h定义了一些相关于UART的操作函数,这些函数在文件Uart_driver.c被实现。

Uart_driver.h程序:

voidUart_Init(intpclk,intbaud);

charUart_Getch(void);

charUart_GetKey(void);

voidUart_GetString(char*string);

voidUart_SendByte(intdata);

voidUart_SendString(char*pt);

voidUart_Printf(char*fmt,...);

voidUart_Select(intch);

Uart_driver.c程序分析:

1.voidUart_Init(intpclk,intbaud);

//UART初始化函数

voidUart_Init(intpclk,intbaud)

{

inti;

if(pclk==0)

pclk=PCLK;

rUFCON0=0x0;//UARTchannel0FIFOcontrolregister,FIFOdisable

rUFCON1=0x0;//UARTchannel1FIFOcontrolregister,FIFOdisable

rUFCON2=0x0;//UARTchannel2FIFOcontrolregister,FIFOdisable

rUMCON0=0x0;//UARTchaneel0MODEMcontrolregister,AFCdisable

rUMCON1=0x0;//UARTchaneel1MODEMcontrolregister,AFCdisable

//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;i<100;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;i<100;i++);为延时程序。

2.voidUart_Select(intch)

这个函数的功能是选择串口通道。

S3C2410A共有三个UART。

voidUart_Select(intch)

{

whichUart=ch;

}

3.voidUart_TxEmpty(intch)

voidUart_TxEmpty(intch)

{

if(ch==0)

while(!

(rUTRSTAT0&0x4));//Waituntiltxshifterisempty.

elseif(ch==1)

while(!

(rUTRSTAT1&0x4));//Waituntiltxshifterisempty.

elseif(ch==2)

while(!

(rUTRSTAT2&0x4));//Waituntiltxshifterisempty.

}

ch为UART的通道标号,即whichUart。

这个程序分别判断了UART0~UART2的发送器(发送缓存和移位寄存器)是否为空,如果不为空,那么程序处于等待状态。

具体是依靠判断寄存器UTRSTATn的第三位的值来确认发送器是否为空。

如果UTRSTATn[2]=1b,那么发送器为空。

4.charUart_Getch(void)

charUart_Getch(void)

{

if(whichUart==0)

{

while(!

(rUTRSTAT0

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 中医中药

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1