总结一下zynq的GPIO应用
zynq的GPIO分为PS部分的MIO和PS-PL配合使用的EMIO(用PL端的IO扩展GPIO),由PS调度。这里描述一下这个EMIO的应用。
IP的方式扩展IO
在vivado下配置AXI接口的GPIO
这里例化了两组GPIO,一组作为 LED的输出IO,一组作为按键的输入IO,采用中断方式检测电平变化
#include <stdio.h>
#include <xgpio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xscugic.h"
#include "xscutimer.h"
#include "./inc/gpio.h"
static XGpio led_out_4b;
static XGpio BTNInst;
static XScuGic INTCInst;
int XGpio_InterruptInitialize(void)
{
int status;
printf("LED 4bit Init.............\r\n");
status = XGpio_Initialize(&led_out_4b,XPAR_AXI_GPIO_0_DEVICE_ID); //Init LED GPIO
if(status != XST_SUCCESS)
return XST_FAILURE;
XGpio_SetDataDirection(&led_out_4b,1,0x00); //Set GPIO as output
status = XGpio_Initialize(&BTNInst, BTNS_DEVICE_ID);
if(status != XST_SUCCESS)
return XST_FAILURE;
XGpio_SetDataDirection(&BTNInst, 1, 0xFF);
printf("EXIT InterruptInitialize......\r\n");
status = IntcInitFunction(EXIT_INTC_DEVICE_ID, &BTNInst);
if(status != XST_SUCCESS)
return XST_FAILURE;
return XST_SUCCESS;
}
//----------------------------------------------------
// INTERRUPT SETUP FUNCTIONS
//----------------------------------------------------
int IntcInitFunction(u16 DeviceId, XGpio *GpioInstancePtr)
{
XScuGic_Config *IntcConfig;
int status;
// Interrupt controller initialization
IntcConfig = XScuGic_LookupConfig(DeviceId);
status = XScuGic_CfgInitialize(&INTCInst, IntcConfig,
IntcConfig->CpuBaseAddress);
if(status != XST_SUCCESS)
return XST_FAILURE;
// Register GIC interrupt han