PL中断——点亮和熄灭LED灯程序

参考米联客资料改写的程序:

#include 
#include "xscugic.h"
#include "xil_exception.h"
#include "xparameters.h"
#include  "xgpiops.h"

#define INT_CFG0_OFFSET 0x00000C00

#define emio_device_id  XPAR_PS7_GPIO_0_DEVICE_ID

// Parameter definitions
#define SW1_INT_ID              61
#define SW2_INT_ID              62

#define INTC_DEVICE_ID          XPAR_PS7_SCUGIC_0_DEVICE_ID
#define INT_TYPE_RISING_EDGE    0x03
#define INT_TYPE_HIGHLEVEL      0x01
#define INT_TYPE_MASK           0x03

static XScuGic INTCInst;
XGpioPs plGpioInstancePtr;

int led1_val=0;
int led2_val=0;

static void SW_intr_Handler(void *param);
static int IntcInitFunction(u16 DeviceId);

static void PL_emio_initial(u16 DeviceId);  //yys

static void SW_intr_Handler(void *param)
{
    int sw_id = (int)param;

    printf("SW%d int\n\r", sw_id);
    if(sw_id==1)
		{
			led1_val=~led1_val;
    		XGpioPs_WritePin(&plGpioInstancePtr,54,led1_val);
		}
    else if(sw_id==2)
       {
    		led2_val=~led2_val;
    		XGpioPs_WritePin(&plGpioInstancePtr,55,led2_val);
        }
    else
		{
			XGpioPs_WritePin(&plGpioInstancePtr,54,0);
			XGpioPs_WritePin(&plGpioInstancePtr,55,0);

		}


}

void PL_emio_initial(u16 DeviceId)
{
	XGpioPs_Config* GpioConfigPtr;
	int xStatus;


	//查找id 并初始化
    GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
	if(GpioConfigPtr == NULL)
		return XST_FAILURE;

	xStatus = XGpioPs_CfgInitialize(&plGpioInstancePtr,GpioConfigPtr, GpioConfigPtr->BaseAddr);
	if(XST_SUCCESS != xStatus)
		print(" PS GPIO INIT FAILED \n\r");
	//设置输出并使能
	XGpioPs_SetDirectionPin(&plGpioInstancePtr,54,1);
	XGpioPs_SetDirectionPin(&plGpioInstancePtr,55, 1);

	XGpioPs_SetOutputEnablePin(&plGpioInstancePtr,54,1);
	XGpioPs_SetOutputEnablePin(&plGpioInstancePtr,55, 1);

	//初始化为0,熄灭LED灯
	XGpioPs_WritePin(&plGpioInstancePtr,54,0);
	XGpioPs_WritePin(&plGpioInstancePtr,55,0);


}

void IntcTypeSetup(XScuGic *InstancePtr, int intId, int intType)
{
    int mask;

    intType &= INT_TYPE_MASK;
    mask = XScuGic_DistReadReg(InstancePtr, INT_CFG0_OFFSET + (intId/16)*4);
    mask &= ~(INT_TYPE_MASK << (intId%16)*2);
    mask |= intType << ((intId%16)*2);
    XScuGic_DistWriteReg(InstancePtr, INT_CFG0_OFFSET + (intId/16)*4, mask);
}

int IntcInitFunction(u16 DeviceId)
{
    XScuGic_Config *IntcConfig;
    int status;

    // Interrupt controller initialisation
    IntcConfig = XScuGic_LookupConfig(DeviceId);
    status = XScuGic_CfgInitialize(&INTCInst, IntcConfig, IntcConfig->CpuBaseAddress);
    if(status != XST_SUCCESS) return XST_FAILURE;

    // Call to interrupt setup
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
                                 (Xil_ExceptionHandler)XScuGic_InterruptHandler,
                                 &INTCInst);
   //XScuGic_InterruptHandler  驱动程序的主要中断处理程序
    Xil_ExceptionEnable();

    // Connect SW1~SW3 interrupt to handler
    status = XScuGic_Connect(&INTCInst,
                             SW1_INT_ID,
                             (Xil_ExceptionHandler)SW_intr_Handler,
                             (void *)1);
    if(status != XST_SUCCESS) return XST_FAILURE;

    status = XScuGic_Connect(&INTCInst,
                             SW2_INT_ID,
                             (Xil_ExceptionHandler)SW_intr_Handler,
                             (void *)2);
    if(status != XST_SUCCESS) return XST_FAILURE;


    // Set interrupt type of SW1~SW2 to rising edge
    IntcTypeSetup(&INTCInst, SW1_INT_ID, INT_TYPE_RISING_EDGE);
    IntcTypeSetup(&INTCInst, SW2_INT_ID, INT_TYPE_RISING_EDGE);

    // Enable SW1~SW2 interrupts in the controller
    XScuGic_Enable(&INTCInst, SW1_INT_ID);
    XScuGic_Enable(&INTCInst, SW2_INT_ID);


    return XST_SUCCESS;
}

int main(void)
{

    print("PL int test\n\r");
    PL_emio_initial(emio_device_id);
    IntcInitFunction(INTC_DEVICE_ID);
    while(1);
    return 0;
}

 

你可能感兴趣的:(学习笔记,ZYNQ,中断)