首页

如何在LPC1768编程UART ?LPC1768 UART教程

在本教程中,我将向您展示如何配置LPC1768中的UART。UART用于串行通信,是LPC1768单片机常用的外围设备之一,主要用于与计算机通信,发送调试信息,接收命令等。我将解释与UART相关的所有寄存器,以及我们如何操作这些寄存器,以便使用UART执行串行通信。

重要提示:我已经在以前的教程中提到了这一点,但我将在每一个LPC1768教程中重复它。伟德老虎机手机版从NXP官方网站下载LPC1768单片机的数据表和用户手册。我无法详细地解释/讨论每一个话题。您必须在这些文档中查找讨论的主题并收集额外的信息。

简介

UART是通用异步接收/发送器的缩写。它是一种串行通信,通常在微控制器和计算机之间。UART是一种全双工通信,因此在通信设备之间需要两条线。它们被称为TX和RX。

UART中的“A”代表异步。这意味着通信设备之间没有时钟信号(与I2C和SPI相反,它们也是串行通信,但使用时钟信号来同步数据)。

还有一件重要的事要知道UART通信是数据传输的方式。在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,分别保存传出和传入数据。

LPC1768中的UART程序框图

在传输数据时,将要传输的数据写入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外设的波特率计算公式如下:

LPC1768中的UART波特率

这个方程可以重新排列如下:

LPC1768中的UART波特率

在这里,

  • 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和一个示例程序。

一个回应

留下一个回复

你的电邮地址不会被公布。

Electronicshub图标
Baidu
map