目录

PS_UART

UART控制器简介

UART的MIO和EMIO管脚信号

设计指导

UART启动顺序

配置控制器功能

发送数据

接收数据

RXFIFO触发等级中断

寄存器概述

硬件系统

软件系统

基本使用

参考


PS_UART

UART控制器简介

UG585 – ch.19: UART Controller

ZYNQ的PS端有两个全双工异步串口收发器,支持广泛的可编程的波特率和I/O信号格式。

UART受配置寄存器和模式寄存器控制。独立的收发路径各自有一个64KB的FIFO,和一个模式开关支持配置回环。

UART0和UART1支持同样的特性。

模块示意图

UART的MIO和EMIO管脚信号

设计指导

UART启动顺序

  1. 复位控制器;
  2. 配置I/O信号路由。Rx/Tx可使用MIO/EMIO。调制解调控制信号仅在EMIO接口可用;
  3. 配置UART参考时钟UART_Ref_Clk;
  4. 配置控制器功能;
  5. 配置中断;中断用于管理Tx/Rx FIFOs在所有模式下。
  6. 配置调制解调控制(可选);轮询和中断驱动选项。
  7. 管理收发数据。支持轮询Polling和中断Interrupt方式驱动。

配置控制器功能

这些示例配置字符帧、波特率、FIFO触发等级、RX超时机制和控制器使能。

所有的这些步骤必须的复位后完成,但在使能和关闭控制器之间不必要。

  1. 配置UART字符帧。
  2. 配置波特率。
  3. 设置RxFIFO出发等级。
  4. 使能控制器。
  5. 配置接收器超时机制。

发送数据

软件可以使用轮询polling或中断interrupt控制TxFIFO和RxFIFO数据流。

使用轮询polling方式

  1. 检查TxFIFO是否空;
  2. 写数据到TxFIFO;写64B数据
  3. 写更多数据。
    1. 检查TxFIFO是否有空间写下个B数据。
    2. 检查TxFIFO是否空。

使用中断interrupt方式

  1. 无效TxFIFO空中断。
  2. 写数据到TxFIFO;写64B数据;
  3. 检查TxFIFO是否有空间写下一个B数据;
  4. 重复步骤2和3;
  5. 使能中断;
  6. 等待直到TxFIFO为空。

接收数据

使用轮询方式

  1. 等待,直到RxFIFO被填充到触发数量级;
  2. 读RxFIFO数据。
  3. 重复步骤2直到FIFO空;
  4. 清除标志,如果Rx超时中断被触发。

使用中断方式

  1. 使能中断;
  2. 等待,直到RxFIFO被填充到触发数量级或Rx超时;;
  3. 读RxFIFO数据;
  4. 重复步骤2和3直到FIFO空;
  5. 清除标志,如果Rx超时中断被触发。

RXFIFO触发等级中断

设置RxFIFO触发等级和使能中断

  1. 配置触发等级;
  2. 使能RTIRG中断;
  3. 无效RTIRG中断;
  4. 清除RTRIG中断标志。

寄存器概述

以上图文来源ug585 ch19

硬件系统

还是使用PS最小系统,仅使用UART1

软件系统

基本使用

在BSP界面选择导入示例工程

选择hello_world_example和selftest_example导入

在Explorer窗口可以看到导入的项目,以及代码主循环

两个工程可以直接编译运行,自测试和打印输出。

从两个示例工程代码可以看到四个主要基本函数,初始化、自测试和发送。

打开xuartps.h可以看到Vitis提供的函数

示例工程中使用的函数都在这里声明。

建立新的项目,添加几个.c和.h 文件。

代码如下

/** uart_main.c**  Created on: 2020/2/20*      Author: liny*//***************************** Include Files *********************************/
#include "uart_ps.h"/************************** Variable Definitions *****************************/
XUartPs Uart_Ps;        /* The instance of the UART Driver *//*****************************************************************************\
* Main function to call the Hello World example.
* @param   None
* @return
*       - XST_FAILURE if the Test Failed .
*       - A non-negative number indicating the number of characters
*         sent.
* @note        None
\*****************************************************************************/
int main(void)
{u8 SendBuf[] = "Hello World!\n";u8 RecvBuf[255] ;int Status ;u32 RecvCount =0;/* PS UART1 Initialization */Status = Uart_Init(&Uart_Ps, UART1_PS_DEVICE_ID);if (Status != XST_SUCCESS) {xil_printf("Uart PS initialization failed!%d\n",1);return XST_FAILURE;}else{xil_printf("Uart PS initialization completed!\r\n");}xil_printf("length : %d \n", (sizeof(SendBuf) ));/* forever transmit */while(1){sleep(1);//Status = Uart_Send(&Uart_Ps, SendBuf, (sizeof(SendBuf)));//xil_printf("SendCount : %d \n", Status );RecvCount = Uart_Recv(&Uart_Ps, RecvBuf, 16);Status = Uart_Send(&Uart_Ps, RecvBuf, RecvCount);}/* Never */return Status;
}
/** uart.c**  Created on: 2020/02/20*      Author: liny*/#include "uart_ps.h"/************************** Function Definition ******************************/
/*************************** Device Initialize *******************************/
int Uart_Init(XUartPs* Uart_Ps, u16 DeviceId){int Status;XUartPs_Config *Config;/** Initialize the UART driver so that it's ready to use* Look up the configuration in the config table,* then initialize it.*/Config = XUartPs_LookupConfig(DeviceId);if (NULL == Config) {return XST_FAILURE;}Status = XUartPs_CfgInitialize(Uart_Ps, Config, Config->BaseAddress);if (Status != XST_SUCCESS) {return XST_FAILURE;}/* Perform a self-test to check hardware build. */Status = XUartPs_SelfTest(Uart_Ps);if (Status != XST_SUCCESS) {return XST_FAILURE;}/* Set BaudRate */XUartPs_SetBaudRate(Uart_Ps, 115200);return XST_SUCCESS;
}/******************************* Date Send ***********************************/
int Uart_Send(XUartPs* Uart_Ps, u8 *sendbuf, int length){int SentCount = 0;//while (SentCount < length - 1) {while (SentCount < length ) {/* Transmit the data */SentCount += XUartPs_Send(Uart_Ps,&sendbuf[SentCount], 1);}return SentCount;
}/******************************* Date Recv ***********************************/
u32 Uart_Recv(XUartPs* Uart_Ps, u8 *recvbuf, u32 length){u32 RecvCount = 0;//u32 XUartPs_Recv(XUartPs *InstancePtr, u8 *BufferPtr, u32 NumBytes)RecvCount = XUartPs_Recv(Uart_Ps, recvbuf, length);return RecvCount;
}
/** uart_ps.h**  Created on: 2020/02/20*      Author: liny*/#ifndef SRC_UART_PS_H_
#define SRC_UART_PS_H_/***************************** Include Files *********************************/
#include "xparameters.h"
#include "xuartps.h"
#include "xil_printf.h"
#include "sleep.h"/**************************** Constant Define ********************************/
#define UART1_PS_DEVICE_ID XPAR_PS7_UART_1_DEVICE_ID
/************************** Function Prototypes ******************************/
int Uart_Init(XUartPs* Uart_Ps, u16 DeviceId);
int Uart_Send(XUartPs* Uart_Ps, u8 *sendbuf, int length);
u32 Uart_Recv();#endif /* SRC_UART_PS_H_ */

Debug模式下运行,通过接收一定长度的数据,进行回发。

完成!

参考

UG585:Zynq-7000 SoC Technical Reference Manual

ZYNQ基本使用(1) PS的UART基本使用相关推荐

  1. 【ZYNQ Ultrascale+ MPSOC FPGA教程】第二十一章 PS端UART读写控制

    原创声明: 本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处. 适用于板卡型号: AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E ...

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

    ZYNQ进阶之路14--PS端uart串口接收不定长数据 导语 ZYNQ串口简介 实现步骤 导语 繁忙的博主又来了,本节我们实现一个比较简单的东西:串口.之前的章节中我们也有使用PS端的串口进行收发数 ...

  3. ZYNQ开发系列——为PS和PL的交互做准备

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ZYNQ开发系列--为PS和PL的交互做准备 我们使用ZYNQ的片子,肯定存在PS和PL交互的情况.一般来说大部分应用都是以PS为主机 ...

  4. ZYNQ开发系列——把PS和PL程序烧写到FLASH中

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ZYNQ开发系列--把PS和PL程序烧写到FLASH中 生成 fsbl.elf 生成 BOOT.bin 下载 BOOT.bin 文件到 ...

  5. ZYNQ中AXI4-Lite实现PS与PL通信

    ZYNQ中AXI4-Lite实现PS与PL通信 0 前言 1 Vivado部分 2 Vitis部分 0 前言   ZYNQ开发中需要使用PS向PL发控制信号,PL将数据发给PL端处理,可以使用AXI4 ...

  6. Zynq 7000 PL和PS通信——使用BRAM

    Zynq 7000 PL和PS通信--使用BRAM 介绍 1 准备工作 2 PL搭建BRAM 3 下载PL程序 4 编写Linux应用程序 5 问题 5.1 BRAM的寻址的问题 5.2 PS地址映射 ...

  7. vivado中ZYNQ详解(主要用于PS和PL之间的工作衔接)

    可进qq群进行相关Verilog知识交流:1073030956 AXI的理解 AXI(Advanced extensible Interface)协议主要描述了Master设备和Slave设备之间的数 ...

  8. ZYNQ的PL控制PS的DDR

    本次工程是用PL端控制PS的DDR,下面是一些过程 1. 创建一个ZYNQ核 选择高速互联总线,因为DDR速率比较快,所以PS与PL端的交互,我们选择HP,高速AXI连接,位宽选择32,和DDR位宽保 ...

  9. ZYNQ linux环境下PS I2C配置OV5640

    平台:ubuntu虚拟机 ZYNQ7035 1.vivado编辑BD文件,设置两个IIC接口 2.设备树搭建,应用petalinux调用hdf直接生成 在Ubuntu虚拟机内搭建工程 source / ...

最新文章

  1. R语言ggplot2可视化自动换行适配长文本图例(legend)实战:Multiple Lines for Text per Legend Label
  2. 99%高精度、毫秒级延迟,AI便携式神经假肢让截肢14年患者运动自如
  3. SAP MM 如果存在OPEN的盘点凭证,则不能再次创建盘点凭证
  4. rstudio 修改代码间距_Windows电脑使用Rstudio会有多少错误呢
  5. 推荐系统炼丹笔记:推荐算法特征交叉新方式CAN
  6. 学会这几招让 Go 程序自己监控自己
  7. Postman status: 415_415亩!白云首宗农村土地规模化流转成功签约
  8. 牛客网 【每日一题】5月28日题目精讲 Protecting the Flowers
  9. 请求接口时使用时间戳
  10. 获取要素集中字段的唯一值
  11. jieba分词提取小说人名
  12. jQuery学习之路(1)-选择器
  13. 20+非常棒的Photoshop卡通设计教程
  14. 深挖AI价值与温度,AETA地震预测AI算法大赛开启
  15. 肝了这篇文章,我对服务器硬件有了深刻的认识!
  16. Shopnc之nginx配置
  17. linux在线文档库
  18. 苹果uwb_苹果电子追踪器即将发布,我们扒了扒产品背后的 UWB 超宽频技术
  19. select函数是怎么用的
  20. 医院管理信息系统 HIS EMR PACS LIS

热门文章

  1. 游戏闲聊之游戏是怎么赚钱的
  2. 若依集成JimuReport积木报表进行token传递
  3. llc变换器计算机仿真,SABER仿真在LLC谐振变换器开发与设计中的应用经典.PDF
  4. 基于jsp的汽车维修管理系统
  5. .hdu4288 Coder CF85-DSum of Medians
  6. 百度智能云2022届成都提前批校招开始啦
  7. Harbor配置Nginx反向代理,可以外网访问
  8. linux 同步授时中心的时间
  9. pe系统作为共享服务器,如何制作服务器winpe操作系统(制作带raid卡驱动的winpe系统)...
  10. 网页导航菜单制作——快,很快,非常快