使用CoIDE编程LPC1343 UART

本文详细介绍了如何在ARMCortex-M0LPC1343微控制器上进行UART(串行)编程,包括UART模块的内部结构、波特率计算、寄存器配置以及如何通过UART与电脑连接。提供了波特率计算的简化方法和最佳实践,并给出了初始化UART的示例代码。此外,还讨论了在不同UART_PCLK频率下实现特定波特率的注意事项和误差处理。
摘要由CSDN通过智能技术生成

本文,我将讨论ARM Cortex-M0 LPC1343的基本UART(SERIAL)编程教程。本教程也适用于相同系列(LPC13xx)的MCU。

LPC1343 UART模块
ARM Cortex-M0 LPC134x微控制器只有1个UART模块。 UART模块将其输入时钟作为CCLK,因为对于LPC134x PCLK = CCLK。 默认情况下,复位后禁用UART的输入时钟。 因此,要使用它,我们需要启用其输入时钟。 对于LPC1311 / 13/42/43部件号,必须在使能UART时钟之前使用IOCON寄存器配置TxD和RxD引脚。 对于LPC1311 / 01和LPC1313 / 01,此序列不是必需的。 由于我们将使用LPC1343 MCU,因此必须对示例部分中给出的UART示例使用时钟使能序列。 请检查用户手册以验证该序列是否适用于您的LPC13xx器件。 TXD和RXD引脚的引脚映射如下所示:

UART模块内部具有16字节FIFO(先进先出)结构来保存数据。 该FIFO中的每个字节代表一个已按顺序发送或接收的字符。 它还每个都包含两个寄存器,用于数据访问和汇编,如下所示:

Tx具有THR(发送保持寄存器)和TSR(发送移位寄存器)–当我们将要发送的数据写入THR时,它将被传输到TSR,TSR组合要通过Tx引脚发送的数据。

同样,Rx具有RSR(接收移位寄存器)和RBR(接收缓冲寄存器)–当在Rx引脚上接收到有效数据时,首先将其组装在RSR中,然后传递到Rx FIFO中,然后可以通过RBR对其进行访问。

UART寄存器
在进行任何UART /串行通信之前,我们首先需要在LPC134x微控制器中配置和初始化UART模块。但在此之前,让我们先了解一下LPC134x UART编程中使用的一些重要寄存器:

UART波特率计算
计算波特率的主要公式为:

其中DIVADDVAL和MULVAL是在“波特率生成”中使用的“分数速率分频器”或“波特预分频器”的一部分。仅当DIVADDVAL> 0时,此“分数除法器”才有效。此公式对于LPC ARM微控制器非常普遍。

可以进一步简化为:

严格遵守以下条件:

0 < MULVAL <= 150

0<= DIVADDVAL <= 14 {if DIVADDVAL > 0 & DLM = 0 then, DLL must be >= 3}

DIVADDVAL < MULVAL

其中UART_PCLK是UART外围时钟(使用UARTCLKDIV寄存器从CCLK派生)的Hz值,而DLM和DLL是我们前面看到的除数寄存器,最后DIVADDVAL和MULVAL是小数波特率发生器寄存器的一部分。

可以看出,该公式具有两个突出部分,分别是:基值和小数部分(预分频器),即:

BaudRate = [ Fraction Part (Prescaler) ] x [ Base ]

该小数部分,即小数除法器或“波特率预分频器”,可以用于按比例缩小或保持基值不变(禁用时)。因此,它对于微调和使波特率尽可能准确非常有用。

注意:在现实世界中,获得实际波特率与所需波特率相同的可能性很小。 在大多数情况下,实际波特率将漂移到高于或低于所需波特率的位置,并且随着所需波特率的增加,这种漂移或误差也将增加–这是由于方程本身以及MULVAL,DIVADDVAL的限制所致! 例如 如果所需的波特率是115200,并且根据变量,您可能会得到114100、115690、116100等波特率。 但是在大多数情况下,如果错误不大,它将按要求工作。 在大多数系统中,实际波特率中的少量误差通常是可以容忍的,该误差必须小于1.1%(相对误差)。

现在我们知道了公式,我们实际上是如何开始的?

最简单方法:

在不使用任何算法或进行微调的情况下,最快,也是最简单的方法(精确度是)设置DLM = 0并禁用小数除法器(即DIVADDVAL = 0)。 在这种情况下,MULVAL = 1和DIVADDVAL = 0使得小数部分(FP)=1。现在,方程中只有1个未知数,它是DLL,因此我们简化了该方程并求解UxDLL。

我认为,如果可能,您必须远离上述方法,因为它仅适用于特定的波特率和特定的PCLK值,而且计算出的DLL可能超出范围,即> 255,在这种情况下,您必须开始增加DLM并重新计算新的 DLL的值。 当UART_PCLK = 72Mhz,48Mhz和24Mhz时,此方法适用于115200所需的波特率。

最好方法:

在这些方法中,我们再次从DLM = 0,DIVADDVAL = 0(即禁用小数除法器)和MULVAL = 1开始,并获得DLM的初始值。 如果幸运的话,您将获得非常接近所需波特率的波特率。 如果不是,那么我们将使用DLM,MULVAL和DIVADDVAL进行一些微调,并获得DLM的新值。 我在下面给出的算法是一种适合初学者的基本算法。

当使用72Mhz时钟时,通过第一种方法获得DLL = 39.06,因此我们可以使用DLL = 39,因为DLL必须是整数才能获得Actual Baud = 115384.6(〜115384),相对误差仅为0.16%。 类似地,当UART_PCLK = 48Mhz时,我们可以将DLL = 26用于上述波特。 在这两种情况下,我们都很幸运地获得了一个非常接近整数的DLL,但是当我们使用12.5Mhz的时钟或将所需的波特率更改为9600时,情况并非如此。

示例:UART_PCLK = CCLK = 72 Mhz,所需的波特率是9600。

让我们以DLM = 0,DIVADDVAL = 0和MULVAL = 1开始,我们有UART_PCLK = CCLK = 72Mhz = 72 x 106 Hz。

因此,现在方程式已简化,我们可以找到DLL。

我们得到的DLL = 468.75,超出范围,因为DLL必须小于255,因为它仅使用8位。为了使DLL处于范围内,请使用非零DLM值,在这种情况下,我们的方程式变为:

现在使用DLM = 1,四舍五入时得到DLL = 212.75,即= 213。 在DLL = 213和DLM = 1的情况下,我们的实际波特率将为9594.8,误差为5.2(大小),相对误差为0.05%。 因此,我们可以使用这些设置,因为误差在规格范围内。 但是,如果该错误会更大,我们将按以下方式使用小数部分:

在LPC134x中配置UART
一旦了解了UART /串行通信的工作原理,就可以直接配置和初始化UART。在本教程的源代码示例中,我们将使用以下配置:

如上例所示:为了在72Mhz UART_PCLK上获得〜115200波特,我们必须使用以下设置来生成波特:

U0DLL = 39 ; U0DLM = 0 ; MULVAL = 1 ; DIVADDVAL = 0

现在,让我们编写一个函数“ InitUART()”,我们可以使用它来初始化和配置UART0:

完成此操作后,您现在就可以使用RBR和THR寄存器传输数据了。

MCU与电脑连接
在这里,我们可以有2种可能的情况。

您的PC /笔记本电脑(较旧的)已具有一个串行端口。在这种情况下,您将需要一个RS232转TTL转换器。

您的PC /笔记本电脑没有串行端口,并且您正在使用USB到串行转换器(FTDI等)。

如果您使用单独的转换器,则在两种情况下,转换器的TTL端都必须至少使用3个引脚进行基本UART通信,这些引脚是:TxD,RxD和GND。 将您的MCU RxD连接到转换器的TxD,并将MCU TxD连接到转换器的RxD。 最后,在两边都连接GND。 确保您的模块支持3.3v电压电平。

这是终端软件PuTTYtel的配置屏幕截图,我们将使用它作为示例:

Hello World使用UART示例 | 代码 | 终端中的回显数据 | 代码 | 本文CoIDE项目源码

详情参阅 - 亚图跨际

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值