zynq学习之MIO/EMIO

1、MIO

Zynq7000 系列芯片有 54 个 MIO(multiuse I/O),多功能I/O,它们分配在 GPIO 的 Bank0 和Bank1 隶属于 PS 部分,这些 IO 与 PS 直接相连。不需要添加引脚约束,MIO 信号对 PL部分是透明的,不可见。所以对 MIO 的操作可以看作是纯 PS 的操作。GPIO 的控制和状态寄存器基地址为:0xE000_A000,我们 SDK 下软件操作底层都是对于内存地址空间的操作。

一个GPIO端口至少需要两个寄存器,一个控制用的通用IO口控制寄存器和一个存放数据的通用IO端口数据寄存器。

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

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

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

2、EMIO

 (1)EMIO 在 PL 部分,输入与 OEN 寄存器( 输出使能,当 OEN[x]==0 的时候输出关闭,PIN 脚处于三态)无关,当 DIRM (此寄存器控制输出的开关,当 DIRM[x]==0 时候,禁止输出)设置为 0 的时候设置为输入可以读 DATA_RO 寄存器(此寄存器使能软件观察 PIN 脚,当 GPIO 被配置成输出的时候,这个寄存器的值会反应输出的 PIN 脚情况)获取数据。

(2)EMIOGPIOTN[x]=DIRM[x] & OEN[x],实现输出的控制


Bank2和Bank3通过EMIO接口将CPU的GPIO连接到PL部分的引脚上,PL可进行逻辑设计,然后PS部分像控制普通的MIO一样进行编程,EMIO必须进行硬件配置,PS部分使用SDK编程控制。

3、ps的MIO的使用实例:通过操作该 MIO7来实现 LD9 的闪烁

#include "xgpiops.h"
#include "sleep.h"
int main()
{
static XGpioPs psGpioInstancePtr;//这是一个指针实例,指向的我们添加进来的 GPIO 端口
XGpioPs_Config* GpioConfigPtr;//也是一个指针实例
int iPinNumber= 7; //LD9连接的是MIO7, 这个参数,是告知程序,操作的 MIO 是哪一个
u32 uPinDirection = 0x1; //1表示输出,0表示输入
int xStatus;
//--MIO的初始化
GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);//查找 GPIO 的配置,然后判断其是否为空,若为空则返回查找失败

//XGpiops_Lookupconfig()这个函数是一个 xilinx 官方提供的 GPIO的查找配置的函数,程序的参数为要查找的 GPIO 的基地址。

if(GpioConfigPtr == NULL)
return XST_FAILURE;
xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr,GpioConfigPtr,
GpioConfigPtr->BaseAddr);//完成的是 gpio 配置的初始化工作,如果初始化不成功的话,将通过串口打印出一串初始化失败的通知信息
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);//延时
XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 0);//熄灭MIO的第7位输出0
usleep(500000);//延时
}
/****************************************************************
while(1)
{
XGpioPs_WriteReg(0xE000A000,0x00000000, 0xFF7FFFFF&0xFFFF0080);
usleep(500000);//延时
XGpioPs_WriteReg(0xE000A000,0x00000000, 0xFF7FFFFF&0xFFFF0000);
usleep(500000);//延时
}
******************************************************************/
return 0;
}

4、PL的EMIO的shiy


  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值