GPIO中断控制LED亮灭,vivado设置与GPIO_MIO相同,SDK软件的main.c代码如下:
#include "stdio.h"
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"
#include "xscugic.h"
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
#define MIO0_LED 0 //核心板上PS端的LED
#define GPIO_INTERRUPT_ID XPAR_XGPIOPS_0_INTR //GPIO中断号,52
#define INTC_DEVICE_ID XPAR_SCUGIC_SINGLE_DEVICE_ID
#define MIO12_KEY 12
#define XGPIOPS_IRQ_TYPE_EDGE_FALLING 0x01U /**< Interrupt Falling edge */
XGpioPs_Config *ConfigPtr;
XScuGic_Config *IntcConfig; /* Instance of the interrupt controller */
XGpioPs Gpio;
XScuGic Intc;
void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpioPs *Gpio, u16 GpioIntrId);
void IntrHandler();
u32 key_press;
int main ( )
{
u32 led_value = 0;
printf(" GPIO INTERRPUT TEST!\n\r");
//根据器件的ID,查找器件的配置信息
ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
//初始化GPIO驱动
XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);//&地址,返回值为固定值,可以不需要返回值
//LED,GPIO方向设置为输出(0,input;1,output)
XGpioPs_SetDirectionPin(&Gpio, MIO0_LED, 0x1);
//LED,设置输出使能(0,关闭;1,打开)
XGpioPs_SetOutputEnablePin(&Gpio, MIO0_LED, 0x1);
//KEY,GPIO方向设置为输入(0,input;1,output)
XGpioPs_SetDirectionPin(&Gpio, MIO12_KEY, 0x0);
//设置中断
SetupInterruptSystem(&Intc, &Gpio, GPIO_INTERRUPT_ID);
while (1){
if(key_press){
led_value = ~led_value;
key_press = 0;
//清零之前的中断状态
XGpioPs_IntrClearPin(&Gpio, MIO12_KEY);
//将led_value写入到led
XGpioPs_WritePin(&Gpio, MIO0_LED, led_value);
//延时200ms,按键消抖
usleep(200000);
//使能引脚中断
XGpioPs_IntrEnablePin(&Gpio, MIO12_KEY);
}
}
return 0;
}
void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpioPs *Gpio, u16 GpioIntrId)
{
//查找GIC器件配置信息,并初始化
XScuGic_LookupConfig(INTC_DEVICE_ID);
XScuGic_CfgInitialize(GicInstancePtr, IntcConfig,
IntcConfig->CpuBaseAddress);
//初始化ARM异常句柄
Xil_ExceptionInit();
//给IRQ异常注册处理程序
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
(Xil_ExceptionHandler)XScuGic_InterruptHandler,
GicInstancePtr);
//使能处理器中断
Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);
//为GPIO使能中断
XScuGic_Enable(GicInstancePtr, GpioIntrId);
//关联中断处理函数(当外部中断来临时,跳到中断处理程序,处理完成后,返回正常程序)
XScuGic_Connect(GicInstancePtr, GpioIntrId,
(Xil_ExceptionHandler)IntrHandler,
(void *)Gpio);
//中断触发类型下降沿触发
XGpioPs_SetIntrTypePin(Gpio, MIO12_KEY, XGPIOPS_IRQ_TYPE_EDGE_FALLING);
//打开MIO引脚的中断使能
XGpioPs_IntrEnablePin(Gpio, MIO12_KEY);
}
//中断处理函数
void IntrHandler() {
printf("Interrupt detected!\n\r");
key_press = 1;
XGpioPs_IntrDisablePin(&Gpio, MIO12_KEY);
}