天天看點

zedboard中斷main

//Description:         Zed LED DimmerExample

//Revision:            Oct 25, 2013: 1.00Initial version

//----------------------------------------------------------------------------

#include"xparameters.h"

#include"xil_io.h"

#include"xstatus.h"

//這些都是靜态的,必須添加到我們的中斷安裝例程映射到SCUGIC定義驅動程式調用。

#include"xscugic.h"//SCUGIC的驅動//該檔案包含配置驅動程式以及 GIC 的使用範圍

#include "xil_exception.h"//ExceptionHandlerd的驅動包

#define PWM_BASE_ADDRESS0x43C00000

#defineXPAR_PS7_SCUGIC_0_DEVICE_ID 0

//#defineINTC_PWM_INTERRUPT_ID XPAR_FABRIC_PWM_W_INT_0_INTERRUPT_OUT_INTR//報錯:未定義

#defineXPAR_FABRIC_PWM_W_INT_0_INTERRUPT_OUT_INTR 61//因為報錯,自己添加的

#defineINTC_PWM_INTERRUPT_ID XPAR_FABRIC_PWM_W_INT_0_INTERRUPT_OUT_INTR

#define INTCXScuGic

#defineINTC_HANDLER XScuGic_InterruptHandler

#defineINTC_DEVICE_ID XPAR_PS7_SCUGIC_0_DEVICE_ID

//這些變量聲明複制到源代碼變量聲明部分。亮度可變現在全局聲明的,使其對可見光

//ISR将在以後添加。該INTC變量是用來設定一個靜态的定義用于設定SCUGIC驅動程式。

//這些變量聲明複制到源代碼變量聲明

volatile u32brightness;

static INTCIntc;

//這将作為調用的硬體時,回調的中斷服務程式。

void PWMIsr(void*InstancePtr)

{

print("PWMValue exceeded, brightness reset to zero. Enter new value: \r\n");

brightness = 0;

Xil_Out32(PWM_BASE_ADDRESS,brightness);

}

intSetupInterruptSystem()

{

int result;

INTC*IntcInstancePtr = &Intc;

XScuGic_Config*IntcConfig;

IntcConfig =XScuGic_LookupConfig(INTC_DEVICE_ID);

if (IntcConfig== NULL)

{

returnXST_FAILURE;

}

result =XScuGic_CfgInitialize(IntcInstancePtr, IntcConfig,

IntcConfig->CpuBaseAddress);

if (result !=XST_SUCCESS)

{

returnXST_FAILURE;

}

XScuGic_SetPriorityTriggerType(IntcInstancePtr,INTC_PWM_INTERRUPT_ID,

0xA0, 0x3);

result =XScuGic_Connect(IntcInstancePtr, INTC_PWM_INTERRUPT_ID,

(Xil_ExceptionHandler)PWMIsr, 0);

if (result !=XST_SUCCESS)

{

return result;

}

XScuGic_Enable(IntcInstancePtr,INTC_PWM_INTERRUPT_ID);

Xil_ExceptionInit();

Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,

(Xil_ExceptionHandler)INTC_HANDLER,IntcInstancePtr);

Xil_ExceptionEnable();

returnXST_SUCCESS;

}

int main(void)

{

      //printf("HelloWorld\n");

    int status = XST_SUCCESS;

    u32 value = 0;

    u32 period = 0;

    brightness = 0; // u32 brightness = 0;

    Xil_Out32(PWM_BASE_ADDRESS, 0);

    while (1)

    {

        print("Select a Brightness between0 and 9\n\r");

        value = inbyte();

        period = value - 0x30;

        xil_printf("Brightness Level %dselected\n\r", period);

        brightness = period * 110000;

        Xil_Out32(PWM_BASE_ADDRESS,brightness);

        //這個調用,使能了中斷和ISR,在中斷處理之前

        status = SetupInterruptSystem();

        if (status != XST_SUCCESS)

        {

        return XST_FAILURE;

        }

    }

    return status;

}