作者: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开源工作室