自学内容网 自学内容网

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 开始编号)


原文地址:https://blog.csdn.net/Mr_Unicorn/article/details/144789771

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!