MIO、EMIO、AXI_GPIO

参考:
https://www.jianshu.com/p/f9a3b36b25f6
https://blog.csdn.net/weixin_42066185/article/details/104066170
 

1 MIO

从ZYNQ的PS部分连接到FPGA的外部管脚,引脚位置固定所以不需要添加引脚约束,仅使用MIO可不下载bit文件。

xparameters.h

#define XPAR_PS7_GPIO_0_DEVICE_ID 0

#define XPAR_PS7_GPIO_0_BASEADDR 0xE000A000

#define XPAR_PS7_GPIO_0_HIGHADDR 0xE000AFFF

GPxCON寄存器为控制寄存器,它的每一位对应一个引脚,其某位设为0,相应的引脚为输出引脚,为1时为输入引脚。

GPxDAT为数据寄存器,当引脚设为输入时,读此寄存器可以知道相应的引脚的电平状态为高还是低,当引脚设为输出时,写此寄存器可令此引脚输出为高电平或者低电平。

Bank0有32个MIO引脚,Bank1有22个MIO引脚,54个引脚直接通过MIO连接到PS上,不需硬件配置,直接使用SDK软件进行编程。

2 EMIO

从ZYNQ的PS连接到PL,需要经过PL的用户逻辑才能达到FPGA管脚。由于使用了PL,需要下载bit文件。

#include "xgpiops.h"

#define GPIO_DEVICE_ID      XPAR_XGPIOPS_0_DEVICE_ID//xparameters.h
XGpioPs_Config *ConfigPtr; //结构体   共有两个参数,一个参数是id  一个是器件的及地址
XGpioPs Gpio;    /* The driver instance for GPIO Device. */

#define EMIO_LED 54 //0~53对应MIO,54对应EMIO0

#define EMIO_KEY 55 //0~53对应MIO,55对应EMIO1

 /* Initialize the GPIO driver. */

//根据器件的id 然后查找器件的配置信息

ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);

 

 //初始化gpio 驱动

XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);

 

//设置方向输出(0是输入  1 是输出)

XGpioPs_SetDirectionPin(&Gpio, EMIO_LED, 1);

XGpioPs_SetDirectionPin(&Gpio, EMIO_KEY, 0);

 

//0 是关闭输出使能 1 是打开输出使能

XGpioPs_SetOutputEnablePin(&Gpio, EMIO_LED, 1);

XGpioPs_SetOutputEnablePin(&Gpio, EMIO_KEY, 1);

 

//写数据到GPIO的输出的引脚

XGpioPs_WritePin(&Gpio, MIO0_LED, 1);

 

//读取按键的状态

key_value = XGpioPs_ReadPin(&Gpio,EMIO_KEY);

3 AXI_GPIO

ZYNQ的PS通过AXI总线产生GPIO

4 总结

1.对MIO或EMIO gpio进行操作,都属于PS,引用xgpiops.h文件,对AXI_gpio引用xgpio.h

2.PL输出信号绑定引脚。

3.参考自己板子的电路图

 



posted @ 2021-09-30 16:17  km_zzy  阅读(399)  评论(0编辑  收藏  举报