ug585_ch19 UART 导读

我们在使用zynq时,通过查看手册可以看到uart在ps端。通过使用PS端的串口打印消息方便在单独使用ps时的调试。UART控制器是一个全双工的异步收发控制器,在zynq内部包含uart0和uart1两个控制器。每一个UART 控制器支持
(1)可编程波特率发生器
(2)64字节接收和传输的FIFO
(3)可编程协议:a、数据位8,7,6
b、停止位1、1.5、2
c、校验方式
UART的系统结构框图如下:

在这里插入图片描述
UART 控制器和 IO 端口由参考时钟( UART REF_CLK)驱动,同时控制器也需要连接APB 总线时钟( CPU_1x clock), UART REF_CLK 和 CPU_1x clock 都是来自于 PS 时钟子系统。 UART 控制器的配置以及状态的获取由控制( Control)和状态寄存器( Status Registers)完成。
另外, UART 控制器不仅可以连接至 MIO,也可以映射到 EMIO,从而使用 PL 的端口来实现串口通信的功能。
当 UART 控制器连接到 MIO 时,只有 Tx(发送)和 Rx(接收)两个引脚
而当连接 EMIO 时,除 Tx 和 Rx 引脚外,可选的还有 CTSN、 DSDN、 DSRN 等引脚,这些引脚用于串口的流控制,即调制解调器的数据通讯中。
UART 控制器采用独立的接收和发送数据路径,每个路径包含一个 64 字节的 FIFO,控制器对发送和接收 FIFO 中的数据进行串并转换操作。 FIFO 的中断标志支持轮询处理或中断驱动处理两种方式。 另外,控制器中还有一个模式开关,支持 RXD 和 TXD 信号的各种环回配置。 (转自博主快跑bug来啦——ps他讲的真的很详细)
下图为UART在这里插入图片描述中断控制器( GIC)为串口的收发提供了中断服务的功能。
一、传输FIFO
(1)APB 总线接口通过向 TxFIFO 寄存器写值,TxFIFO的最大数据宽度是8位,将数据加载到 TxFIFO 存储器中。
数据加载至 TxFIFO 后, TxFIFO 的空标志变成无效的状态,直到最后一个数据从 TxFIFO 中移出,加载至传输移位寄存器, TxFIFO恢复空的标志位。TxFIFO完全中断状态(TFULL)表示TxFIFO已完全满,不会让任何数据加载到TxFIFO中。
下图19-4为发送数据流格式:起始位+8个数据位+奇偶校验位+停止位=11位
![稀土!](https://img-blog.csdnimg.cn/b4cacd3ec1034b37b894dd3057be7167.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dpbmR5c2t5MHYw,size_16,color_FFFFFF,t_70)(2)RxFIFO存储由接收器串行移位寄存器接收到的数据。RxFIFO的最大数据宽度是8位。当数据加载到RxFIFO时,RxFIFO空标志被清除,此状态保持为低,直到RxFIFO中的所有数据都通过APB接口传输。从空的RxFIFO中读取将返回零。
RFUL表示RxFIFO已满,并阻止任何进一步的数据加载到RxFIFO中。当RxFIFO中的空间可用时,将加载接收器中存储的任何字符。
接收时,UART不断地对RxD信号进行过采样,当采样检测到一个由高到低的转换时,便将其视作起始位的开始。在波特率时钟周期的一半时,再进行三次采样,如果仍然为低电平,则认为这是一个有效的起始位。下图为16倍的过采样:
在这里插入图片描述
当确定一个有效的起始位时,重新同步接收机波特率时钟,以便在每一位中心位置对输入的UART RxD信号进行进一步的采样。
在这里插入图片描述
当确定了串行数据位的值时,将其移位到接收移位寄存器。当组装了一个完整的字符后,寄存器的内容将被推送到RxFIFO。
四种错误检测机制:
1、奇偶校验错误 每接收一个字符时,接收器根据UART计算接收数据位的奇偶校验值,将它与接收到的奇偶检验位进行比较。如果值不同,则奇偶校验错误标志位置1,并产生中断。
2、帧错误 当接收机在一个帧的末端接收不到一个有效的停止位时,该帧错误位被设置为1。如果启用,将生成一个中断。
3、溢出错误 当接收到一个字符时,控制器会检查RxFIFO是否有空间。如果有,则该字符将被写入RxFIFO中。如果RxFIFO已满,则控制器将等待。如果检测到RxD上的又来了一个起始位,并且RxFIFO仍然已满,则数据丢失,同时溢出标志位置1,产生中断。
4、超时机制 接收器有一个10位的递减计数器,每当在RxD上收到一个新的起始位或者程序向专门的标志位写入1重置时,计数器都会重新加载并倒数。控制寄存器用1来重新启动超时计数器,以加载新编程的超时值。当递减计数器达到0时,发生接收器超时,控制器设置超时中断状态位。

二、四种工作模式
模式函数XUartPs_SetOperMode(XUartPs *InstancePtr, u8 OperationMode)设置模式
在这里插入图片描述
模式1:普通的模式
模式2:自动回声模式 回声模式接收RxD上的数据,控制器接收数据,但是无法发送数据。
模式3:本地回环 本地环回模式不连接到RxD或TxD引脚。本地程序回环测试。
模式4:远程环回模式 RxD 连接至 TxD,但是并没有和控制器连接,因此控制器在此模式下无法发送数据和接收数据。

三、中断(虽然我现在用的是非阻塞模式,没用中断)
有两个状态寄存器可以被软件读取。Chnl_int_sts_reg0寄存器的状态可以被读取,并生成一个中断。Channel_sts_reg0寄存器的状态为只读状态。
在这里插入图片描述

	Intrpt_mask_reg0是一个只读中断掩码/启用寄存器,用于掩码Chnl_int_sts_reg0寄存器中的单个原始中断:如果掩码位=0,则中断被掩码。如果掩码位=1,则启用中断。此掩码由只写寄存器的Intrpt_en_reg0和Intrpt_dis_reg0控制。
	每个关联的启用/禁用中断位都应设置为互斥(例如,要启用中断,请将1写入Intrpt_en_reg0[x],并将0写入Intrpt_dis_reg0[x])。

在这里插入图片描述
FIFO触发器级别由这些位字段控制:
1、uart.Rcvr_FIFO_trigger_level0[RTRIG],一个6位字段
2、uart.Tx_FIFO_trigger_level0[TTRIG],一个6位字段

四、启动顺序(ps:原文链接:https://blog.csdn.net/qq_42330920/article/details/113766466)
(一)UART启动顺序
1、 复位控制器(在 PS 系统复位时);
2、 配置 IO 引脚信号。 RxD 和 TxD 可以连接至 MIO 或者 EMIO,只有 EMIO 可以使用串口的流控制。
3、 配置 UART 参考时钟;
4、 配置控制器功能( UART 控制器初始化);
5、 配置中断,通过中断来管理 RxFIFO 和 TxFIFO;
6、 配置串口流控制(可选);
7、 管理发送和接收的数据,可以采用轮询或中断驱动处理两种方式。

(二)配置控制器功能
控制器功能主要配置字符帧、波特率、 FIFO 触发器等级、 Rx 超时机制,并启用控制器。重置控制器后必须要配置所有这些参数。步骤如下:
1、 配置 UART 数据帧格式。如: 数据位长度、停止位、校验方式、 IO 模式等;
2、 设置波特率;
3、 设置 RxFIFO 触发器等级,可以选择启用或禁用该功能;
4、 使能 UART 控制器;
5、 配置接收器的超时机制,可以选择启用或禁用该功能。

(三)发送数据
我们可以使用轮询或者中断两种方式控制 TxFIFO 和 RxFIFO 的数据流。这两个 FIFO 大小均为 64 个字节,因此当 TxFIFO 的空标志有效时,我们可以直接向其写入 64 个字节,无需检查 TxFIFO 的状态。实际上当发送器处于活跃状态时,可写入的字节数要超过 64 个字节,因为控制器同时也在移出数据,将其串行化转移到 TxD 信号上。
采用轮询方法发送数据的顺序如下:
1、 检查 TxFIFO 是否为空;
2、 向 TxFIFO 写入数据,可以写入 64 个字节;
3、 向 TxFIFO 中写入更多数据。我们可以等待 TxFIFO 为空之后再写入 64 个字节,即执行第 2 步;也可以检测 TxFIFO 是否写满,即不停的读取 TFUL 标志和写单个字节的数据。
采用中断方法发送数据的顺序如下:
1、 禁用 TxFIFO 空中断;
2、 向 TxFIFO 写数据,可以写入 64 个字节的数据;
3、 检测 TxFIFO 是否为满状态,不停的读取 TFUL 标志和写单个字节的数据;
4、 重复步骤 2 和 3,直到 TxFIFO 已满;
5、 使能TxFIFO空中断
6、 等待,直到 TxFIFO 为空,然后从步骤 1 重新开始;

(四) 接收数据
使用轮询方法接收数据:
1、等待,直到RxFIFO被填充到触发器级别
2、从RxFIFO中读取数据
3、重复步骤2直到FIFO读到空
4、清除如果设置了Rx超时中断状态位被拉高的状态
使用中断方法接收数据:
1、启动中断(将 uart.Intrpt_en_reg0 [TIMEOUT] and uart.Intrpt_en_reg0[RTRIG].置1)
2、等待,直到 RxFIFO 中的数据数量达到触发等级或者发生超时;
3、从RxFIFO中读取数据。
4、重复步骤2和步骤3,直到FIFO为空。( uart.Channel_sts_reg0 [REMPTY] = 1的时候)
5、清除中断标志

(五)RxFIFO触发器级别中断
Intrpt_en_reg0:Write-only.。启用中断位(s)。
Intrpt_dis_reg0:Write-only.。强制禁用中断位(s)

(六)UARTI/O信号的标识信息见表

在这里插入图片描述

五、波特率的设置
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值