当前位置: 首页 > article >正文

Zynq PS端外设之GPIO

1. GPIO(通用输入/输出)

GPIO外设有4个Bank,Bank0/1通过MIO连接到PS的引脚上;Bank2/3通过EMIO连接到PL的引脚上。
注意:Bank1的电平要改成LVCOMS 1.8

  • GPIO寄存器
    在这里插入图片描述

    寄存器:
    DATA_RO:	读取GPIO的输入
    DATA:		设置GPIO的输出值
    MASK_DATA_LSW/MASK_DATA_MSW:	数据掩码寄存器,MASK_DATA_LSW 控制Bank的低16位,MASK_DATA_MSW控制高16位
    DIRM:		方向模式寄存器,控制I/O引脚是输入还是输出
    OEN:		使能输出寄存器,控制是否启用输出
    

2.GPIO的使用

2.1 MIO

MIO不需要添加引脚约束,Zynq勾选MIO,SDK即可直接使用GPIO。

  • Vivado开发
    在这里插入图片描述

  • SDK开发

#include "xparameters.h" //器件参数信息
#include "xstatus.h"     //包含XST_FAILURE和XST_SUCCESS的宏定义
#include "xil_printf.h"  //包含print()函数
#include "xgpiops.h"     //包含PS GPIO的函数

#define GPIO_DEVICE_ID      XPAR_XGPIOPS_0_DEVICE_ID
#define MIOLED0    0     //连接到MIO0

int main()
{
	// 1.初始化GPIO
    int Status;
    XGpioPs Gpio;
    XGpioPs_Config *ConfigPtr;
    ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
    Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);
    if (Status != XST_SUCCESS){
        return XST_FAILURE;
    }
    // 2.设置指定引脚的方向:0输入,1输出
    XGpioPs_SetDirectionPin(&Gpio, MIOLED0, 1);
    // 3.使能指定引脚输出:0禁止输出使能,1使能输出
    XGpioPs_SetOutputEnablePin(&Gpio, MIOLED0, 1);
	// 4.向指定引脚写入数据:0或1
    XGpioPs_WritePin(&Gpio, MIOLED0, 0x0);
    while (1);
    return XST_SUCCESS;
}

2.2 EMIO

EMIO(Extended MIO,扩展的MIO)

  • Vivado开发

    1. 勾选EMIO
      在这里插入图片描述
    2. 引出管脚并添加管脚约束
      在这里插入图片描述
  • SDK开发

    #include "stdio.h"
    #include "xparameters.h"
    #include "xgpiops.h"
    
    #define GPIOPS_ID XPAR_XGPIOPS_0_DEVICE_ID   //PS端  GPIO器件 ID
    #define EMIO_KEY 54  //PL_KEY0 连接到EMIO0
    
    int main()
    {
    	// 1.初始化GPIO
        XGpioPs gpiops_inst;
        XGpioPs_Config *gpiops_cfg_ptr;
        gpiops_cfg_ptr = XGpioPs_LookupConfig(GPIOPS_ID);
        XGpioPs_CfgInitialize(&gpiops_inst, gpiops_cfg_ptr, gpiops_cfg_ptr->BaseAddr);
        
       	// 2.设置指定引脚的方向:0输入,1输出
        XGpioPs_SetDirectionPin(&gpiops_inst, EMIO_KEY, 0);
        
        // 3.读取GPIO的值
        char key_value = 0;
        XGpioPs_ReadPin(&gpiops_inst, EMIO_KEY);
    
        while(1){}
        
        return 0;
    }
    

    注意:BANK2的EMIO0编号为 54 (从0 开始编号)


http://www.kler.cn/a/457942.html

相关文章:

  • IDEA 搭建 SpringBoot 项目之配置 Maven
  • 【阻塞队列】- ArrayBlockingQueue 的原理-迭代器
  • Gemma2 2B 模型的model.safetensors.index.json文件解析
  • Linux-mac地址
  • Unity Mesh生成Cube
  • 基于深度学习的视觉检测小项目(二) 环境和框架搭建
  • 复习打卡大数据篇——Hadoop YARN
  • 安装winserver2008R2虚拟机步骤
  • Github Copilot 插件更新失败
  • 留学生交流互动系统|Java|SSM|VUE| 前后端分离
  • Day59 图论part09
  • Lumos学习王佩丰Excel第二十三讲:饼图美化与PPT图表
  • 添砖java第四更@(+)@
  • 594: Maximum Tape Utilization Ratio
  • netcat和nmap的区别
  • C++ 设计模式:桥接模式(Bridge Pattern)
  • imgproxy图像处理的高效与安全
  • 语言模型评价指标
  • Android笔试面试题AI答之Android基础(5)
  • stm32系列MCU介绍
  • 4.FPGA如何实现设计
  • 动态规划四——子序列系列
  • 回归预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络多输入单输出回归预测
  • 基于Qt中QMessageBox类的登陆界面对话框应用
  • springBoot使用groovy脚本
  • vulnhub靶场【Hotwarts】之Dobby