当前位置: 代码迷 >> 综合 >> FPGA学习日记(十)ZYNQ的GPIO—INTERRPUT接口控制
  详细解决方案

FPGA学习日记(十)ZYNQ的GPIO—INTERRPUT接口控制

热度:48   发布时间:2024-02-20 16:19:14.0

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写入到ledXGpioPs_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);}