一. 串口编程的硬件原理
l 设置串口波特率
U0LCR=0x03; //清除除数锁存位,并设置工作模式
00:表示5位字长
if(0!=set.parity)
}
/**********************************************************
² 帧错误与UART0的RBR,FIFO中读出的字符相关。当检测到一个帧错误时,新开网通传奇,Rx将尝试与数据重新同步并假设错误的停止位实际是一个超前的起始位。但即使没有出现帧错误,它也不能假设下一个接收到的字节是正确的。
l U0DLL和U0DLM都为8位寄存器。
**********************************************************/

2. 串口接收数据
* 入口参数:bps 串口波特率
void UART0_SendByte(uint8 data)
* 入口参数: data 要发送的数据
while((U0LSR&0X01)==0); //等待数据到达
² 当读取U0LSR寄存器并且UART0的FIFO中不再有错误时,haosf.com,该位置零。
4> 串口发送数据程序
l 长度:8位寄存器
uint8 UART0_RcvByte(void)
² 当检测到UART0 的THR空时,THRE置位。
U0DLM = bak>>8;
l UART0移位寄存器(U0RSR)通过引脚RxD0接收有效字符。
B. 串口初始化需要设置的寄存器
² 当U0TSR或U0THR包含有效数据时,该位清零。
² 当U0THR和U0TSR都为空时,该位置1
4. UART0和ARM7 CPU之间的通信过程
位,无奇偶校验)
{
11:校验位强制为0
注:溢出错误条件在错误发生后立即设置。对U0LSR读操作将清零第1位。当UART0的RSR已经有新的字符就绪,而UART0 RBR或FIFO已满时,第一位置1.此时的UART0 RBR或FIFO不会被覆盖,UART0 的RSR中的字符将丢失。
* 功 能: 向串口发送字节数据,并等待发送完毕。
3> 相关寄存器配置
Tiger声明:本人鄙视直接复制本人文章而不加出处的个人或团体,但不排斥别人转载tiger-john的文章,只是请您注明出处并和本人联系或留言给我。3Q
2> 串口初始化化程序
l 当UART0接收到一个有效字符后,通过读取U0RBR寄存器可以将FIFO中最早接收到的字节读出,当FIFO中不再包含有效数据时,该寄存器反映接收到的最后一个有效字节数据。接收的数据不足8位时,高位用0填充。
建立个文件index.shtml,代码如下:

* 时 间:2011年1月17日
² 当检测到中断条件时,接收器立即进入空闲状态直到RXD0变为全1状态。
B.方法二:
}
置0:溢出错误状态未激活

注:
置1:U0THR和U0TSR空
1:始能访问除数锁存寄存器
}
uint8 UART0_Init(uint32 baud, UARTMODE set)
置1:U0RBR包含至少一个UART0 Rx错误。
{
(2) U0RBR(接收器缓冲寄存器)
6> 中断接口包含寄存器U0IER和U0IIR。中断接口接收UART0发送模块和接收模块发出的单时钟宽度的使能信号。
串口编程(UART0)
return(1);
/* 设置串口模式 */
/**********************************************************
U0LCR = 0x80; // DLAB位置1
* 出口参数: 无
2. UART0引脚:
1>RxD0 引脚用于UART0接受数据,接受方式为串行输入。
l 各位寄存器的含义:
bak = set.parity<<4; // 设置奇偶校验
}
1. 串口程序都有那几部分组成
4> UART0的接收模块和发送模块的状态信息保存在U0LSR中。
/**********************************************************
error.htm 代码如下
* 功能:UART0初始化(通讯波特率115200,8位数据位,1位停止
while(0 == (U0LSR & 0x40));
(2)U0LSR(线状态寄存器)
* 时间:2011年1月17日
if(2==set.stopb)
1> 用CPU通过串口发送数据时,各寄存器之间的关系
}
return(0);
* 出口参数: data 要接收的数据
if( (0==set.stopb)(set.stopb>2) )
置1:表示U0THR空
bak = 0x08;
3> UART0发送器模块接收CPU或主机写入的数据并将数据缓存到UART0 的FIFO或U0THR中,UART0发送模块中的移位寄存器(U0TSR)读取U0THR或FIFO中的数据并将数据通过串行输出到引脚TxD0发送。
置1:帧错误状态激活
置0:U0THR和或U0TSR包含有效数据。
l 作用:只读寄存器,是UART0 Rx FIFO的最高字节。它包含了最早接收到的字符,可通过总线接口读出。串口接收数据时低位在先,即U0RBR的bit0为最早接收到的数据位。如果接收到的数据小于8位,未使用的MSB填充为0.
return(0);
第2位: 表示停止位选择
0:禁止访问除数锁存寄存器
1、inetmgr 打开iis管理器
* 作者:tiger-john
C. 具体寄存器的设置
l VPB总线将缓冲寄存器(U0RBR)中的数据通过AHB-VPB桥传到AHB总线上
{
1. 串口特性:
3. UART0的结构和工作方式
* 出口参数:无**********************************************************/
置0:奇偶错误状态未激活
/* 参数过滤 */
01:表示6位字符长度
² 间隔中断与UART0的RBR或FIFO中读出的字符相关。
第[5 4]位:表示奇偶选择位
在上面已经介绍,在此步再涉及。
set.parity = set.parity-1;
l 长度:8位寄存器。
l 通过AHB-VPB桥把信息转换后发送给VPB总线。
置0:帧错误状态未激活。
* 时 间:2011年1月17日
* 名 称: UART0_SendByte
1:使能奇偶产生和校验
uint8 stopb; // 停止位,1/2

控制信息保存在U0LCR中。
l U0DLL,U0DLM(寄存器):设置UART0的通信波特率。
if( (0==baud)(baud>115200) )
置0:U0RBR中没有UART0 Rx错误,或U0FCR的bit为0.
l UART0接收模块接受来自VPB总线的数据。并将数据缓存到U0THR寄存器中。
置1:溢出错误状态激活
0:1个停止位
l 各位寄存器的含义:
* 功 能: 用查询方式接收一字节的数据
return(0);
0:禁止奇偶产生和校验
* 名 称: UART0_RcvByte
注:
l U0LCR(控制寄存器):设置UART0的通信格式。
在看腾讯的网站时候,无意看到大量shtml后缀的页面,这些是什么呢?吓得我出了一声冷汗,岁数这么大了,竟然不知道这个。马上google,呵呵,很快我的第一个shtml也出来了。
置1表示U0RBR包含有效数据
bak = 0x04; // 判断是否为2位停止位
(CPU内核通过VPB接口对UART0的寄存器进行读写访问.)
Ø 1.使用U0DLL和U0DLM配置波特率之前,必须先计算分频值,复古传奇。
4. 完整的程序事例:
Ø 2.使用U0DLL和U0DLM配置波特率之前必须把U0LCR控制寄存器的第8位置为1才能进行配置。配置完后要把U0LCR控制寄存器的第8位置位0。
D.第3位:帧错误
* 出口参数:返回值为1时表示初化成功,为0表除参数出错********************************************************/
}
2、点击web服务扩展,选择在服务器端的包含文件,点击允许。
1>16字节接收FIFO和16字节发送FIFO
* 作 者:tiger-john
U0DLL=Fdiv&0xff;
* 名 称:UART0_Init()
}
10:校验位强制为1
if( set.parity>4 )
01:偶数(数据位+校验位=偶数)
置1:间隔中断状态状态激活
/**********************************************************
² 奇偶错误检测时间取决于U0FCR的bit0。奇偶错误与UART0 的RBR,FIFO中读出的字符相关。
第7位:除数锁存访问位
U0LCR = bak;
注:
(1) U0LSR(线状态寄存器)
l 设置串口工作模式
}
2> 串口发送数据时的流程
return(0);
{
5> UART0波特率发送器模块产生UART0 发送模块所使用的定时。波特率发生器模块时钟源为VPB时钟(pclk)。主时钟与U0DLL和U0DLM寄存器所定义的除数相除得到UART0 发送器模块使用的时钟,该时钟必须为波特率的16倍。
l CPU发出信息通过AHB总线到AHB-VPB桥
用轮训方式实现接收上位机数据,并把数据再发送给上位机。
rcv_data = U0RBR; //从U0RBR中读出接收到的数据
} UARTMODE;
---------------------------------------------------------
注:奇偶选择主要是设置奇偶校验类型,1.76精品。
1:使能间隔发送
使用轮循和中断两种方式来实现串口编程。
11:表示8位字符长度
H第7位:表示Rx FIFO 错误。
l 作用:U0DLL和U0DLM寄存器一起构成一个16位除数。
(当然了,用中断实现串口编程,系统的效率较高。但是难度也较大。轮循方式效率较低,但是编程比较简单)
3>相关寄存器配置
² 间隔检测的时间取决于U0FCR的bit0.
1>CPU通过UART0发送模块发送信息给外设
看图:
² 在发送整个字符(起始位,数据,奇偶位和停止位)过程中RXD0如果都保持逻辑0,则产生间隔中断。
第[1 ,0]位: 表示字长
可执行文件:C:/WINDOWS/system32/inetsrv/ssinc.dll
B.第1位:溢出错误。

注:当U0RBR包含未读的字符时,第0位被置位;当UART0的U0RBR或FIFO为空时,第0位置零。
(1)U0THR(发送保持寄存器)
l 循环检测U0RBR是否有未读取的数据。
}
U0THR = data;
U0DLL = bak&0xff;
本文章针对的是ARM2200环境下编写串口程序,其中设计轮循方式,中断方式,以及在UC/OS-II操作系统下的串口编程。
2>外设通过UART0接收模块向ARM7 CPU发送信息
0:禁止间隔发送
Fdiv=Fpclk/(16*baud)
* set 模式设置(UARTMODE数据结构)
F.第五位:发送保持寄存器空
G.第6位:表示发送器空

00:奇数(数据位+校验位=奇数)
**********************************************************/
(2) U0DLL,U0DLM(除数锁存寄存器)
PINSEL0=0x00000005; //设置串口引脚
² 当接收字符的奇偶位处于错误状态时产生一个奇偶错误。对U0LSR读操作清零该位。
2>接收FIFO触发点可设置为1,4,8或14字节。
---------------------------------------------------------
{ uint8 datab; // 字长度,5/6/7/8
A方法一:
² 当接收字符的停止位为0时,产生帧错误。对读操作U0LSR清零该位。
/* 定义串口模式设置数据结构 */
l 长度:8位寄存器。