ZYNQ进阶之路14--PS端uart串口接收不定长数据

14 篇文章 8 订阅
14 篇文章 41 订阅

ZYNQ进阶之路14--PS端uart串口接收不定长数据

导语

繁忙的博主又来了,本节我们实现一个比较简单的东西:串口。之前的章节中我们也有使用PS端的串口进行收发数据,但是都是接收固定长度的数据包,在实际的项目工程中是很不方便和不实用的。本章节我们来详细讲解ZYNQ中PS端串口接收的机制和实现接收不定长数据的原理。
本章节对应工程源码: ZYNQ进阶之路14工程 对应软件版本vivado2018.3

ZYNQ串口简介

ZYNQ PS端有两个串口,uart0和uart1。两个串口基本一样,只要学会了其中一个串口的配置,另一个串口也就照搬程序了。串口的硬件框图大致如下图所示:
在这里插入图片描述
如上图所展示的,一个串口有两个FIFO,接收和发送各用一个,FIFO的缓存能大大的提高串口的工作效率,并且减少CPU的干预。两个FIFO的宽度都为8bit,深度为64字节。当串口发送数据时,CPU/DMA通过总线将需要发送的数据写入TxFIFO中,硬件检测到FIFO中有数据或者数据到达一定数量就会往外发送数据直到TxFIFO为空。当串口接收数据时,硬件将数据缓存如RxFIFO中,当软件检测到RxFIFO有数据时,CPU/DMA就通过总线去读取RxFIFO直到RxFIFO为空。对于串口发送,我们一个字节一个字节发送便可,已经足够我们日常使用。本节我们主要讲解串口接收的原理,本节中我们使用两种中断实现串口接收不定长数据,第一种为RxFIFO阈值触发中断:这种中断首先是要给FIFO设置一个阈值,当RxFIFO中有效数据量大于等于阈值时,产生中断;第二种是接收数据超时(timeout)中断,使用过STM32的同学可能比较熟悉STM32中有一个串口的空闲中断,这里的接收数据超时中断和这个类似,如果在设定时间周期内没有接收到串口数据则产生超时中断。
同时使能以上两种中断便可以实现任意长度的串口数据接收了,接下来我们来看一下具体是如何实现的吧!

实现步骤

首先我们创建一个新的ZYNQ工程,具体工程创建流程参照 ZYNQ进阶之路5中的工程创建流程。工程创建后如下所示:
在这里插入图片描述
然后导入到SDK中,创建helloworld工程,输入如下代码实现本节功能:
在这里插入图片描述
在这里插入图片描述
上图中红框1为串口中断服务函数,
红框2读取中断类型
红框3中是读取FIFO数据代码,500为设置的读取数据长度,该值无论设置多大都无所谓,因为读取到FIFO为空后就不会再读数据了,而返回数值为实际读取到的数据数量。所以这里我们设置为500也是可以的。
红框4中为数据发送程序,将接收到的数据全部发送出去,并且只有接收到最后一个数据后发生超时中断才会触发数据发送。
红框5为串口初始化函数
红框6为设置超时中断的超时时间,超时时间=16个波特率时钟周期。其计算公式为:超时时间=n*4个波特率周期,本程序中n=4.
然后编译程序后,下载但芯片中,便可实现不定长数据接收了,其实际运行效果如下所示:
在这里插入图片描述
一次发送130个字节,发送一段时间后也不会出现丢数据的状况,还是相当稳定可靠的!好了本节内容就到此为止了,在下一节的内容中我们将讲解在ZYNQ中通过AXI stream接口+AXI DMA实现PS和PL的高速数据传输,有兴趣的博友可以持续关注本博主哦!博主邮箱:wanpengwork@163.com 博主微信技术公众号:鹏哥DIY。

  • 20
    点赞
  • 152
    收藏
    觉得还不错? 一键收藏
  • 26
    评论
### 回答1: Zynq PS UART接收是指使用赛灵思公司的Zynq系列处理器的处理系统(PS)模块中的通用异步收发器(UART),接收外部设备(如传感器或其他控制器)发送的数据流。在使用Zynq PS UART接收时,需要确定接收数据格式和波特率,并将它们配置为与接收设备发送的数据格式和波特率匹配。 Zynq PS UART接收的实现过程如下。首先,将PS UART接收器连接到外部设备,确保UART接收器的概念正确地引脚和电气特性与外部设备相匹配。然后,设置UART接收器的波特率和数据格式,可以使用赛灵思开发套件提供的软件工具来实现这个任务。接下来,编写PS模块的驱动程序,申请合适的缓冲区,使能UART接收器,并启动数据接收流程。在接收数据时,需要注意不同于传统的线性处理器,Zynq的两个处理器核心(即ARM和FPGA)在协作完成处理任务。因此,在处理和缓冲数据时,需要确保双方间数据传输或数据拷贝的完整性和一致性,以防止数据的丢失和重复发送。 以上是Zynq PS UART接收的一般过程和注意事项,该过程通常需要通过一定的开发和调试才能完成。最终,使用PS UART接收器可以实现从外部设备接收数据,并实现对数据的存储、处理和响应等功能,极大地扩展了Zynq处理器的应用范围。 ### 回答2: Zynq是一种嵌入式处理器,具有高度集成的特点。在Zynq PS中,UART是一种通信接口,可以用于串行通信。在UART接收数据之前,必须先进行配置。首先需要确定波特率(Baud Rate),波特率是指每秒钟传输的位数,通常情况下,波特率的选择应该与发送方的波特率一致。在Zynq中,可以通过控制寄存器的设置来实现波特率的设置,并且还需要确定校验码和数据位数。 当UART接收数据时,其实就是在接收连续的字节。数据数据线一位位地传输,不同的位通过不同的电平来区分。一般情况下,使用RX寄存器来接收数据,通过判断RX FIFO是否为空,来确定是否有数据接收。当RX FIFO不为空时,可以通过读取RX寄存器中的值来获取接收到的数据。同时,还需要检查RX寄存器的状态位,以便进一步判断接收是否完成。在数据接收完毕后,需要对数据进行解析和处理,以便进行后续的操作。 总的来说,在Zynq PS中,实现UART接收需要进行波特率的配置和状态位的判断,同时需要注意数据的解析和处理。只有这样,才能做到正确的数据接收,并能够进行后续的操作。 ### 回答3: Zynq PS UART接收是指在Zynq系列芯片的处理系统(PS)中通过UART(通用异步收发传输)接口进行数据接收的过程。UART是一种通信协议,它可以通过串口进行全双工、半双工或单向的数据传输,常用于微处理器和外设之间的通讯。 在Zynq PS中,UART接口可以通过寄存器配置来实现数据接收方式的设置。首先需要配置UART的参数,包括波特率、字节长度、停止位和校验位等,以便与发送进行匹配。然后可以通过使用读取寄存器的方法,从接收队列中读取数据。如果接收队列中有可用数据,则读取寄存器中的值为已接收数据的字节,如果接收队列无数据,则读取寄存器中的值为0。 在进行UART接收时,需要注意以下几点:首先,需要保证两通讯的波特率、字节长度等参数设置相同,否则无法正常通讯。其次,应对接收缓冲区进行管理,避免接收到大量数据时导致缓冲区溢出,而程序无法正常工作。最后,需要注意异常情况的处理,例如接收到错误数据或超时等情况,应该进行相应的处理,确保程序的稳定性和可靠性。 综上所述,Zynq PS UART接收需要对参数进行设置,并进行队列管理和异常处理,最终才能实现可靠的数据接收

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值