Zynq-7000 ARM端MIO的使用

作者:OpenSLee

1. 背景知识

Xilinx Zynq-7000 芯片的PS端MIO(multiuse I/O)所在位置如下图红色框所示。MIO(0:15)在bank0上,MIO(16:53)在bank1上。他们不需要管脚约束,既可以当做PS 端普通的IO也可以用做PS端SPI、I2C、CAN等总线。

本节将使用MIO的GPIO功能实现LED流水灯。

2. MIO流水灯实验
对于工程的创建在此不再赘述。可参考《Zynq-7000 ARM端helloworld实验

1) ZYNQ7 Processing System GPIO的设置

点击MIO Configuration>>选中GPIO MIO如下图所示。其他配置根据自己的开发板设置。

2) 生成processing_system7_0

3) launch SDK

(1)首先选中system右键选中Generate Output Products...

(2)选中system右键选中Create HDL Wrapper...

(3)导出硬件 选择菜单File->Export->Export Hardware...。这里不包括bitstream

(4)Launch SDK 选择菜单File->Launch SDK,启动SDK环境。

4)SDK编程

(1) 新建APP

点击FILE>>Application Project>>Project name>>Next

选着空工程Empty Application>>Finish

(2)编写代码main.c

#include "xgpiops.h"

#include "sleep.h"

int main()

{

static XGpioPs psGpioInstancePtr;

XGpioPs_Config* GpioConfigPtr;

int Led0 = 0; //MIO0_led

int Led1 = 13; //MIO13_LED

u32 uPinDirection = 0x1;//1表示输出,0表示输入

int xStatus;

//--MIO的初始化

GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);

if(GpioConfigPtr == NULL)

return XST_FAILURE;

xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr,GpioConfigPtr, GpioConfigPtr->BaseAddr);

if(XST_SUCCESS != xStatus)

print(" PS GPIO INIT FAILED \n\r");

//--MIO的输入输出操作

XGpioPs_SetDirectionPin(&psGpioInstancePtr, Led0,uPinDirection);//配置MIO输出方向

XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, Led0,1);//配置MIO的第0位输出

XGpioPs_SetDirectionPin(&psGpioInstancePtr, Led1,uPinDirection);//配置MIO输出方向

XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, Led1,1);//配置MIO的第13位输出

while(1)

{

XGpioPs_WritePin(&psGpioInstancePtr, Led0, 0);//MIO的第0位输出0

XGpioPs_WritePin(&psGpioInstancePtr, Led1, 1);//MIO的第13位输出1

sleep(1);//延时

XGpioPs_WritePin(&psGpioInstancePtr, Led0, 1);//MIO的第0位输出1

XGpioPs_WritePin(&psGpioInstancePtr, Led1, 0);//MIO的第13位输出0

sleep(1);//延时

}

return 0;

}

这里的0和13是电路图上PS端LED灯的所在位置如下图

(3)下载实现

连接好硬件和打开串口工具后,右键选择MIO_test工程,再选择Run as->1. Launch on Hardware (sysntem Debugger)

视频欣赏

总结:

本节通过ARM的MIO(GPIO)来点亮LED灯实现流水灯,通过使用函数库编程,熟悉了SDK开发的工程。

文章转载自:FPGA开源工作室

推荐阅读