GPIO外设一般用于控制一些简单的外设,如LED、按键和蜂鸣器等,GPIO可以通过MIO连接到PS端的引脚,也可以通过EMIO连接到PL。
ZYNQ系列芯片一般有54个MIO,位于bank0(3.3V,32个MIO)和bank1(1.8V,22个MIO),这些IO与PS直接相连,不需要添加引脚约束。bank2和bank3连接到EMIO,用于扩展的MIO,即EMIO。
根据原理图(米联客7z030)可以看到MIO7连接一个LED,我们对此IO进行控制。
GPIO的状态和控制寄存器的基地址为:0xe000_a000,如SDK中所示:
GPIO的地址映射范围为:0xe000_a000~0xe000_afff,SDK软件底层操作是对于内存地址空间的操作。
创建vivaodo工程,创建block design,由于只使用一个MIO7上的LED进行测试,可添加一个uart窗口打印,配置DDR,由于未使用PL逻辑,可以不生成bitstream,创建好项目,不必输出bitstream,运行综合后启动SDK。
在SDK中,按住“ctrl”键时点击函数即可跳转到对应的函数定义。
在SDK中的bsp项目下的system.mss文件下有对应硬件的实例驱动程序。
在SDK中创建empty project,添加以下代码即可实现流水灯:
#include"xparameters.h"//包含器件参数信息
#include"xgpiops.h" //包含PS GPIO的函数声明
#include"xstatus.h" //包含XST_FAILUR和XST_SUCCESS
#include<xil_printf.h> //包含print()函数
#include<sleep.h> //包含sleep()函数
//宏定义GPIO_DEVICE_ID
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
//连接到MIO的LED
#define MIOLED0 7 //connect to MIO7
XGpioPs Gpio; //GPIO设备的驱动实例
int main()
{
int Status;
XGpioPs_Config *ConfigPtr;
print("MIO Test!\n\r");
ConfigPtr=XGpioPs_LookupConfig(GPIO_DEVICE_ID);
Status=XGpioPs_CfgInitialize(&Gpio,ConfigPtr,ConfigPtr->BaseAddr);
//判断是否配置成功
if(Status!=XST_SUCCESS) return XST_FAILURE;
//指定引脚方向 0: input 1:output
XGpioPs_SetDirectionPin(&Gpio,MIOLED0,1);
//使能指定管脚输出 0:disable 1:enable
XGpioPs_SetOutputEnablePin(&Gpio,MIOLED0,1);
while(1)
{
XGpioPs_WritePin(&Gpio, MIOLED0, 0x0); //向指定引脚写入数据:0或1
sleep(1); //延时1秒
XGpioPs_WritePin(&Gpio, MIOLED0, 0x1);
sleep(1); //延时1秒
}
return XST_SUCCESS;
}