//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;
}