#include "xgpio.h"
#include "xscutimer.h"
#include "xscugic.h"

#define	CPU_CLK_HZ	XPAR_PS7_CORTEXA9_0_CPU_CLK_FREQ_HZ	//CPUʱƵ(λHz)
#define GPIO_0_ID XPAR_AXI_GPIO_0_DEVICE_ID
#define	HIGH_Level_Sensitive	0x01	//ߵƽ(1)
#define	Rising_Edge_Sensitive	0x03	//(0->1)

XGpio AXI_GPIO0;
XScuTimer_Config *Config;
XScuGic ScuGic;	//ͨжϿ
XScuTimer ScuTimer;

uint8_t Timer_Flag = 0;

void ScuTimer_IRQ_Handler(void *CallBackRef)
{
	/* û */
	Timer_Flag ++;

	/*  */
    XScuTimer_ClearInterruptStatus(&ScuTimer);
}


int main(void)
{
	uint32_t Load_Val;
	float Time_us = 350000;

	//ʼͨжϿ
	XScuGic_Config *IntcConfig;
	IntcConfig = XScuGic_LookupConfig(XPAR_SCUGIC_SINGLE_DEVICE_ID);
	XScuGic_CfgInitialize(&ScuGic, IntcConfig,IntcConfig->CpuBaseAddress);

	Xil_ExceptionInit();
	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
			(Xil_ExceptionHandler)XScuGic_InterruptHandler,&ScuGic);
	Xil_ExceptionEnable();

	//ʼAXI GPIO0ͨ2Ϊ0
	XGpio_Initialize(&AXI_GPIO0,GPIO_0_ID);
	XGpio_SetDataDirection(&AXI_GPIO0, XGPIO_IR_CH2_MASK, 0);
	XGpio_DiscreteWrite(&AXI_GPIO0, XGPIO_IR_CH2_MASK, 0);

    //ʱʼ
    Config = XScuTimer_LookupConfig(XPAR_XSCUTIMER_0_DEVICE_ID);
    XScuTimer_CfgInitialize(&ScuTimer, Config,Config->BaseAddr);

    //usתΪʱװֵõ350000us
    Load_Val = ((double)CPU_CLK_HZ / 2 / 1000000 * Time_us) - 1;

    if(((uint32_t)((double)CPU_CLK_HZ / 2 / 100000 * Time_us))%10 >=5 )
         Load_Val++;

	//ԶװģʽԶװֵ
    XScuTimer_EnableAutoReload(&ScuTimer);
    XScuTimer_LoadTimer(&ScuTimer, Load_Val);

    //ӵжϿ
    XScuGic_SetPriorityTriggerType(&ScuGic, XPAR_SCUTIMER_INTR, 0xA8, HIGH_Level_Sensitive);
	XScuGic_Connect(&ScuGic, XPAR_SCUTIMER_INTR,
			ScuTimer_IRQ_Handler,(void *)&ScuTimer);
	XScuGic_Enable(&ScuGic, XPAR_SCUTIMER_INTR);

    //ʹܶʱж
    XScuTimer_EnableInterrupt(&ScuTimer);

    //
    XScuTimer_Start(&ScuTimer);


	while(1) {
		//1Timer_FlagλﵽˮƵЧ
		if(Timer_Flag <= 7)
			XGpio_DiscreteWrite(&AXI_GPIO0, XGPIO_IR_CH2_MASK,1<<Timer_Flag);
		else
			Timer_Flag = 0;
	}
	return 0;
}
