深刻理解UARTWord文档格式.docx
- 文档编号:22243851
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:23
- 大小:93.78KB
深刻理解UARTWord文档格式.docx
《深刻理解UARTWord文档格式.docx》由会员分享,可在线阅读,更多相关《深刻理解UARTWord文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
。
波特率发生器以PCLK或UCLK为时钟源。
发送器和接收器包含16字节FIFO寄存器和移位寄存器,当发送数据的时候,数据先写到FIFO然后拷贝到发送移位寄存器,然后从数据输出端口(TxDn)依次被移位输出。
被接收的数据也同样从接收端口(RxDn)移位输入到移位寄存器,然后拷贝到FIFO中。
异步串行口的操作
数据发送操作
数据发送帧的格式是可编程的,它包含一个开始位,5到8个数据位,一个可选的奇偶位和一个或两个停止位,这些可以通过线性控制器(ULCONn)来设置。
发送器也能够产生发送中止条件。
中止条件迫使串口输出保持在逻辑0状态,这种状态保持一个传输帧的时间长度。
通常在一帧传输数据完整地传输完之后,在通过这个全0状态将中止信号发送给对方。
中止信号发送之后,传送数据连续放到FIFO中(在不使用FIFO模式下,将被放到输出保持寄存器)。
数据接收操作
与数据发送一样,数据接收的帧也是可以编程的,它包含一个开始位,5到8个
数据,一个可选的奇偶位和一位或两位停止位,它们都是通过线性控制器(ULCONn)
来设置的。
接收器能够检测溢出错误,奇偶校验错误,帧错误和中止状况,每种情况下都将
会将一个错误标志置位。
UART异步串行口的波特率发生器
每个UART的波特率发生器为传输提供了串行移位时钟。
波特率产生器的时钟源可以从S3C2410的内部系统时钟或UCLK中来选择。
波特率由时钟源(PCLK或UCLK)16分频然后被UART波特率除数寄存器(UBRDIVn)指定的16位除数决定。
因此,UBRDIVn的值可以按照下式确定:
UBRDIVn=(int)(PCLK/(bps*16))-1,其中bps为波特率。
例如,如果波特率为115200bps且PCLK或UCLK为40MHz,则UBRDIVn为:
UBRDIVn=(int)(40000000)(115200*16))-1
=(int)(21.7)-1
=21-1=20
UART异步串行口波特率发生器的误差极限
UART传输10bit数据的时间误差应该小于1.87%(3/160)。
tUPCLK=(UBRDIVn+1)x16x10/PCLK实际的传输10bit所需时间。
tUEXACT=10/baud-rate理想情况下传输10位需要的时间。
UARTerror=(tUPCLK–tUEXACT)/tUEXACTx100%
异步串行口的相关寄存器
线路控制寄存器(ULCON)
线性控制寄存器,主要用来规定传输帧的格式。
下面表格是线控制寄存器的地址
和位定义:
寄存器
地址
读/写
描述
重置值
ULCON0
0x50000000
UART通道0线路控制寄存器
0x00
ULCON1
0x50004000
UART通道1线路控制寄存器
ULCON2
0x50008000
UART通道2线路控制寄存器
ULCONn
位
初始状态
保留
[7]
0
Infra-RedMode
[6]
决定是否用红外模式。
0=正常模式操作
1=红外Tx/Rx模式
ParityMode
[5:
3]
指定奇偶产生的类型并在UART的传输与接收操作中检查。
0xx=非奇偶
100=奇
101=偶
110=强制奇偶/选中为1
111=强制奇偶/选中为0
000
NumberofStopBit
[2]
指定多少个停止位将被使用对于帧结束信号。
0=每帧一个停止位
1=每帧两个停止位
WordLength
[1:
0]
显示每帧传输或接收的数据位的数目。
00=5位,01=6位
10=7位,11=8位
00
控制寄存器(UCON)
重置值
UCON0
0x50000004
UART通道0控制寄存器
UCON1
0x50004004
UART通道1控制寄存器
UCON2
0x50008004
UART通道2控制寄存器
UCONn
位
ClockSelection
[10]
选择PCLK或UCLK对于UART的波特率。
0=PCLK:
UBRDIVn=(int)(PCLK/(bpsx16))-1
1=UCLK(@GPH8):
UBRDIVn=(int)(UCLK/(bpsx16))-1
TxInterruptType
[9]
中断请求类型。
0=脉冲型(当Tx缓冲区在无输入输出模式下变空或当Tx在输入输出模式下的输入输出到达触发电平时,中断就被请求。
)
1=电平型(当Tx缓冲区在无输入输出模式下变空或当Tx在输入输出模式下的输入输出到达触发电平时,中断就被请求。
RxInterruptType
[8]
0=脉冲型(当Rx缓冲区在无输入输出模式下接收数据或当Rx在输入输出模式下的输入输出到达触发电平时,中断就被请求。
1=电平型(当Rx缓冲区在无输入输出模式下接收数据或当Rx在输入输出模式下的输入输出到达触发电平时,中断就被请求。
RxTimeOutEnable
当UART的输入输出被使能时,使Rx的定时中断使能/失能。
这个中断是一个接收中断。
0=失能,1=使能
RxErrorStatusInterruptEnable
使UART在一个例外上产生中断是使能的,例如一个暂停,帧出错,奇偶出错或溢出出错在一个接收操作中。
0=不产生接收出错的状态中断
1=产生接收出错的状态中断
LoopbackMode
[5]
设置回溯位为1将引起UART加入到回溯模式中。
这种模式只是为测试目的而提供的。
0=正常操作,1=回溯模式
SendBreakSignal
[4]
设置这个位将引起UART在一帧的时间内传送一个暂停。
这个位在送出暂停信号后会被自动清除。
0=正常传输,1=传送暂停信号
TransmitMode
[3:
2]
决定哪一个函数当前能够对Tx写入数据到UART传输缓冲寄存器。
00=失能
01=中断请求或轮流检测模式
10=DMA0请求(只对于UART0),DMA3请求(只对于UART2)
11=DMA1请求(只对于UART1)
ReceiveMode
决定哪一个函数当前能够读取数据从UART接收缓冲寄存器。
FIFO控制寄存器(UFCON)
UFCON0
0x50000008
UART通道0FIFO控制寄存器
0x0
UFCON1
0x50004008
UART通道1FIFO控制寄存器
UFCON2
0x50008008
UART通道2FIFO控制寄存器
UFCONn
TxFIFOTriggerLevel
[7:
6]
决定传输FIFO的触发电平。
00=空,01=4字节
10=8字节,11=12字节
RxFIFOTriggerLevel
4]
决定接收FIFO的触发电平。
00=4字节,01=8字节
10=12字节,11=16字节
[3]
TxFIFOReset
在重新设置FIFO后自动清除。
0=正常,1=TxFIFO重置
RxFIFOReset
[1]
0=正常,1=RxFIFO重置
FIFOEnable
[0]
0=失能
1=使能
MODEM控制寄存器(UMCON)
UMCON0
0x5000000C
UART通道0Modem控制寄存器
UMCON1
0x5000400C
UART通道1Modem控制寄存器
保留
0x5000800C
-
未定义
UMCONn
5]
这些位必须是0
AutoFlowControl(AFC)
1]
RequesttoSend
如果AFC位是使能的,这个值将被忽略。
在这种情况下S3C2410X将自动控制nRTS。
如果AFC位是失能的,nRTS必须由软件控制。
0=‘H’电平(不激活nRTS),1=‘L’电平(激活nRTS)
发送/接收状态寄存器(UTRSTAT)
Register
Address
R/W
Description
ResetValue
UTRSTAT0
0x50000010
R
UART通道0Tx/Rx状态寄存器
0x6
UTRSTAT1
0x50004010
UART通道1Tx/Rx状态寄存器
UTRSTAT2
0x50008010
UART通道2Tx/Rx状态寄存器
UTRSTATn
Bit
InitialState
Transmitterempty
当传输缓冲寄存器中没有有效的值传输并且传输转换寄存器中为空的时候,自动置1.
0=不为空
1=传输器(传输缓冲器&
转换寄存器)为空
1
Transmitbufferempty
当传输缓冲寄存器中没有有效的值传输时自动置1
0=缓冲寄存器不为空
1=为空
(在非FIFO模式中,中断和DMA被请求,在FIFO模式中,只有当TxFIFO的触发级被设置为00的时候,中断和DMA被请求)
如果UART使用FIFO,用户应当检查UFSTAT寄存器的TxFIFO计数位和TxFIFO满标志位代替检查该位.
Receivebufferdataready
当接受缓冲寄存器中没有有效的值传输时自动置1
0=为空
1=缓冲寄存器接受到数据(在非FIFO模式中,中断和DMA被请求)
如果UART使用FIFO,用户应当检查UFSTAT寄存器的RxFIFO计数位代替检查该位
错误状态寄存器(UERSTAT)
UERSTAT0
0x50000014
UART通道0Rx错误状态寄存器
UERSTAT1
0x50004014
UART通道1Rx错误状态寄存器
UERSTAT2
0x50008014
UART通道2Rx错误状态寄存器
UERSTATn
Reserved
0=接受中没有帧错误1=帧错误(中断请求)
FrameError
在接受操作中发生了帧错误后自动置1
.0=接受中没有帧错误
1=帧错误(中断请求)
0=接受中没有帧错误1=帧错误(中断请求)
OverrunError
在接受操作中发生了溢出错误后自动置1
0=接受中没有溢出错误
1=溢出错误(中断请求)
FIFO状态寄存器(UFSTAT)
UFSTAT0
0x50000018
UART通道0FIFO状态寄存器
UFSTAT1
0x50004018
UART通道1FIFO状态寄存器
UFSTAT2
0x50008018
UART通道2FIFO状态寄存器
UFSTATn
[15:
10]
TxFIFOFull
当传输过程中传输FIFO为满的时候自动置1
0=0-byte≤TxFIFO数据≤15-byte
1=Full
RxFIFOFull
当接收过程中接收FIFO为满的时候自动置1
0=0-byte≤RxFIFO数据≤15-byte
TxFIFOCount
TxFIFO中数据的个数
RxFIFOCount
RxFIFO中数据的个数
MODEM状态寄存器(UMSTAT)
UMSTAT0
0x5000001C
UART通道0Modem状态寄存器
UMSTAT1
0x5000401C
UART通道1Modem状态寄存器
0x5000801C
–
保留的
DeltaCTS
该位指示输入到S3C2410X的nCTS信号自从上次读后已经改变状态
0=没有被改变1=被改变
CleartoSend
0=CTS信号没有被激活(nCTSpinishigh.)
1=CTS信号被激活(nCTSpinislow.)
发送缓冲寄存器(UTXHn)
UTXH0
0x50000020(L)0x50000023(B)
W(bybyte)
UART通道0发送缓冲寄存器
UTXH1
0x50004020(L)0x50004023(B)
UART通道1发送缓冲寄存器
UTXH2
0x50008020(L)0x50008023(B)
UART通道3发送缓冲寄存器
UTXHn
TXDATAn
UARTn的传输数据
接收缓冲寄存器(URXHn)
URXH0
0x50000024(L)0x50000027(B)
R(bybyte)
UART通道0接收缓冲寄存器
URXH1
0x50004024(L)0x50004027(B)
UART通道1接收缓冲寄存器
URXH2
0x50008024(L)0x50008027(B)
UART通道2接收缓冲寄存器
URXHn
RXDATAn
UARTn接受的数据
波特率除数寄存器
UBRDIV0
0x50000028
R/W
波特率除数寄存器0
UBRDIV1
0x50004028
波特率除数寄存器1
UBRDIV2
0x50008028
波特率除数寄存器2
UBRDIVn
UBRDIV
波特率除数值
UBRDIVn>
实验内容
根据前面的原理介绍,写一个程序来测试串口的基本功能。
异步串口实验步骤
从上面的寄存器介绍可以看到,与UART有关的寄存器共有11*3(因为有3个UART通道)之多。
本实验使用UART0。
1.初始化
把使用到的的引脚GPH2、GPH3定义为TXD0、RXD0:
GPHCON|=0xa0
GPHUP|=0x0c(上拉)
ULCON0(UARTchannel0linecontrolregister):
设为0x03
此值含义为:
8个数据位,1个停止位,无校验,正常操作模式(与之相对的是Infra-RedMode,此模式表示0、1的方式比较特殊)。
UCON0(UARTchannel0controlregister):
设为0x245
除了位[3:
0],其他位都使用默认值。
位[3:
0]=0b0101表示:
发送、接收都使用“中断或查询方式”——本实验使用查询方式。
UFCON0(UARTchannel0FIFOcontrolregister):
设为0x00
每个UART内部都有一个16字节的发送FIFO和接收FIFO,但是本实验不使用FIFO,设为默认值0
UMCON0(UARTchannel0Modemcontrolregister):
本实验不使用流控,设为默认值0
UBRDIV0(R/WBaudratedivisiorregister0):
设为12
本实验未使用PLL,PCLK=12MHz,设置波特率为115200,则由公式
UBRDIVn=(int)(PCLK/(bpsx16))–1
可以计算得UBRDIV0,请使用S3C2410数据手册第314页的误差公式验算一下此波特率是否在可容忍的误差范围之内,如果不在,则需要更换另一个波特率(本实验使用的115200是符合的)。
2.发送数据
UTRSTAT0(UARTchannel0Tx/Rxstatusregister):
位[2]:
无数据发送时,自动设为1。
当我们要使用串口发送数据时,先读此位以判断是否有数据正在占用发送口。
位[1]:
发送FIFO是否为空,本实验未用此位
位[0]:
接收缓冲区是否有数据,若有,此位设为1。
本实验中,需要不断查询此位一判断是否有数据已经被接收。
UTXH0(UARTchannel0transmitbufferregister):
把要发送的数据写入此寄存器。
3.接收数据
UTRSTAT0:
如同上述“2、发送数据”所列,我们用到位[0]
URXH0(UARTchannel0receivebufferregister):
异步串口实验代码
主函数
voidMain(void)
{
inti,j;
sysinit();
//系统初始化代码,在这里不关心它
Uart_Init(0,115200);
//初始化串口,115200是波
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 深刻 理解 UART