MYIR-ZYNQ7000系列-zturn教程(18):基础教程gpio_mio做为输入口

本文介绍了在vivado 2017.4环境下,将Zynq开发板的gpio_mio作为输入口使用的方法。包括gpio_mio的分布、涉及的寄存器及读写操作,还说明了硬件设置,如选择SD卡和uart、设置时钟和DDR型号等,最后给出工程代码及运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发板环境:vivado 2017.4 ,开发板型号xc7z020clg400-1,这个工程主要介绍怎样将gpio_mo做为输入口使用

工程链接:百度网盘 请输入提取码 密码:glpq

从这个ug585手册可以看到gpio_mio主要分布在这个Bank0 和Bank1上。这里主要介绍gpio_mio暂时不介绍gpio_emio

这个Bank0主要是mio0~mio31

Bank1主要是mio31~mio53

这里继续介绍gpio_mio做为输入要涉及到的寄存器

这个DIRAM_0主要设置gpio_mio的mio0~mio31的输入输出设置:设为0为输入、设置为1为输出

这个DIRAM_1主要设置gpio_mio的mio32~mio53的输入输出设置:设为0为输入、设置为1为输出

既然我们设置为输入,那么输入的数据必定有存储的寄存器,下面我来看下这些存储器

这个DATA_0_RO主要存储这个mio0~mio31的输入数据,这个是一个32位的寄存器,寄存器的偏移地址是0x00000060

这个DATA_1_RO主要存储这个mio32~mio53的输入数据,这个是一个22位的寄存器,寄存器的偏移地址是0x00000064

我们一般对一个寄存器进行写一般是:

Xil_Out32(基地址+偏移地址,数据)

比如对这个0x00000244进行写:Xil_Out32(0xE000A000 + 0x00000244,0x00)对这个0x00000244寄存器写入数据0x00,这里的基地址是0xE000A000

一般对一个寄存器进行读:

data = Xil_In32(基地址+偏移地址)

比如对这个0x00000064进行读:data = Xil_In32(0xE000A000 + 0x00000064)

硬件设置

因z-turn开发板的mio50上面接了一个开关,所以主要接收这个管脚的输入值

从这个图可以看出没有按开关输入为1,按下开关输入为0

Step1 新建vivado 工程,我这里选择了SD卡和uart

勾选gpio_mio

我们前面勾选了这个SD和uart使用了MIO40~MIO45、MIO48~MIO49

我们可以看到下面的gpio_mio中没有这个MIO40~MIO45和MIO48~MIO49,这个mio和gpio_mio是不能同时使用的,

也就是说当你使用这个mio48那么你在gpio_mio中就无法再使用这个gpio_mio48这两个是互斥的,gpio_mio说得

简单点就是将mio的管脚拿过来做为gpio_mio使用。

设置sd时钟为50M

设置DDR型号(不同的开发板有差异)

最后按照这个截图进行连接就可以了

Step2 进行综合、生成顶层文件、生成bit文件


顶层文件如下图所示

//Copyright 1986-2017 Xilinx, Inc. All Rights Reserved.
//--------------------------------------------------------------------------------
//Tool Version: Vivado v.2017.4 (win64) Build 2086221 Fri Dec 15 20:55:39 MST 2017
//Date        : Fri Aug 31 19:22:18 2018
//Host        : taowei running 64-bit Service Pack 1  (build 7601)
//Command     : generate_target design_1_wrapper.bd
//Design      : design_1_wrapper
//Purpose     : IP block netlist
//--------------------------------------------------------------------------------
`timescale 1 ps / 1 ps

module design_1_wrapper
   (DDR_addr,
    DDR_ba,
    DDR_cas_n,
    DDR_ck_n,
    DDR_ck_p,
    DDR_cke,
    DDR_cs_n,
    DDR_dm,
    DDR_dq,
    DDR_dqs_n,
    DDR_dqs_p,
    DDR_odt,
    DDR_ras_n,
    DDR_reset_n,
    DDR_we_n,
    FIXED_IO_ddr_vrn,
    FIXED_IO_ddr_vrp,
    FIXED_IO_mio,
    FIXED_IO_ps_clk,
    FIXED_IO_ps_porb,
    FIXED_IO_ps_srstb);
  inout [14:0]DDR_addr;
  inout [2:0]DDR_ba;
  inout DDR_cas_n;
  inout DDR_ck_n;
  inout DDR_ck_p;
  inout DDR_cke;
  inout DDR_cs_n;
  inout [3:0]DDR_dm;
  inout [31:0]DDR_dq;
  inout [3:0]DDR_dqs_n;
  inout [3:0]DDR_dqs_p;
  inout DDR_odt;
  inout DDR_ras_n;
  inout DDR_reset_n;
  inout DDR_we_n;
  inout FIXED_IO_ddr_vrn;
  inout FIXED_IO_ddr_vrp;
  inout [53:0]FIXED_IO_mio;
  inout FIXED_IO_ps_clk;
  inout FIXED_IO_ps_porb;
  inout FIXED_IO_ps_srstb;

  wire [14:0]DDR_addr;
  wire [2:0]DDR_ba;
  wire DDR_cas_n;
  wire DDR_ck_n;
  wire DDR_ck_p;
  wire DDR_cke;
  wire DDR_cs_n;
  wire [3:0]DDR_dm;
  wire [31:0]DDR_dq;
  wire [3:0]DDR_dqs_n;
  wire [3:0]DDR_dqs_p;
  wire DDR_odt;
  wire DDR_ras_n;
  wire DDR_reset_n;
  wire DDR_we_n;
  wire FIXED_IO_ddr_vrn;
  wire FIXED_IO_ddr_vrp;
  wire [53:0]FIXED_IO_mio;
  wire FIXED_IO_ps_clk;
  wire FIXED_IO_ps_porb;
  wire FIXED_IO_ps_srstb;

  design_1 design_1_i
       (.DDR_addr(DDR_addr),
        .DDR_ba(DDR_ba),
        .DDR_cas_n(DDR_cas_n),
        .DDR_ck_n(DDR_ck_n),
        .DDR_ck_p(DDR_ck_p),
        .DDR_cke(DDR_cke),
        .DDR_cs_n(DDR_cs_n),
        .DDR_dm(DDR_dm),
        .DDR_dq(DDR_dq),
        .DDR_dqs_n(DDR_dqs_n),
        .DDR_dqs_p(DDR_dqs_p),
        .DDR_odt(DDR_odt),
        .DDR_ras_n(DDR_ras_n),
        .DDR_reset_n(DDR_reset_n),
        .DDR_we_n(DDR_we_n),
        .FIXED_IO_ddr_vrn(FIXED_IO_ddr_vrn),
        .FIXED_IO_ddr_vrp(FIXED_IO_ddr_vrp),
        .FIXED_IO_mio(FIXED_IO_mio),
        .FIXED_IO_ps_clk(FIXED_IO_ps_clk),
        .FIXED_IO_ps_porb(FIXED_IO_ps_porb),
        .FIXED_IO_ps_srstb(FIXED_IO_ps_srstb));
endmodule

Step3  导出硬件配置、打开SDK

Step4 新建一个fsbl、新建一个gpio_mio工程

hello_world模板

工程代码

/******************************************************************************
*
* Copyright (C) 2009 - 2014 Xilinx, Inc.  All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* Use of the Software is limited solely to applications:
* (a) running on a Xilinx device, or
* (b) that interact with a Xilinx device through a bus or interconnect.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* XILINX  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* Except as contained in this notice, the name of the Xilinx shall not be used
* in advertising or otherwise to promote the sale, use or other dealings in
* this Software without prior written authorization from Xilinx.
*
******************************************************************************/

/*
 * helloworld.c: simple test application
 *
 * This application configures UART 16550 to baud rate 9600.
 * PS7 UART (Zynq) is not initialized by this application, since
 * bootrom/bsp configures it to baud rate 115200
 *
 * ------------------------------------------------
 * | UART TYPE   BAUD RATE                        |
 * ------------------------------------------------
 *   uartns550   9600
 *   uartlite    Configurable only in HW design
 *   ps7_uart    115200 (configured by bootrom/bsp)
 */

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xil_io.h"
#include "sleep.h"


#define	Base_Address	0xE000A000

#define	DIRM_0			0x00000204 //mio0~mio31

#define	DIRM_1			0x00000244 //mio32~mio53

#define	DATA_0_RO		0x00000060 //mio0~mio31  data

#define	DATA_1_RO		0x00000064 //mio32~mio53 data




int main()
{
	u32 rxdb1;
	u32 rxdb2;

	Xil_Out32(Base_Address + DIRM_1,0x00);   //模式设置:设置mio32~mio53为输入    (0为输入    1为输出)


while(1)
  {
	rxdb1 = Xil_In32(Base_Address +  DATA_1_RO);    //接收mio32~mio53的输入数据(22位数据)

	rxdb2 = (rxdb1 & 0x040000) ;                   //只取这个mio50的数据

	xil_printf("rxdb2 = %08x\n\r",rxdb2);          //打印mio50的输出数据

    sleep(1);

  }

}

生成BOOT.bin文件后将BOOT.bin文件拷贝到SD卡运行,运行结果如下图所示

这里是rxdb1的输出数据,可能大家会奇怪这个mio32~mio53输入数据为什么不全为0,因开发板的ps端的mio都接入了不同的设备,而这些设备上电后有的设备是高电平、有的设备是低电平所以输入值不全为0

我们再来看下rxdb2的输出,rxdb2是直接接收的mio50的值也就是按键的值,这个是没有按按键的输出

这个是按了按键的输出,按了按键输入变成0了,然后松开后又为高了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值