-
三
ARM9(S3C2440)
的串口
p>
UART
——理论知识
< br>转载自:骨
Zi
里德骄傲
概述
S3C2440A
的通用异步收发器(
UART
)配有
3
个独立异步串行
I/O
(
SIO
)端口,
每个都可以是基于中
断或基于
DMA
模式的操作。换句话说,
UART
可以通过产生
中断或
DMA
请求来进行
CPU
和
UART
之间的数据传输。
UART
通过使用系统时钟可以支持最高
115.2Kbps
的比特率。
如果是外部器件提
供
UEXTCLK
的
UART
,则
UART
可以运行在更高的速度。每个
UART
通道包含两个
的
64
字节的
FIFO
给发送和接收。
S3C2440A
的
UART
包括了可编程波特率,红
外(
IR
)发送
/
接收,插入
1
个或
2
个停止位,
5
位、
6
位、
7
位或
8
位的数据宽度以及奇偶校验。
每个
UART
包含一个波特率发生器
、
发送器、
接收器和一个控制单元,
如
图
11-1
所示。波特率发生器可以由
PCLK
、
FCLK/n
或
UEXTCLK
(外部输入时钟)时钟驱
动。
发送器和接收器包含了
64
字节
FIFO
和数据移位器。
将数据写入到
FIFO
接着在发送前
复制到发送移位器中。
随后将在发送数据引脚
(
TxDn
)移出数据。与此同时从接收数据引脚(
Rx
Dn
)移入收到的数据,接着从
移位器复制到
< br>FIFO
。
UART
操作
下述章节描述了
UART
的操作,包
括了数据发送,数据接收,中断发生,波特率
发生,环回(
Lo
opback
)模式,红外模式和自动流控制。
数据发送
可编程发送数据帧。由
1
个起始位、
5
至
8
位数据位、
1
个可选奇偶校验位以
及
1
至
2
个停止位组成,是由行控制寄存
器(
ULCONn
)指定。发送器也可以产
生单帧发送期间强制串行输出为逻辑
0
状态的断点状态。
此模块在完成发送当
前发送字后发送断点信号。在发出断点信号后,其不断发送数据到<
/p>
Tx
FIFO
(非
FIFO
模式情况下
Tx
保持寄存器)中。
< br>
数据接收
与发送类似,
p>
接收数据帧也是可编程的。
由
1
个起始位、
5
至
8
位数据位、
1
个
可选奇偶校验位以及
1
至
2
个停止位组成,
是由行控制寄存器
(
ULCONn
)
指定。
接收器能够检测出溢出(
overrun
)错误、奇偶校验错误、帧错误和断点状态,
每
个都可以设置一个错误标志。
–
溢出错误表明新数据在读出旧数据前覆盖了旧数据。
–
奇偶校验错误表明接收器检测出一个非预期奇偶校验字段。
–
帧错误表明接收到的数据没有有效的结束位。
–
断点状态表明
RxDn
的输入保持为逻辑
0
状态的时间长于单帧传输时间。
当其在
3
字时间期间
(此间隔在字宽位的设置随后)
并且在
FIFO
模式中
Rx
FIFO
为非空时不接收任何数据时
发生接收超时状态。
波特率发生
每个
UART
的波特率发生器为发送
器和接受器提供串行时钟。
波特率发生器的源
时钟可以选择
p>
S3C2440A
的
< br>内部系统时钟或
UEXTCLK
。
换句话说,
分频由设置
UCONn
的时钟选项选择。
波特
率时钟是通过
1
6
和由
UART
波特率分频寄存器
(
UBRDIVn
)
< br>指定的
16
位分频系数来分频源时钟
< br>(
PCLK
,
FCLK/n <
/p>
或
UEXTCLK
)产生的。
UBRDIVn
由下列表达式决定:
UBRDIVn
= (int)( UART
时钟
/ (
波特率
× 16) )
- 1
(
UART
时钟:
PCLK
,
FCLK/
n
或
UEXTCLK
)
当然,
UBRDIVn
应该是从
1
至(
216-1
)
,只有在使用小于
P
CLK
的
UEXTCLK
时
设置为
0
(旁路模式)
。
例如,如果波特率为
115200 bps
并且
UART
时钟为
40
MHz
,则
UBRDIVn
为:
UBRDIVn =
(int)(40000000 / (115200 x 16) ) - 1
=
(int)(21.7) - 1 [
取最接近的整数
]
= 22 - 1 = 21
UART
行控制寄存器:
该寄存器的位
6
决定是否使用红外模式,位
5
、位
4
和位
3
决定校验方式,位
2
决定停止位长度,位
1
和位
0
决定每帧的数据位数。具体如下:
ULCONn[7]
保留;
ULCONn[6]
红外线模式,
< br>0
:正常模式;
1
:红外线模式
;
ULCONn[5
:
3]
校验模式,
0xx
:无校验;
< br>100
:奇校验;
101
:偶校
验;
ULCONn[2]
停止位,
0
:一个停止位;
1
:二个停止位;
ULCONn[1
:
0]
数据位,
00
:
5
p>
位;
01
:
6
p>
位;
10
:
7
p>
位;
11
:
8
p>
位。
UART
控制寄存器
UCONn
p>
该寄存器决定
UART
的各种模式。
UCONn[10] 1
:
ULK
做波特率发生器;
0
:
PLK
做波特率发生器。
UCONn[9] 1
:
Tx
中断电平触发;
0
:
< br>Tx
中断脉冲触发。
CONn[8] 1
:
Rx<
/p>
中断电平触发;
0
:
Rx
中断脉冲触发。
UCONn[7] 1
:接收超时中断允许;
0
:接收超时中断禁止。
UCONn[6} 1
:产生接收错误中断;
0
:不产生接收错误中断。
UCONn[5] l
:发送直接传给接收方式
(loopback)
;
0
< br>:正常模式。
UCONn[4] 1
:发送间断信号;
0
:正常模式发送。
UCONn[3:2]
发送模式选择:
00
:禁止发送;
01
:中断或查询模式;
10
:
DMA0
请求
< br>(UART0 )
,
DMA3
请求
(UART2)
;
11
:
D
MAl
请求
(UART1)
。
UCONn[1
:
0]
接收模式选择。
00
:禁止接收;
01
:中断或查询模式;
10
:
DMA0
请求
UART0
,
DMA2
请求
UART2
;
11
:
D
MAl
请求
UART1
。
UART
FIFO
控制寄存器
UFCONn
UFCONn[7:6]
00
:
Tx FIFO
寄存器中有
p>
0
字节就触发中断;
01
:
Tx FIFO
p>
寄存器中有
4
字节就触发中断;
10
:
Tx
FIFO
寄存器中有
8
字节就触发中断
;
11
:
Tx FIFO
寄存器中有
p>
12
字节就触发中断。
UFCONn[5:4]
00
:
Rx FIFO
寄存器中有
p>
4
字节就触发中断;
01
:
Rx FIFO
p>
寄存器中有
8
字节就触发中断;
10
:
Rx
FIFO
寄存器中有
12
字节就触发中
断;
11
:
Rx FIFO
寄存器中有
p>
16
字节就触发中断。
UFCONn[3]
保留。
UFCONn[2] 1
:
FIFO
复位清零
Tx
FIFO
;
0
:
FIFO
复位不清零
TxFIFO
。
UFCONn[1] 1:
FIFO
复位清零
Rx FIFO
;<
/p>
0
:
F1FO
复
位不清零
RxFIFO
。
UFCONn[0] 1
:允许
FI
FO
功能;
0
:禁止
< br>FIFO
功能。
UART
MODEM
控制寄存器
UMCONn
UMCONn[7
:
5]
保留,必须全为
0
。
UMCONn[4] 1
:允许使用
AFC
模式;
0
:禁止使用
AFC
模式。
UMCONn[3]
保留,必须全为
< br>0
。
UMCONn[0]
1
:激活
rRTS
;
< br>0
:不激活
rRTS
。
发送寄存器
UTXH
和接收寄存器
URXH
这两个寄存器存放发送和接收的数据
,当然只有
1
字节
(8
位数据
)
。需要注意的
是,在
发生溢出错误时,接收的数据必须被读出来,否则会引发下次溢出错误。
发送和接收状态寄存器
UTRSTATn
UTRSTATn
发送和接收状态寄存器包括
UTRSTAT0, UTRSTAT1 and UTRSTAT2
UTRSTATn
寄存器各位定义:
UTRSTATn [2]
1=
发送器空
UTRSTATn [1]
发送缓冲器空标志
0
=
不空;
1 =
空。
UTRSTATn [0]
接收缓冲器有接收数据标志
0
=
空;
1 =
接收缓冲器有数据。
原文地址:
三
ARM9(S3C2
440)
的串口
UART
——程序实例
讲解
作者:
骨
Zi
里德
骄傲
串口通信程序编写步骤
UART
p>
通信程序可以采用查询、中断和
DMA
模式
。我们通过使用较多的中断方式
来介
UART
< br>通信程序的编写。简单做法是,
UART
通信程序的编写
参照例子程序。
选通道,通过函数
U
art_Select()
;选
UART0~UART2
;
选波特率和
波特率发生器时钟,
选波特率通过函数
Uart_Pclk_E
n(int
ch,
int
bau
d)
或
Uart_Pclk_En(int
ch,
int
baud)
来进行。
时钟选
UCLK
,
rUCON0|=0x400
;
时钟选
PCLK
,
rUCON0&=
0x3ff
。
通信协议(
rULCON0
)设定,如果正常通信,一位停
止位,
8
位数据位,无奇偶
效验:
p>
rULCON0=(0<<6)|(0<<3)|(0<<2)|(3);
通信控制字
(
rUCON0
)
设定,
如时钟选
ULK
做波特率发生器;
Tx
中断脉冲触发,
Rx
中断脉冲触发;接收超时中断允许;产生接收错误中断;正
常模式发送:
rU
CON0|=(TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(0<<6
)|(0<<5)|
(0<<4)|(1<<2)|(1)
;<
/p>
I/O
口初始化,因
为
UART
通信使用
H
口的第二功能,所以
H
口要上拉
禁
止
:
rGPHUP|=0x1ff
。
H
口
控
p>
制
寄
存
器
nRTS1,nCTS1
功
能
< br>使
能
,
rGPHCON&=0x
3c0000
,
rGPHCON|=0x2faaa
;
设中断服务函数入口地址,把中断服务函数入
口地址赋函数指针
PISR_UARTn,
注意,
接收中断服务函数入口地址和发送中断服务函数入口地址是一个,
在中断<
/p>
服务函数中根据
UTRSTATn
[1]
和
UTRSTATn
[0]
状态决定是发送中断还是接收中断。
打开总中断屏蔽和子中断屏蔽等待中断:
rINTMSK=~(BIT_UART0);
rINTSUBMSK=~(BIT_SUB_TXD0);
进入中断后,
先屏蔽发送和接收中断,
防止新来中断干扰我们的正常发
送
和
接
收
,
正
常
p>
发
送
和
接
收
结
束
后
,
清
中
断
< br>挂
起
和中
断
源
挂
起
寄
存
器
:
ClearPending(B
IT_UART0)
,
rSUBSRCPND=(BIT_SU
B_TXD0
(
发
送
< br>)
,
rSUBSRCPND=(BIT_SUB_RXD
0|BIT_SUB_ERR0)
(接收)
;
取消中断屏蔽,等下一次中断。
下面
是利用查询方式的串口通信程序(
FL2440
开发板)
#include
该程序是
PC
机通过串口工具向开发板发送
1234
这四个
数字来控制四个
LED
的亮灭
int TSmain()
{
char buf,i;
rULCON0 &=0XFFFFFF00;
rULCON0 |=0X03; //1
位起始位,
8
位数据位
rUCON0 =0x05;//0X0805; //
串口时钟
PCLK,
查询方式
东:
PCLK
为
50M
rUBRDIV0 =325;//0X1A; //
波特率
115200****325
时设置为<
/p>
9600
rGPBCON =
0x1dd7fc;//GPB5,6,8,10
设置为输出
rGPBDAT|=0x560;//4
个
< br>LED
全灭
while(1)
{
if(rUTRSTAT0
& 0X01) //
接收是否完毕
=1
结束
{
buf=rURXH0;
//
读取数据
while(!(rUTRSTAT0 &
0X04));//
是否允许发送
=1
允许
rUTXH0=buf;
if(buf=='1')//
判断接收到的是哪一个数字
i=1;
else
if(buf=='2')
i=2;
else if(buf=='3')
i=3;
else if(buf=='4')
i=4;
-
-
-
-
-
-
-
-
-
上一篇:小学语文基本预习方法
下一篇:UART(中文版的数据手册)