嵌入式应用之UART串口

目录

一、串口的介绍

1、特性

2、通信

3、组成

二、串口中相关寄存器

1、发送和接收相关寄存器

2、中断相关寄存器

(1)U0IER

(2)U0IIR

3、设置FIFO相关寄存器

4、线状态相关寄存器

(1)U0LCR

(2)U0LSR


本文以LPC2000系列微控制器的UART作为介绍

一、串口的介绍

1、特性

具有16字节接收FIFO和16字节发送FIFO

寄存器位置符合16C550工业标准

接收FIFO触发点可设置为1、4、8或14字节

内置波特率发生器

2、通信

使用UART通信需要两个引脚分别为:RxD0和TxD0,RxD0作为串行输入(接收数据),TxD0作为串行输出(发送数据)

当我们把下位机和PC机用串口连接起来时,有一个重要的东西就起到了关键性作用——232电平转换器,因为与PC机相连时,由于PC机串口是RS232电平,所以连接时需要使用RS232转换器。

一是起到电平转换作用,还有一个作用就是交叉电路(即下位机串口的TxD0引脚发送的数据要给到PC机串口的RxD0引脚,下位机串口的RxD0同理)

3、组成

二、串口中相关寄存器

1、发送和接收相关寄存器

这里的U0THR和U0RBR就是影子寄存器(上一篇中有介绍),它们是通过读/写操作予以区分的。

U0DLL是除数锁存器低字节、U0DLM是除数锁存器高字节;这两个寄存器决定波特率时钟的频率,而波特率时钟必须是波特率的16倍。所以波特率计算公式:

                        BaudRate = FPCLK / ([U0DLM,U0DLL]×16)

PS:由于U0DLL、U0DLM寄存器与U0THR和U0RBR的地址重叠,所以在访问它们时,U0LCR的除数锁存访问位(DLAB)必须为1,如果需要读或者写,则需要把除数锁存位置0

2、中断相关寄存器

(1)U0IER

 U0IER是中断使能寄存器,它可以控制UART的4个中断源。其中RBR中断使能包含2个中断,一个是接收数据可用中断(RAD),一个是接收超时中断(CTI);THRE中断使能对应发送中断(THRE);Rx线状态中断使能对应接收线状态中断(RLS)。

(2)U0IIR

U0IIR是中断标志寄存器,用于指示一个挂起中断的中断源和优先级(即知道有没有中断触发) 

中断优先级由高到低:RLS中断->RDA中断->CTI中断->THRE中断

RLS中断:读取U0RLS时清除该中断

RAD中断:当接收的有效数据到达接收FIFO设置寄存器(U0FCR)中设置的触发点时,RDA被激活。当接收FIFO中的有效数据少于触发点时,RDA复位

CTI中断:当接收FIFO中的有效数据少于设置的触发点且至少有一个字节时,如果超过接收3.5~4.5个字节所需要的时间(注意是接收这么多字节的时间)仍没有接收到数据,那将触发该中断。对接收FIFO的任何操作都会清零该中断标志;

PS:RAD就是FIFO满了就触发中断(即串口知道有东西来了需要接收),而CTI是接收FIFO没满

THRE中断当发送FIFO为空并且满足一定的条件时,该中断将被触发。在上一次发生THRE中断后,向发送FIFO中写入1个字节数据,将在延时一个字节加上一个停止位后发生THRE中断。(为了不影响后面写入FIFO的数据);如果在发送FIFO中有过两个字节以上的数据,但是现在发送FIFO为空时,将立即触发THRE中断。

3、设置FIFO相关寄存器

U0FCR  设置FIFO寄存器

第0位:使能FIFO。 

该位为1时,使能UART0的接收和发送FIFO,并且允许访问U0FCR。

该位为0时,禁止接收FIFO,此时接收缓存只有1个字节而且发送FIFO不会被关闭。


第1位:复位RxFIFO;接收FIFO复位;当该位置位时,UART0接收FIFO中的所有字节被清零并复位指针逻辑,该位会自动清零。

第2位:复位TxFIFO;发送FIFO复位。


[5:3]位:保留

[7:6]位:Rx触发点设置  00:1字节        01:4字节        10:8字节        11:14字节

4、线状态相关寄存器

(1)U0LCR

又称线状态控制寄存器:控制发送和接收数据帧格式

 字长: 控制数据长度

00:5位字符长度        01:6位字符长度        10:7位字符长度        11:8位字符长度


停止位:控制数据包包含的停止位个数

0:1个停止位        1:2个停止位


奇偶设置就是奇偶使能:控制是否进行奇偶校验

0:禁止奇偶产生和校验        1:使能奇偶产生和校验

奇偶选择:设置奇偶校验类型

00:奇数(数据位+校验位=奇数)        01:偶数        10:校验位强制为1        11:校验位强制为0


间隔:当该位为1时,输出引脚(TxD0)强制为逻辑0,可以引起通信对方产生间隔中断。

0:禁止间隔发送        1:使能间隔发送


除数锁存:因为U0DLL/U0DLM和U0RBR/U0THR的地址重叠,通过设置该位可以指定其中某个寄存器操作。

0:禁止访问除数锁存寄存器        1:使能访问除数锁存寄存器

(2)U0LSR

又称线状态寄存器,只读寄存器,反映了UART0接收和发送模块的状态信息

 RDR:决定能否从FIFO中读取数据;

0:U0RBR为空        1:U0RBR中包含有效数据,从接收FIFO中读走所有数据后,恢复为0。


OE:溢出错误标志。即当U0RBR中有新的字符来了但接收FIFO满了该位置位

0:接收缓存区没有溢出        1:接收缓存区发生溢出错误


PE:奇偶校验错误,在使能奇偶校验位之后,对所有接收的数据都进行奇偶校验,如果与U0LCR中的设置不符,将引起奇偶校验错误。

0:没有发生奇偶校验        1:发生奇偶校验错误。在读操作时使该位恢复为0


FE:帧错误标志。当接收字符的停止位为0时,产生帧错误。

0:没有发生帧错误        1:发生帧错误。读取该位时恢复为0。


BI:间隔中断标志。        0:没有发生间隔中断        1:发生间隔中断


THRE:反映U0THR(发送缓存寄存器)是否为空,也可以认为发送FIFO是否为空。

0:不为空        1:为空;对U0THR进行写操作时,该位变为0


TEMT:当发送移位寄存器和U0THR均为空时,该位置位。

0:不为空        1:为空;对U0THR写操作时,该位变为0


RXFE:如果一个带有接收错误(如帧错误、奇偶错误)的字符装入U0RBR时,该位置位

0:U0RBR中没有接收错误或U0FCR[0]为0        1:U0RBR中包含至少一个UART0 Rx错误。

举两个简单的例子

1、串口初始化

 2、收发数据

void UART0_SendByte(uint8 data)
{
    U0THR = data;        //将要发送的数据写入发送缓存寄存器中
    while((U0LSR & 0x40) == 0);    //等待数据发送完毕
}
uint8 UART0_RcvByte(void)
{
    uint8 rcv_data;    
    while((U0LSR & 0x01) == 0);    //等待接收数据
    rcv_data = U0RBR;            //读出U0RBR中的数据
    return(rcv_data);            //返回读到的数据
}

版权声明:本文为CSDN博主「要有上進心」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_62055248/article/details/122474532

目录

一、串口的介绍

1、特性

2、通信

3、组成

二、串口中相关寄存器

1、发送和接收相关寄存器

2、中断相关寄存器

(1)U0IER

(2)U0IIR

3、设置FIFO相关寄存器

4、线状态相关寄存器

(1)U0LCR

(2)U0LSR


本文以LPC2000系列微控制器的UART作为介绍

一、串口的介绍

1、特性

具有16字节接收FIFO和16字节发送FIFO

寄存器位置符合16C550工业标准

接收FIFO触发点可设置为1、4、8或14字节

内置波特率发生器

2、通信

使用UART通信需要两个引脚分别为:RxD0和TxD0,RxD0作为串行输入(接收数据),TxD0作为串行输出(发送数据)

当我们把下位机和PC机用串口连接起来时,有一个重要的东西就起到了关键性作用——232电平转换器,因为与PC机相连时,由于PC机串口是RS232电平,所以连接时需要使用RS232转换器。

一是起到电平转换作用,还有一个作用就是交叉电路(即下位机串口的TxD0引脚发送的数据要给到PC机串口的RxD0引脚,下位机串口的RxD0同理)

3、组成

二、串口中相关寄存器

1、发送和接收相关寄存器

这里的U0THR和U0RBR就是影子寄存器(上一篇中有介绍),它们是通过读/写操作予以区分的。

U0DLL是除数锁存器低字节、U0DLM是除数锁存器高字节;这两个寄存器决定波特率时钟的频率,而波特率时钟必须是波特率的16倍。所以波特率计算公式:

                        BaudRate = FPCLK / ([U0DLM,U0DLL]×16)

PS:由于U0DLL、U0DLM寄存器与U0THR和U0RBR的地址重叠,所以在访问它们时,U0LCR的除数锁存访问位(DLAB)必须为1,如果需要读或者写,则需要把除数锁存位置0

2、中断相关寄存器

(1)U0IER

 U0IER是中断使能寄存器,它可以控制UART的4个中断源。其中RBR中断使能包含2个中断,一个是接收数据可用中断(RAD),一个是接收超时中断(CTI);THRE中断使能对应发送中断(THRE);Rx线状态中断使能对应接收线状态中断(RLS)。

(2)U0IIR

U0IIR是中断标志寄存器,用于指示一个挂起中断的中断源和优先级(即知道有没有中断触发) 

中断优先级由高到低:RLS中断->RDA中断->CTI中断->THRE中断

RLS中断:读取U0RLS时清除该中断

RAD中断:当接收的有效数据到达接收FIFO设置寄存器(U0FCR)中设置的触发点时,RDA被激活。当接收FIFO中的有效数据少于触发点时,RDA复位

CTI中断:当接收FIFO中的有效数据少于设置的触发点且至少有一个字节时,如果超过接收3.5~4.5个字节所需要的时间(注意是接收这么多字节的时间)仍没有接收到数据,那将触发该中断。对接收FIFO的任何操作都会清零该中断标志;

PS:RAD就是FIFO满了就触发中断(即串口知道有东西来了需要接收),而CTI是接收FIFO没满

THRE中断当发送FIFO为空并且满足一定的条件时,该中断将被触发。在上一次发生THRE中断后,向发送FIFO中写入1个字节数据,将在延时一个字节加上一个停止位后发生THRE中断。(为了不影响后面写入FIFO的数据);如果在发送FIFO中有过两个字节以上的数据,但是现在发送FIFO为空时,将立即触发THRE中断。

3、设置FIFO相关寄存器

U0FCR  设置FIFO寄存器

第0位:使能FIFO。 

该位为1时,使能UART0的接收和发送FIFO,并且允许访问U0FCR。

该位为0时,禁止接收FIFO,此时接收缓存只有1个字节而且发送FIFO不会被关闭。


第1位:复位RxFIFO;接收FIFO复位;当该位置位时,UART0接收FIFO中的所有字节被清零并复位指针逻辑,该位会自动清零。

第2位:复位TxFIFO;发送FIFO复位。


[5:3]位:保留

[7:6]位:Rx触发点设置  00:1字节        01:4字节        10:8字节        11:14字节

4、线状态相关寄存器

(1)U0LCR

又称线状态控制寄存器:控制发送和接收数据帧格式

 字长: 控制数据长度

00:5位字符长度        01:6位字符长度        10:7位字符长度        11:8位字符长度


停止位:控制数据包包含的停止位个数

0:1个停止位        1:2个停止位


奇偶设置就是奇偶使能:控制是否进行奇偶校验

0:禁止奇偶产生和校验        1:使能奇偶产生和校验

奇偶选择:设置奇偶校验类型

00:奇数(数据位+校验位=奇数)        01:偶数        10:校验位强制为1        11:校验位强制为0


间隔:当该位为1时,输出引脚(TxD0)强制为逻辑0,可以引起通信对方产生间隔中断。

0:禁止间隔发送        1:使能间隔发送


除数锁存:因为U0DLL/U0DLM和U0RBR/U0THR的地址重叠,通过设置该位可以指定其中某个寄存器操作。

0:禁止访问除数锁存寄存器        1:使能访问除数锁存寄存器

(2)U0LSR

又称线状态寄存器,只读寄存器,反映了UART0接收和发送模块的状态信息

 RDR:决定能否从FIFO中读取数据;

0:U0RBR为空        1:U0RBR中包含有效数据,从接收FIFO中读走所有数据后,恢复为0。


OE:溢出错误标志。即当U0RBR中有新的字符来了但接收FIFO满了该位置位

0:接收缓存区没有溢出        1:接收缓存区发生溢出错误


PE:奇偶校验错误,在使能奇偶校验位之后,对所有接收的数据都进行奇偶校验,如果与U0LCR中的设置不符,将引起奇偶校验错误。

0:没有发生奇偶校验        1:发生奇偶校验错误。在读操作时使该位恢复为0


FE:帧错误标志。当接收字符的停止位为0时,产生帧错误。

0:没有发生帧错误        1:发生帧错误。读取该位时恢复为0。


BI:间隔中断标志。        0:没有发生间隔中断        1:发生间隔中断


THRE:反映U0THR(发送缓存寄存器)是否为空,也可以认为发送FIFO是否为空。

0:不为空        1:为空;对U0THR进行写操作时,该位变为0


TEMT:当发送移位寄存器和U0THR均为空时,该位置位。

0:不为空        1:为空;对U0THR写操作时,该位变为0


RXFE:如果一个带有接收错误(如帧错误、奇偶错误)的字符装入U0RBR时,该位置位

0:U0RBR中没有接收错误或U0FCR[0]为0        1:U0RBR中包含至少一个UART0 Rx错误。

举两个简单的例子

1、串口初始化

 2、收发数据

void UART0_SendByte(uint8 data)
{
    U0THR = data;        //将要发送的数据写入发送缓存寄存器中
    while((U0LSR & 0x40) == 0);    //等待数据发送完毕
}
uint8 UART0_RcvByte(void)
{
    uint8 rcv_data;    
    while((U0LSR & 0x01) == 0);    //等待接收数据
    rcv_data = U0RBR;            //读出U0RBR中的数据
    return(rcv_data);            //返回读到的数据
}

版权声明:本文为CSDN博主「要有上進心」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_62055248/article/details/122474532

生成海报
点赞 0

要有上進心

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

基于STM32F103的智能门锁系统

基于STM32F103的智能门锁系统 直接说明实现了什么效果 1 指纹解锁(基于AS608) 2 RFID解锁(基于RC522) 3 密码解锁 (基于LCD电容屏触摸控制) 4 蓝牙解锁