ZYNQ學習筆記——AXI_GPIO

 

AXI GPIO 觸發中斷,控制PS 端的LED亮滅

/*
 * main.c
 *
 *  Created on: 2020年3月12日
 *      Author: 
 */

#include "xparameters.h"
#include "xgpiops.h"
#include "xgpio.h"
#include "xil_exception.h"
 #include "xscugic.h"
 #include "xil_printf.h"
#include "sleep.h"


#define  GPIO_DEVICE_ID   XPAR_XGPIOPS_0_DEVICE_ID
#define MIO7   7

#define AXI_GPIO__DEVICE_ID  XPAR_GPIO_0_DEVICE_ID
#define key_Channel   1

 #define AXI_INTC_DEVICE_ID	  XPAR_SCUGIC_SINGLE_DEVICE_ID
#define INT_ID   61U   //中斷ID號
//ps    led
XGpioPs_Config *ConfigPtr;
XGpioPs Gpiops_inst;	/* The driver instance for GPIO Device. */

//AXI    gpio
XScuGic_Config *xscugic_cfg_ptr;
XScuGic        scugic_inst;

XGpio     AXI_Gpio_inst; /* The Instance of the GPIO Driver */
u32 led_value=1;   //初試化點亮LED


void instance_init();
void Axi_Interrupt_Handler(void *CallBackRef);


int main(void)
{
	xil_printf("AXI GPIO inter test is begin!\t\n");

	instance_init();

	//配置PS  GPIO輸出
	XGpioPs_SetDirectionPin(&Gpiops_inst, MIO7, 1);
	XGpioPs_SetOutputEnablePin(&Gpiops_inst, MIO7, 1);
	XGpioPs_WritePin(&Gpiops_inst, MIO7,led_value );

	//配置AXI GPIO爲輸入  使能中斷
	 XGpio_SetDataDirection(&AXI_Gpio_inst,  key_Channel, 1);  //1爲input
	 XGpio_InterruptEnable(&AXI_Gpio_inst, 1);    //使能通道1中斷
	 XGpio_InterruptGlobalEnable(&AXI_Gpio_inst);//使能AXI GPIO全局中斷

      //關聯中斷函數
	 	XScuGic_Connect(&scugic_inst, INT_ID,Axi_Interrupt_Handler, &AXI_Gpio_inst);
	 //設置中斷觸發方式:優先級和高電平觸發(01),上升沿(11),並使能中斷
	 	XScuGic_SetPriorityTriggerType(&scugic_inst, INT_ID,0xA0, 0x01);
	 	 XScuGic_Enable(&scugic_inst, INT_ID); //使能中斷

//ZYNQ處理器中斷必要的三個函數,設置打開中斷異常處理功能
	 Xil_ExceptionInit();
	  Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
	 (Xil_ExceptionHandler)XScuGic_InterruptHandler,&scugic_inst);
	 Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);

	 		 	while(1);

return(0);

}

void instance_init(){
	//初試化MIO,並配置輸出使能
	ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
	XGpioPs_CfgInitialize(&Gpiops_inst, ConfigPtr,ConfigPtr->BaseAddr);

	//初始化配置AXI GPIO
	XGpio_Initialize(&AXI_Gpio_inst,AXI_GPIO__DEVICE_ID);

	//初始化中斷
	xscugic_cfg_ptr = XScuGic_LookupConfig(AXI_INTC_DEVICE_ID);
	XScuGic_CfgInitialize(&scugic_inst,xscugic_cfg_ptr,xscugic_cfg_ptr->CpuBaseAddress);
	}

//中斷處理函數
void Axi_Interrupt_Handler(void *CallBackRef){
		int key_value=1;
		XGpio *GpioPtr=(XGpio *)CallBackRef;
		xil_printf("inter detected!\t\n");
		XGpio_InterruptDisable(GpioPtr, 1); //關閉中斷
		key_value=XGpio_DiscreteRead(GpioPtr, key_Channel);
		if(key_value){
			led_value=~led_value;
			XGpioPs_WritePin(&Gpiops_inst, MIO7,led_value );
		}
		sleep(1);
		XGpio_InterruptClear(GpioPtr, 1);   //清除中斷
		XGpio_InterruptEnable(GpioPtr, 1);

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章