嵌入式技术应用教程基于S3C2410第八章.docx
- 文档编号:7648029
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:26
- 大小:323.81KB
嵌入式技术应用教程基于S3C2410第八章.docx
《嵌入式技术应用教程基于S3C2410第八章.docx》由会员分享,可在线阅读,更多相关《嵌入式技术应用教程基于S3C2410第八章.docx(26页珍藏版)》请在冰豆网上搜索。
嵌入式技术应用教程基于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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 技术 应用 教程 基于 S3C2410 第八