USER GUIDE / PERIPHERALS / UART / OPERATION FLOW
操作流程
下文将介绍 UART 的操作流程,包括配置、数据传输、数据接收和红外线模式。
UART 配置
在 UART 开始传输数据或更改传输格式之前,必须进行配置以定义传输格式。示例流程如下:
在 FIFO 模式下,将 UFCR.FME 设置为 1,重置接收和发送 FIFO,然后按以下步骤初始化 UART:
步骤一:将 UFCR.UME 清零。
步骤二:设置 UDLLR 和 UDLHR 中的值,以生成波特率时钟。
步骤三:在 ULCR 中设置数据格式。
步骤四:如果是 FIFO 模式,则在 UFCR 中设置 FME 位和其他 FIFO 控制,重置接收和发送 FIFO,否则跳过第 4 项。
步骤五:在基于中断的传输中设置 UIER 中的各中断使能位,或在基于 DMA 的传输中设置 UFCR.DME(DMA 传输仅为 FIFO 模式),然后设置 UFCR.UME。
数据传输
配置完成后,UART 即可进行数据传输。数据传输请参阅以下步骤:
步骤一:读取 ULSR.TDRQ(中断禁用)或等待发送数据请求中断(中断使能),如果 ULSR.TDRQ = 1 或发送数据请求中断发生,则表示 UTHR 中有足够的空位置来存放新数据。
步骤二:如果 ULSR.TDRQ 为 1 或收到发送数据请求中断,则向 UTHR 写入发送数据,开始发送。
步骤三:如果有更多数据等待发送,则执行第 1 项和第 2 项。
步骤四:将所有必要数据写入 UTHR 后,等待 ULSR.TEMP = 1,表示所有数据已完全发送。
步骤五:如果需要发送断点,则设置 ULCR.SBK,至少等待 1 位间隔时间后发送有效的断点,然后清除 ULCR.SBK。
步骤六:清零 UFCR.UME 位,完成 UART 传输。
数据接收
配置完成后,UART 即可进行数据接收。有关数据接收,请参阅以下示例程序:
步骤一:读取 ULSR.DRY(中断禁用)或等待接收数据请求中断(中断启用),如果 ULSR.DRY = 1 或接收数据请求中断发生,则表示 URBR 有一个数据(非 FIFO 模式)或 URBR 中的数据达到触发值。(FIFO 模式)
步骤二:如果 ULSR.DRY = 1 或接收数据请求中断发生,则读取 ULSR.FIFOE 或查看是否有错误中断,如果 ULSR.FIFOE = 1,表示接收到的数据有接收错误,则进入错误处理程序,否则进入第 3 项。
步骤三:读取 URBR 中的一个接收数据(非 FIFO 模式)或 URBR 中等于触发值的数据。(FIFO)模式
步骤四:检查是否接收到所有数据:检查 ULSR.DRY 是否 = 0,在 FIFO 模式下并启用中断时,可能会产生超时中断,当超时中断产生时,读取 URBR 直到 ULSR.DRY = 0。
步骤五:当接收到所有数据且 ULSR.DRY = 0 时,清零 UFCR.UME,结束数据接收。
接收错误处理
错误处理流程示例如下:
如果 ULSR.FIFOE = 1,表示接收到的数据有接收错误,然后检查是什么错误。
如果 ULSR.OVER = 1,进入 OVER 错误处理。
如果 ULSR.BI = 1,则进入中断处理。
如果 ULSR.FMER = 1,转到帧错误处理。
如果 ULSR.PARER = 1,进入 PARER 错误处理。
调制解调器传输
UMCR.MDCE = 1 时,启用调制解调器控制。软件可通过 RTS_ 和 CTS_ 引脚停止和重新启动传输流。当 UART 发送器检测到 CTS_ 引脚为低电平时,会停止传输,TxD 引脚在完成当前字符的传输后进入标记状态,直到检测到 CTS_ 引脚恢复到高电平。RTS_ 引脚输出给接收 UART,其状态可通过设置 UMCR.RTS 位来控制,即设置 UMCR.RTS 为 1 时,RTS_ 引脚为低电平输出,表示 UART 已准备好接收数据,反之则表示 UART 当前无法接收更多数据。
DMA 传输
UART 可以在基于 DMA 的模式下工作(UFCR.DME = 1,仅限 FIFO 模式),即由 UART 发起的 DMA 请求取代中断请求,使用 DMA 代替 CPU 进行传输/接收。除超时和错误中断外,软件必须确保禁用发送和接收中断。
在 DMA 传输过程中,如果发生中断,软件必须首先读取 ULSR,查看是否存在错误中断,然后检查 UIIR,查找中断源,如果 DMA 通道已因 UART 的错误指示而停止,则禁用 DMA 通道,并从接收 FIFO 中读出所有错误数据。软件重新设置并重新启用 DMA 后,DMA 的数据传输将重新启动。
慢速 IrDA 异步接口
通过将 ISR.XMITIR 和 ISR.RCVEIR 设置为 1,每个 UART 都支持慢速红外线 (SIR) 发送和接收(确保这两个位不同时设置为 1,因为 SIR 不能全双工运行)。根据 IrDA 1.1,数据传输速率的最大值限制为 115.2Kbps。
在 SIR 发送模式下,发送脉冲以 3/16 的速率发出(当发送数据位为零时);在 SIR 接收模式下,接收器必须检测到 3/16 脉冲周期才能识别零值(高电平或低电平有效脉冲解调为 0,无脉冲解调为 1)。
与普通 UART 相比,SIR 有一些限制,即每个字符的数据宽度固定为 8 位,没有奇偶校验和 1 个停止位,并且忽略调制解调器功能。IrDA 1.1 规定,光节点停止发送后,其接收器在恢复接收功能前至少有 10 毫秒的延迟,软件必须保证这一延迟。
在 IrDA 1.1 规范中,通信必须以 9600bps 的速率启动,但如果两端都支持,则允许链接协商更高(或更低)的数据速率。但是,通信速率不会自动改变。如有必要,可通过软件进行更改。
对于使用 UART 的任何频率时钟
如果不设置 M 寄存器和 UACR,UART 将以指定频率的正常模式工作。要使用其他频率,必须将 M 寄存器和 UACR 设置为正确值。
- 改进
- 一个比特由 M 个 CLKBR 周期组成,周期数可为 4 至 1024。
- 可以在一帧的某些比特中插入一些额外的 CLKBR 周期,这样实现小数分频。
例如:
CLKBR = CLKDEV / N N = 1, 2, … CLKBR = CLKDEV / N = 4MHz 波特率 = 460800
精确
Ma = 8.681
我们取 M = 8,每帧多 8 个周期
一个 12 位寄存器用于指示插入额外周期的位置。
第一行是预期时间
第二行是实际时间
第三行是时间误差

对于传输,理论上最大误差为 CLKBR 周期的一半,即 0.125us。
- 设置 UMR 寄存器
CLKBR = CLKDEV / N, (N = UDLHR.LHR<<8 + UDLLR.LLR) Ma = CLKBR / 带宽 M 是 Ma.的调制解调器。 将 M 写入 M 寄存器。
考虑到功率和稳健性,最好通过设置 UDLR 来选择 M 为 6 至 32。
最大误差 = (0.5 / CLKBR) / (Ma / CLKBR) = 0.5 / Ma < 0.5 / M
| M | 4 | 8 | 16 | 32 | 64 |
|---|---|---|---|---|---|
| error/Wbit | 12.5% | 6.25% | 3.125% | 1.56% | 0.78% |
- 设置 UACR 值
它的每一位表示
0:表示不增加 UART 准备发送或接收的位的周期,换言之,将使用 M 个周期发送或接收该位
1:表示为 UART 准备发送或接收的位增加额外周期,换句话说,将使用 M+1 个周期发送或接收该位
要设置 UACR 值,必须确保每个位的最大误差小于 0.5PBR。
例如:Ma-M = 0.15;M+1-Ma = 0.85;
向 UMR 写入 8、
向 UACR 写入 0x408
周期/位:M,M,M,M+1,M,M,M,M,M,M,M+1,M
UACR:0 0 0 1 0 0 0 0 0 0 1 0