从0开始学Zedboard(1)PS_GPIO控制
0赞GPIO英文全称为General-Purpose Input/Output Ports,通用IO端口,在嵌入式系统中,通常要控制许多结构简单的外部设备或者电路,这些设备有的需要通过CPU控制,有的需要为CPU提供输入信号。并且,许多设备或者电路只要求有开/关两种状态,比如LED灯的亮与灭。所以在嵌入式微处理器上就通常提供一种通用可编程IO端口,也就是我们今天的主角GPIO。
Zedboard主处理芯片XC7Z020-CLG481-1 GPIO由4个Bank组成,如图1所以,Bank0、Bank1分别有32、22个GPIO引脚,通过MIO链接到PS上,每个引脚可以通过寄存器设置来确认该引脚为输入、输出或者中断。因为每个54个MIO直接连接在PS上,像其他ARM一样不需要通过VIVADO进行硬件配置,直接通过SDK软件进行编程即可。
Bank2、Bank3通过EMIO接口将CPU的GPIO连接到PL部分引脚上,其中每个Bank有32个引脚。通过EMIO扩展的GPIO可以在PL部分进行逻辑设计,进行特定功能IP核定制。因此, 必须通过VIVADO进行配置,然后再使用SDK进行编程控制。
图1 GPIO系统图
本章先介绍PS部分的GPIO的控制,通过SDK控制MIO。(我的环境是WIN7+VIVADO2014.2)。SDK中提供了控制PS中GPIO的API接口,在gpiops.h中可以找到。
在VIVADO中建立新工程(选择zedboard)->creat block design->Add IP ZYNQ7 ps->auto->Generate Bitstream(顶层如图2所示)->Export hardware and lunch SDK->在SDK中新建helloworld模板,将helloworld.c中的代码改为:
图2 VIVADO工程
////////代码开始/////////////// #include#include "platform.h" #include "xgpiops.h" #include "xgpio.h" int main() { static XGpio psGpioInstancePtr; XGpioPs_Config* GpioConfigPtr; int iPinNumber= 7;//zedboar开发板上LD9连接的是PS_MIO7 u32 uPinDirection = 0x1;//1表示输出,0表示输入 int xStatus; init_platform(); print("Hellow GPIO\n\r"); ////////////////////////////////////查找配置//////////////////////////////// GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID); if(GpioConfigPtr == NULL) return XST_FAILURE; ////////////PSGPIO初始化,成功返回XST_SUCCESS,失败打印"PS GPIO INIT FAILED"//////////////////// xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr,GpioConfigPtr, GpioConfigPtr->BaseAddr); if(XST_SUCCESS != xStatus) print(" PS GPIO INIT FAILED \n\r"); /////////////////////////////////利用gpiops.h中的API点灯/////////////////////////////////// XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber,uPinDirection);//设置0为输入和1为输出 XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber,1);//输出使能拉高,输出有效 XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 1);//管脚置1,输出高电平,点亮LD9灯 XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 0);//管脚置0,输出高电平,点亮LD9灭 return 0; } //////代码结束//////////////
然后保存,编译会发现少xgpio.h和xgpio_l.h两个头文件,在Xilinx安装目录去搜索然后加进工程里就可以编译成功了。将Zedboard通过JTAG-USB 连接至电脑,打开zedboard电源,从串口-USB连接至电脑,打开终端(比如Tera Term)。点击debug as gpio(工程名),大家可以一步一步看看,程序是怎么运行的。如果直接run看不见灯亮的,为什么大家可以自己去想想。