ZYNQ学习之——MIO

1、GPIO基础知识

  Zynq7000 系列芯片有 54 个 MIO(multiuse I/O) ,它们分配在 GPIO 的 Bank0 和Bank1 隶属于 PS 部分, 这些 IO 与 PS 直接相连。 不需要添加引脚约束, MIO 信号对 PL部分是不可见,即PL不能对这部分IO信号进行任何操作。 所以对 MIO 的操作可以看作是纯 PS 的操作。 参考芯片手册看到

  Bank0:MI0[31:0]
  Bank1:MI0[52:53]
  Bank2:EMI0[31:0]
  Bank3:EMI0[63:32]

GPIO 的控制寄存器地址空间

很多寄存器,但是一般的操作关注部分寄存器就可以了。

DATA_RO: 此寄存器使能软件观察 PIN 脚, 当 GPIO 被配置成输出的时候, 这个寄存器的值会反应输出的 PIN 脚情况。
DATA:此寄存器控制输出到 GPIO 的值, 读这个寄存器的值可以读到最后一次写入该寄存器的值。
MASK_DATA_LSW:位操作寄存器, 写入 GPIO 低 16bit 其他没有改变的位置保存原先的状态
MASK_DATA_MSW:位操作寄存器, 写入 GPIO 高 16bit 其他没有改变的位置保存原先的状态
DIRM:此寄存器控制输出的开关, 当 DIRM[x]=0 时候, 禁止输出
OEN: 输出使能, 当 OEN[x]=0 的时候输出关闭, PIN 脚处于三态
因此, 如果要读 IO 状态就得读 DATA_RO 的值, 如果是对某一位进行操作就是写
MASK_DATA_LSW/MASK_DATA_MSW
具体的相关参数请参考技术手册 ug585-Zynq-7000-TRM.pdf

2、FPGA硬件创建。

  MIO的操作硬件创建比较简单,外置只需添加MIO外置就可以了。

然后编译导出硬件到SDK软件中。

3、SDK软件

  首先就是要创建一个APP工程,这里就不做讲解了。看一下软件设计,就是纯C开发了。

    

 #include "xgpiops.h"
 #include "sleep.h"
 int main()
 {
    static XGpioPs psGpioInstancePtr;
    XGpioPs_Config* GpioConfigPtr;
    int iPinNumber= 7; //板子的LED连接的是MIO7,这个根据板子的硬件设计做对应修改
    u32 uPinDirection = 0x1; //设置IO方向。1表示输出,0表示输入
    int xStatus;

  //--MIO的初始化
    GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
    if(GpioConfigPtr == NULL)
    return XST_FAILURE;

    xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr,GpioConfigPtr, GpioConfigPtr->BaseAddr);
    if(XST_SUCCESS != xStatus)
    print(" PS GPIO INIT FAILED \n\r");
  //--MIO的输入输出操作
    XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber,uPinDirection);//配置MIO输出方向
    XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber,1);//配置MIO的第7位输出

    //以下是库函数的操作方式。
    /* while(1)
    {
      XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 1);//点亮MIO的第7位输出1
      usleep(500000); //us延时
      XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 0);//熄灭MIO的第7位输出0
      usleep(500000); //us延时
    }*/

    //以下是寄存器的操作方式。

    while(1)

    {
      XGpioPs_WriteReg(0xE000A000,0x00000000, 0xFF7FFFFF&0xFFFF0080);
      usleep(500000); //us延时
      XGpioPs_WriteReg(0xE000A000,0x00000000, 0xFF7FFFFF&0xFFFF0000);
      usleep(500000); //us延时
    }
  return 0;
}

分析以下一些Xilinx的函数:

GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);  查找对应ID设备是否存在,如果不存在出错,如果存在就可以做下一步的初始化。

可以查到

/* Definitions for peripheral PS7_GPIO_0 */
#define XPAR_PS7_GPIO_0_DEVICE_ID 0
#define XPAR_PS7_GPIO_0_BASEADDR 0xE000A000  //这个就是MIO的基地址
#define XPAR_PS7_GPIO_0_HIGHADDR 0xE000AFFF  //这个结束地址不需要管

时间: 2024-10-15 05:08:54

ZYNQ学习之——MIO的相关文章

zedboard zynq 学习 sobel 边缘检测 IP核 制作 根据 文档 Xapp890

官方文档http://www.xilinx.com/support/documentation/application_notes/xapp890-zynq-sobel-vivado-hls.pdf 准备工作 下载 工程文件 http://pan.baidu.com/s/1eQqwjBk 这是我用百度云分享的 如果不行了, 可以用 官方链接 https://secure.xilinx.com/webreg/clickthrough.do?cid=193509 sobel 算子边缘检测原理 这里不

Vivado Zynq 学习

目标 --------------------------------------------------- 视图菜单 (Vivado SDK) 文件目录 文件格式 流程:工程 -> 非工程 -> 脚本 Create Hardware Design Create Hardware IP Use    Hardware IP:  ARM AXI USB DMA RAM CLK RST Create Software Design 方法 ------------------------------

Zynq学习笔记(1)

做硬件的第一个实例,一般当然是LED点灯啦~ 硬件:ZedBoard 软件:ISE 14.7 1.新建工程 2.选择平台 3.新建完成后,输入如下代码: `timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 16:49:10 11/23/2014 // De

zynq学习 Video on Screen Display IP核许可申请

1.双击打开v_osd ip核 2.如图打开网页 3.进入官网需要登录,没账户的需要注册,点击红色方框内的蓝色字体即可注册 4.xilinx网站注册很蛋疼,我第一次注册一直报错,一定的按照注册说明来填,这儿是中文翻译的页面,可以参考一下 5.点击next 6.这个默认就勾上了,显示120天的使用期限,点击generate 7.然后弹出一个框,如图操作就行 7.又会弹出一个框,黄色框内按图选择,红色框内输入电脑的mac地址,要自己查 8.mac地址查询,网上百度一下很多,可以自己查,我这儿就一起说

IIC串行总线的组成及其工作原理

------------------最近项目上用到了一款美信的DS1308RTC芯片,由于是挂在了Zynq的PS MIO上,需要软件人员协助才能测试:觉得太麻烦了,想通过飞线,然后在Vivado中调用IIC的IP核,在PL端实现IIC的读写,借此验证此芯片的功能是否正常.因此简单学习一下IIC的协议,顺便借此提升一下对IIC的认识--------------- 常用的串行扩展总线有:IIC总线.SPI总线与UART总线. IIC总线只有两根双向信号线.一根是数据线SDA,另一根是时钟线SCL.

3.Adam Taylor玩转MicroZed系列第82部分:简单通信接口第2部分

By Adam Taylor 从上周的博客开始,我们已经进入到Zedboard(而不是MicroZed)板上的OLED显示模块的编程了.然而在正式进入具体的OLED编程之前,我认为有必要验证我们是否已经为应用正确地配置了SPI端口.这个操作可以为我们后续的步骤减少很多时间,并且做起来也很容易.事实上它确实很简单,本篇博客中我会展示两种不同的方法.第一种方法中会通过Zynq SoC的MIO来与SPI管脚接口,而第二种方法则会通过EMIO.两者的不同之处在哪里呢?请继续往下看. 我打算玩个小把戏.我

MiZ702学习笔记13——ZYNQ通过AXI-Lite与PL交互

在<MiZ702学习笔记7——尝试自制带总线IP>,我曾提到了AXI4-Lite的简单用法,驱动了下流水灯,只涉及到了写总线.今天,我想利用之前的VGA模块,将AXI4-Lite的读写都应用上.这篇文章主要是思想的介绍,以及AXI4-Lite读的方法.一些细节请先阅读<MiZ702学习笔记7——尝试自制带总线IP>. 具体思路为如下框图所示: 所以这次,我们需要两条AXI4-Lite总线,一条负责给VGA模块提供RGB数据(写),一条读取VGA模块提供的扫描的坐标信息(读). 点击

Zynq 7000从零开始之三 -- mio的gpio操作

本文讲述怎样使用PS的gpio,不涉及fpga部分,软件涉及到一级引导程序fsbl的创建及app的创建,程序运行在ddr中. z-turn板的mio 50引脚连接到了按键K1,该实验实现的功能为,检测按键并从串口打印出相应的信息. 1. 用vivado搭建硬件模型. 在block design的Re-customize IP界面,点击Presets->Apply Configuration, 定位到上章导出的memtest.tcl硬件配置文件. 点击MIO configuration->展开G

ZYNQ开发(二)GPIO之MIO的使用

一.原理说明 MIO的使用可以参考官方开发手册ug585-Zynq-7000-TRM,其中有较为详细的说明.Zynq7000 系列芯片有 54 个 MIO,它们分配在属于 PS 部分的 Bank0 和 Bank1, 这些 IO 与 PS 直接相连.注意GPIO操作的基地址为 0xE000_A000 .官方手册给出的如下的示意图: 另外官方也给出了相应的寄存器操作手册,方便我们在编程时直接进行寄存器的操作,提高执行效率. 二.操作步骤 1.因为购买的开发板上一个LED灯D29是与MIO 0脚相连的