在本教程中,我将向您展示如何配置LPC1768中的UART。UART用于串行通信,是LPC1768单片机常用的外围设备之一,主要用于与计算机通信,发送调试信息,接收命令等。我将解释与UART相关的所有寄存器,以及我们如何操作这些寄存器,以便使用UART执行串行通信。
重要提示:我已经在以前的教程中提到了这一点,但我将在每一个LPC1768教程中重复它。伟德老虎机手机版从NXP官方网站下载LPC1768单片机的数据表和用户手册。我无法详细地解释/讨论每一个话题。您必须在这些文档中查找讨论的主题并收集额外的信息。
简介
UART是通用异步接收/发送器的缩写。它是一种串行通信,通常在微控制器和计算机之间。UART是一种全双工通信,因此在通信设备之间需要两条线。它们被称为TX和RX。
UART中的“A”代表异步。这意味着通信设备之间没有时钟信号(与I2C和SPI相反,它们也是串行通信,但使用时钟信号来同步数据)。
还有一件重要的事要知道UART通信是数据传输的方式。在UART中,数据以“包”或“帧”的形式传输。典型的UART数据包的结构如下所示。
在一帧的开始,有一个开始位,它是' 0 ',它告诉接收器关于即将被传输的数据。
起始位后面是要传输的实际数据。它的长度可以是5位到8位之间的任何位置。在数据之后,有一个奇偶校验位,它可以用于错误检查。这个位是可选的。
最后,为了表示当前数据传输的结束,有停止位,它通常是长度为1或2位宽的“1”。要传输下一组数据,重复这个过程。
UART在LPC1768
在LPC1768单片机中实现UART,它由四个UART外设组成。
- UART0
- UART1
- UART2
- UART3
UART0, UART2和UART3与基本的UART功能相同,而UART1增加了完全的调制解调器控制握手支持。此外,UART1还支持RS-485。UART0用于系统内编程。复位后UART0和UART1都启用。
与UART关联的引脚
由于UART需要两个引脚进行通信,即TXD和RXD,下表描述了映射到所有UART外设的引脚。注意,一些UART引脚被映射到多个引脚。
UART |
引脚映射到TXD | 引脚映射到RXD |
UART0 |
P0.2 | P0.3 |
UART1 |
P0.15 / P2.0 | P0.16 / P2.1 |
UART2 | P0.10 / P2.8 | P0.11 / P2.9 |
UART3 | P0.0 / p0.25 / p4.28 | P0.1 / p0.26 / p4.29 |
注意:对于UART1,还有其他与硬件流控制相关的引脚。
LPC1768的UART架构
下图显示了LPC1768中的UART外围设备的框图。发送和接收块都包含16字节的fifo,分别保存传出和传入数据。
在传输数据时,将要传输的数据写入THR寄存器。然后将该数据缓冲到TX FIFO中。然后,一个移位寄存器从缓冲区读取数据,并通过相应的TXD Pin传输。
来接收数据,有效的数据被接收块中的移位寄存器捕获,并被传输到RX FIFO。最后,数据保存在RBR寄存器中,供处理器访问。
LPC1768 UART寄存器
UART0, UART2和UART3有14个寄存器分别用于UART数据,中断,状态和控制。UART1总共有18个寄存器。我来解释一下UART0/2/3的一些重要寄存器。
注意:我将使用参考手册中的命名法来解释UART寄存器。例如,当我说UxRBR时,它代表UART0, UART2或UART3的接收缓冲区寄存器,即x = 0或2或3。
FIFO控制寄存器:控制UARTx RX和UARTx TX FIFO操作。
位0 |
FIFO实现 | 当为0时,关闭fifo。当为1时,RX和TX fifo都被启用。 |
位1 |
RX FIFO重置 | 当1时,RX FIFO将被清除并复位。 |
位2 | TX FIFO重置 | 当1时,TX FIFO将被清除并复位。 |
位[6] | RX触发电平 | 用于确定在中断或DMA请求被激活之前必须写入多少RX FIFO字符。 |
线路控制寄存器:确定传输中使用的数据格式。
位(1:0) |
单词长度选择 | 当[00]时,5位字符长度。类似地,[01]、[10]和[11]分别表示6,7和8位的字符长度。 |
位2 |
停止位选择 | 当0,1个停止位,当1,2个停止位。 |
位3 | 奇偶性使 | 当0时,奇偶校验被禁用。当为1时,启用。 |
位[25:4] |
奇偶性选择 | 当[00],奇偶校验。类似地,对于[01],[10]和[11],偶数奇偶校验,强制“1”的奇偶校验和强制“0”的奇偶校验。 |
位6 | 中断控制 | 0时,禁用断路传输。1,使能。 |
位7 | 除数锁存存取位(DLAB) | 当为0时,禁用对除数锁存器的访问。 |
线路状态寄存器:提供RX和TX块的状态。
读取UxLSR后,位1到4将被清除。
位0 |
接收数据就绪(RDR) | 当0时,UxRBR为空。当值为1时,UxRBR包含有效数据。 |
位1 | 溢出错误(OE) | 超过运行是当RSR(接收机移位寄存器)有一个新的字符组装,但RBR FIFO是满的条件。在这种情况下,RBR FIFO不会被覆盖,UARTx RSR中的字符将丢失。当1,溢出已经发生。 |
位2 |
奇偶校验错误(PE) | 当为1时,奇偶校验错误。当接收字符中的奇偶校验位处于错误状态时,就会发生奇偶校验错误。 |
位3 | 框架误差(铁) | 当1时,发生帧错误。当接收字符的停止位为0时发生帧错误。 |
位4 |
打破中断 | 当1时,中断中断已经发生。 |
位5 | 传输保持寄存器为空(THRE) | 当0时,UxTHR包含有效数据。当1时,UxTHR为空。 |
位6 |
发射机空(TEMT) | 当0时,UxTHR和/或UxTSR包含有效数据。当1时,两者都为空。 |
位7 | RX FIFO错误(RXFE) | 当取值为0时,UxRBR不包含RX错误。当取值为1时,UxRBR至少包含1个错误。 |
UxTER -发送使能寄存器:用于启用UART传输。当TXEN(位7)设置为1时,TX块将继续传输数据,只要它是可用的。如果TXEN设置为0,则传输将停止。
接收缓冲区寄存器:这个寄存器包含了RX FIFO的顶字节,即FIFO中接收到的最老的字符。在从UxRBR读取之前,UxLCR寄存器中的DLAB(除数锁存存取)位必须为0。
传送保持寄存器:UxTHR包含了TX FIFO中的顶字节。它是先进先出TX的最新字符。为了访问UxTHR, UxLCR中的DLAB必须为0。
UxDLL和UxDLM -除数锁存寄存器(LSB和MSB)这些寄存器是波特率发生器的一部分。它们一起包含APB时钟产生所需波特率的16位除数值。UxDLL包含除数的较低的8位,而UxDLM包含较高的8位。在访问这些寄存器之前,UxLCR中的DLAB位必须为1。
分数分式寄存器:它控制用于生成波特率的时钟前标量值。APB时钟根据这个寄存器中的除法器和乘法器的值被划分为所需的时钟。
位(握) |
DIVADDVAL | Pre-scalar因子值。 |
位(七) | MULVAL | Pre-scalar乘数的值。最小值为1。 |
波特率计算
根据LPC1768单片机的参考手册,UART0/2/3外设的波特率计算公式如下:
这个方程可以重新排列如下:
在这里,
- PCLK是外设时钟(Hz)
- MULVAL和DIVADDVAL是UxFDR寄存器的一部分,用于设置时钟前标量
- UxDLL和UxDLM为波特率分压器值。
当选择MULVAL和DIVADDVAL值时,必须遵守以下规则:
- 1≤mulval≤15
- 0≤divaddval≤14
- DIVADDVAL < MULVAL
初始化UART
现在让我们看看如何初始化UART0外围设备以设置以下参数:
- PCLK: 25兆赫
- 波特率:115200
- 数据位:8
- 停止位:1
- 奇偶校验:没有
为了得到115200的波特率,我们必须使用以下值:
- U0DLL = 12
- U0DLM = 0
- MULVAL = 15
- DIVADDVAL = 2
因此,首先在PINSEL寄存器中设置UART功能的UART0 TXD和RXD引脚。
LPC_PINCON - - - >PINSEL0|= (1<<4) | (1<<6);
因为UART0是在重置时启用的,所以我们不需要在PCONP寄存器中配置它。接下来,使用LCR Register设置数据帧。
Lpc_uart0 -> lcr = 3 | (1<<7);
这里还设置了DLAB位,以便我们可以更改DLL和DLM寄存器。一旦设置了DLL和DLM值,我们必须使DLAB为0。
现在设置DLL和DLM值,并启用RX和TX fifo。
LPC_UART0 - > DLL = 12;
LPC_UART0 - > DLM = 0;
Lpc_uart0 -> fcr |= (1<<0) | (1<<1) | (1<<2);
在FDR寄存器中,设置MULVAL和DIVADDVAL值。在此之后,您可以清除DLAB位。
Lpc_uart0 -> fdr = (15<<4) | 2;
LPC_UART0 - > LCR & = ~ (1 < < 7);
这些步骤将使用所需的波特率和数据帧初始化UART0外设。
例子
现在,利用上述初始化步骤,我们编写一个程序,将一组字符(Hello)从LPC1768单片机传输到计算机串口终端。
# include < lpc17xx.h >
#定义3个(1 < < 5)
#定义MULVAL 15
#定义DIVADDVAL 2
#定义Ux_FIFO_EN (1 < < 0)
#定义RX_FIFO_RST (1 < < 1)
#定义TX_FIFO_RST (1 < < 2)
#定义DLAB_BIT (1 < < 7)
#定义CARRIAGE_RETURN 0 x0d
空白UART0_Init(无效);
空白UART0_Write (char数据);
int主要(空白)
{
char msg[] = {' H ', ' e ', ' l ', ' l ', ' o ', ' \0 '};
int数= 0;
UART0_Init ();
而(1)
{
而(味精[数]!= ' \ 0 ')
{
UART0_Write(味精[数]);
数+ +;
}
UART0_Write (CARRIAGE_RETURN);
数= 0;
}
返回0;
}
空白UART0_Write (char txData)
{
而(!(LPC_UART0 - > LSR & 3));
LPC_UART0 - >刺= txData;
}
空白UART0_Init(空白)
{
Lpc_pincon -> pinsel0 |= (1<<4) | (1<<6);
Lpc_uart0 -> lcr = 3 | dlab_bit;
LPC_UART0 - > DLL = 12;
LPC_UART0 - > DLM = 0;
LPC_UART0->FCR |= Ux_FIFO_EN | RX_FIFO_RST | TX_FIFO_RST
Lpc_uart0 -> fdr = (mulval <<4) | divaddval;
LPC_UART0 - > LCR & = ~ (DLAB_BIT);
}
结论
一个关于如何在LPC1768单片机中进行UART的教程。我已经解释了所有的基本事情,如UART引脚,寄存器,波特率生成,初始化UART和一个示例程序。
一个回应
很好解释。