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

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);

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值