概述

Ameba 系列产品支持 UART 接口,能够进行异步串行全双工通信。

功能特性

  • 支持多种 UART 数据格式

  • 可配置的接收时钟,支持低功耗接收模式

  • 支持硬件自动流控

  • 支持接收信号去抖

  • 支持接收波特率监控与校正

  • 支持串行红外编码与解码

  • 操作模式

    • 轮询模式

    • 中断模式

    • DMA 模式

收发时钟

发送时钟与波特率

  • 时钟:XTAL40M

  • 波特率:110bps - 8Mbps

接收时钟与波特率

接收时钟包括 XTAL40M、OSC2M 和 XTAL2M, 各芯片支持的接收时钟如下表所示:

Ameba SoC

RTL8721Dx

RTL8720E

RTL8726E

RTL8713E

RTL8730E

RTL8721F

XTAL40M

Y

Y

Y

Y

Y

Y

OSC2M

Y

Y

Y

Y

Y

Y

XTAL2M

N

Y

Y

Y

Y

N

接收时钟对应的波特率范围如下表所示:

接收时钟

XTAL40M(默认)

OSC2M

XTAL2M

波特率

110bps - 8Mbps

110bps - 115200bps

110bps - 115200bps

工作模式

根据需要,可配置 UART 工作在以下三种模式:

轮询模式

这是最基础的工作模式。CPU 通过轮询 UART 的状态寄存器,然后根据需要读写 FIFO 缓冲区,以实现数据的收发。

适用对实时性要求较低的小规模数据传输。

中断模式

当满足配置的触发条件时,UART 硬件会发送中断信号通知 CPU 处理相关事务。

该方式无需频繁轮询,使得 CPU 占用率降低且响应速度更快。

DMA 模式

通过 UART 与 DMA 握手机制,由 DMA 控制器负责数据传输,减轻 CPU 的处理负担。

适用于需处理大量数据的应用,如音视频流处理、大数据传输等情境。

  • UART 通过 DMA 模式发送数据,过程由 GDMA 控制。

  • UART 通过 DMA 模式接收数据,过程由 GDMA 或 UART 控制:

    • 如果开发者需要接收 固定长度 的数据,可以利用 GDMA 控制 UART DMA 。

    • 如果开发者需要接收 不固定长度 的数据,可以利用 UART 控制 UART DMA 。

备注

  • 关于使用 DMA 模式传输的注意事项,请参考 DMA 和缓存 介绍。

  • 关于使用 UART DMA 接收的不同方式,请参考 应用示例 中的内容。

硬件自动流控

UART 支持硬件自动流控,通过请求发送 RTS 信号和清除发送 CTS 信号,自动控制数据的传输,避免数据丢失或溢出。

硬件自动流控的收发双方设备连接如图所示:

../../../_images/uart_trx_rts_cts.svg

UART 自动流控信号连接

备注

nRTS 信号和 nCTS 信号为低电平有效。

自动请求发送

  • 设备 A 在准备好接收数据时将其 RTS 线置为低电平,通知设备 B 可以发送数据。

  • 当设备 A 的接收 FIFO 中的数据量达到配置阈值时,RTS 线被置为高电平,通知设备 B 不要再发送数据。

  • 当设备 A 的接收 FIFO 中的数据量减少到一定程度,RTS 线被置为低电平,通知设备 B 可以继续发送数据。

备注

  • RTS 线一旦被拉高,再次拉低的时刻取决于接收 FIFO 中的数据量。

  • 接收 FIFO 完全为空 时,RTS 线才会被置为低电平。

自动清除发送

设备 A 监控来自设备 B 的 CTS 信号,以判断是否继续发送数据:

  • 当 CTS 信号为低电平,设备 A 可以发送数据。

  • 当 CTS 信号为高电平,设备 A 不发送数据。

应用示例

SDK 提供了两类功能示例,帮助开发者了解和使用 UART 功能:

  • mbed 示例

    • 路径:{SDK}\component\example\peripheral\mbed\UART\{demo}

    • 展示如何在 mbed 环境中实现 UART 控制。

  • raw 示例

    • 路径:{SDK}\component\example\peripheral\raw\UART\{demo}

    • 展示如何在无抽象层的情况下直接控制 UART。

以下是对 raw 示例功能的简要说明:

备注

要了解示例支持的芯片,请查看示例路径下的 README.md 文件。

API 参考

要详细了解和使用相关 API,请参阅 {SDK}\component\soc\amebaxxxx\fwlib\include\ameba_uart.h

常见问题排查

通过 UART 唤醒丢数据

现象

向UART发送数据唤醒系统,唤醒后发现丢失了部分数据

原因

接收FIFO大小有限,发送数据太长时,系统来不及处理,只能保留一部分数据

解决方法

  • 调整唤醒数据长度,不能大于接收FIFO大小

  • 先利用dummy字符唤醒系统,再发送有效数据

UART 利用 DMA 接收数据时越界

现象

在RTL8721Dx/RTL8720E/RTL8726E/RTL8713E/RTL8730E上, 运行raw_uart_dma_rx_fc示例进行数据接收时,数据量超出buffer范围

原因

UART控制DMA接收时,电路不会对数据量做限制

解决方法

运行raw_uart_dma_stream示例并打开宏UART_USE_GTIMER_TO, 开发者可以在连续接收的前提下,接收不超过指定数量的数据