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

在本教程中,我将向您展示如何在LPC1768中配置UART。UART用于串行通信,并且是LPC1768 MCU中的常用外设之一,主要用于传送用于传输调试消息的计算机,接收命令等。我将解释与UART相关联的所有寄存器,我们如何按顺序操纵这些寄存器使用UART执行串行通信。

重要的提示:我已经在上一个教程中提到过这个,但我会在每个LPC1768教程中重复它。从官方NXP网站下载LPC1768 MCU的数据表和用户手册。我无法详细解释/讨论每个主题。您必须在这些文件中查找讨论的主题,并收集其他信息。

介绍

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

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

关于UART通信需要了解的另一件重要事情是数据是如何传输的。欧宝官网app苹果下载在UART中,数据以“数据包”或“帧”的形式传输。典型UART数据包的结构如下所示。

UART包 

在帧的开头,有启动位,即'0',它指示接收器关于关于要传输的数据。欧宝官网app苹果下载

起始位后跟要传输的实际数据。它的长度可以是5位和8位之间的任何地方。在数据之后,存在一个奇偶校验位,可用于错误检查。该位是可选的。

最后,为了表示当前数据传输的结束,还有STOP位,它通常是长度为1或2位宽的' 1 '。要传输下一组数据,请重复此过程。

UART在LPC1768中

在LPC1768 MCU中来到UART,它由四个UART外围设备VIZ组成。

  • 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,还有其他与Hardwar Flow Control相关的引脚。

LPC1768中的UART建筑

以下图像显示LPC1768中的UART外围设备的框图。发送器和接收器块都包含16个字节FIFO以分别保持输出和传入数据。

UART在LPC1768框图中

在数据传输的情况下,要传输的数据被写入THR寄存器。这个数据然后缓冲到TX FIFO。移位寄存器然后从缓冲区读取数据并通过相应的TXD引脚传输。

来接收数据,通过接收器块中的移位寄存器捕获有效数据,并将其传输到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时,禁用FIFOs。当1时,RX和TX FIFOs都被启用。

位1

RX FIFO RESET. 当1时,RX FIFO将被清除和重置。
位2 TX FIFO重置

当1时,将清除并重置TX FIFO。

位[6] RX触发水平

用于确定在激活中断或DMA请求之前必须写入多少RX FIFO字符。

UXLCR - 线路控制寄存器:确定传输中使用的数据格式。

比特[1:0]

单词长度选择 当[00],5位字符长度。类似地,分别为6,7和8位字符长度的[01],[10]和[11]。

位2

停止位选择 当0,1停止位和1时,2个停止位。
位3 奇偶校验使能

0时,禁用奇偶校验生成和检查。当1时,它会启用。

位[5:4]

奇偶校验选择 当[00]时,奇数奇偶校验。类似地,对于[01],[10]&[11],甚至奇偶校验,强迫“1”静态和强制“0”棒奇偶校验。
位6 打破控制

当0时,禁用中断传输。1使之生效。

位7 除分锁定访问位(DLAB)

当0时,禁用访问除数锁存器。1,启用它。

UxLSR - Line Status Register:提供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,则传输将停止。

UXRBR - 接收器缓冲寄存器:这个寄存器包含RX FIFO的顶字节,即FIFO中接收数据的最老字符。在从UxRBR读取之前,UxLCR寄存器中的DLAB(除数闩锁访问)位必须为0。

uxthr - 传输保持寄存器:uxthr中包含TX FIFO中的顶部字节。它是TX FIFO中最新的性格。UXLCR中的DLAB必须为0,以便访问uxthr。

UxDLL和UxDLM -除闩寄存器(LSB和MSB):这些寄存器是波特率发生器的一部分。一起,他们包含16位除数值的APB时钟产生所需的波特率。UxDLL包含除数的低8位,而UxDLM包含高8位。在访问这些寄存器之前,UxLCR中的DLAB位必须为1。

UXFDR - 分数分频器寄存器:它控制时钟标量前值以产生波特率。APB时钟被划分为基于该寄存器中的分频器和乘法器值的所需时钟。

位(握)

divadval. Pre-scalar因子值。
位(七) 覆盖

预标量乘数值。最小值为1。

波特率计算

根据LPC1768 MCU的参考手册,以下公式可用于计算UART0 / 2/3外围设备的波特率。

uart在lpc1768波特率1

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

uart在lpc1768波特率2

在这里,

  • PCLK是Hz的外围时钟
  • MULVAL和DIVADDVAL是UxFDR寄存器的一部分,用于设置时钟前标量
  • UxDLL和UxDLM是波特率分配器值。

在选择MULVAL和DIVADDVAL值时,必须遵守以下规则:

  • 1≤mulval≤15
  • 0≤divadval≤14
  • divadval

初始化UART

让我们现在看看如何初始化UART0外设才能设置以下参数:

  • PCLK:25 MHz
  • 波特率:115200
  • 数据位:8
  • 停止位:1
  • 奇偶校验:无

为了得到115200的波特率,我们必须使用以下值:

  • U0DLL = 12.
  • U0DLM = 0
  • Mulval = 15.
  • divadval = 2

因此,首先为PINSEL寄存器中的UART功能设置UART0 TXD和RXD引脚。

lpc_pincon-> pinsel0 | =(1 << 4)|(1 << 6);

因为UART0是在重置时启用的,所以我们不必在PCONP寄存器中配置它。接下来,使用LCR寄存器设置数据帧。

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 Bit。

LPC_UART0-> FDR =(15 << 4)|2;

LPC_UART0 - > LCR & = ~ (1 < < 7);

这些步骤将用所需的波特率和数据帧初始化UART0外设。

例子

现在,使用上面的初始化步骤,让我们编写一个程序来将一组字符(Hello)从LPC1768 MCU传输到计算机的串行终端。

#include
#定义3个(1 < < 5)
#定义MULVAL 15
#define divaddval 2.
#define ux_fifo_en(1 << 0)
#define rx_fifo_rst(1 << 1)
#定义TX_FIFO_RST (1 < < 2)
#define dlab_bit(1 << 7)
#定义CARRIAGE_RETURN 0 x0d

voiduart0_init(空白);
空白UART0_Write (char数据);

int主要(空白)

char msg [] = {'h','e','l','l','o','\ 0'};
int count = 0;

UART0_INIT();

而(1)

而(msg [count]!='\ 0')

UART0_WRITE(msg [count]);
count ++;

UART0_WRITE(Carriage_Return);
数= 0;

返回0;

空白UART0_Write (char txData)

而(!(lpc_uart0-> lsr&thre));
lpc_uart0-> thr = 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)|divadval;
LPC_UART0 - > LCR & = ~ (DLAB_BIT);

结论

关于如何在LPC1768单片机UART的教程。我已经解释了所有的基本事情,如UART引脚,寄存器,波特率生成,UART的初始化和一个示例程序。

一个反应

发表评论

您的电子邮件地址不会被公开。必填字段被标记