//Description: Zed LED DimmerExample
//Revision: Oct 25, 2013: 1.00Initial version
//----------------------------------------------------------------------------
/*****************************Include Files *********************************/
#include"xparameters.h"
#include"xil_io.h"
#include"xstatus.h"
//这些都是静态的,必须添加到我们的中断安装例程映射到SCUGIC定义驱动程序调用。
#include"xscugic.h"//SCUGIC的驱动//该文件包含配置驱动程序以及 GIC 的使用范围
#include "xil_exception.h"//ExceptionHandlerd的驱动包
/**************************Constant Definitions *****************************/
/*
* The following constant maps to the name ofthe hardware instances that
* were created in the EDK XPS system.
*/
#define PWM_BASE_ADDRESS0x43C00000
/* The followingdefinitions are related to handling interrupts from the
* PWMcontroller. */
#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
/**************************Variable Definitions *****************************/
/*
* The following are declared globally so theyare zeroed and so they are
* easily accessible from a debugger
*/
//这些变量声明复制到源代码变量声明部分。亮度可变现在全局声明的,使其对可见光
//ISR将在以后添加。该INTC变量是用来设置一个静态的定义用于设置SCUGIC驱动程序。
//这些变量声明复制到源代码变量声明
/* LEDbrightness level is now global to make is visble to the ISR. */
volatile u32brightness;
/* The Instanceof the Interrupt Controller Driver */
static INTCIntc;
//这将作为调用的硬件时,回调的中断服务程序。
/**************************Main Code Entry **********************************/
void PWMIsr(void*InstancePtr)
{
/* Inform theuser that an invalid value was detected by the PWM
* controller. */
print("PWMValue exceeded, brightness reset to zero. Enter new value: \r\n");
/* Set thebrightness value to a safe value and write it to the
* PWM controllerin order to clear the pending interrupt. */
brightness = 0;
Xil_Out32(PWM_BASE_ADDRESS,brightness);
}
/****************************************************************************/
/**
* This functionsets up the interrupt system for the PWM dimmer controller.
* The processingcontained in this function assumes the hardware system was
* built with aninterrupt controller.
*
* @param None.
*
* @return Astatus indicating XST_SUCCESS or a value that is contained in
* xstatus.h.
*
* @note None.
*
*****************************************************************************/
intSetupInterruptSystem()
{
int result;
INTC*IntcInstancePtr = &Intc;
XScuGic_Config*IntcConfig;
/* Initializethe interrupt controller driver so that it is ready to
* use. */
IntcConfig =XScuGic_LookupConfig(INTC_DEVICE_ID);
if (IntcConfig== NULL)
{
returnXST_FAILURE;
}
/* Initializethe SCU and GIC to enable the desired interrupt
* configuration.*/
result =XScuGic_CfgInitialize(IntcInstancePtr, IntcConfig,
IntcConfig->CpuBaseAddress);
if (result !=XST_SUCCESS)
{
returnXST_FAILURE;
}
XScuGic_SetPriorityTriggerType(IntcInstancePtr,INTC_PWM_INTERRUPT_ID,
0xA0, 0x3);
/* Connect theinterrupt handler that will be called when an
* interruptoccurs for the device. */
result =XScuGic_Connect(IntcInstancePtr, INTC_PWM_INTERRUPT_ID,
(Xil_ExceptionHandler)PWMIsr, 0);
if (result !=XST_SUCCESS)
{
return result;
}
/* Enable theinterrupt for the PWM controller device. */
XScuGic_Enable(IntcInstancePtr,INTC_PWM_INTERRUPT_ID);
/* Initializethe exception table and register the interrupt controller
* handler withthe exception table. */
Xil_ExceptionInit();
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
(Xil_ExceptionHandler)INTC_HANDLER,IntcInstancePtr);
/* Enablenon-critical exceptions */
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;
/* Initialize the LED Dimmer controller toa safe PWM value. */
Xil_Out32(PWM_BASE_ADDRESS, 0);
/* Now that the hardware has beeninitialized, continuously loop while
* prompting the user for updates to thebrightness level. */
while (1)
{
/* Prompt the user to select abrightness value ranging from
* 0 to 9. */
print("Select a Brightness between0 and 9\n\r");
/* Read an input value from theconsole. */
value = inbyte();
/* Convert the input ASCII character toan integer value. */
period = value - 0x30;
/* Print the input value back to theconsole to provide some
* feedback to the user. */
xil_printf("Brightness Level %dselected\n\r", period);
/* Since the LED width is 1e6 clkcycles, we need to normalize
* the period to that clk. Since we accept values 0-9, that will
* scale period from 0-999,000. 0 turns off LEDs, 999,000 is full
* brightness. */
brightness = period * 110000;
/* Write the duty_cycle width (Period)out to the PL PWM
* peripheral. */
Xil_Out32(PWM_BASE_ADDRESS,brightness);
//这个调用,使能了中断和ISR,在中断处理之前
/* Setup the interrupts such thatinterrupt processing can occur. If an
* error occurs while setting upinterrupts, then exit the application. */
status = SetupInterruptSystem();
if (status != XST_SUCCESS)
{
return XST_FAILURE;
}
}
return status;
}