/* Includes */
#include "stm32f4xx.h"
GPIO_InitTypeDef GPIO_LED; //Define GPIO structure object
EXTI_InitTypeDef INT_SW; //Define External Interrupt structure object
NVIC_InitTypeDef NVIC_SW; //Define Nested Vector Interrupt Controller structure object
int t=0;
uint32_t k=16800000;
void delay(__IO uint32_t ncount)
{
	while(ncount--)
	{
	}
}
int main(void)
{

  //Set Clocks
     //GPIO Clock
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE); //Start clock for port D
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //Start clock for port A
    //Interrupt Clock
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);


  //LED Initialization
  GPIO_LED.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1;
  GPIO_LED.GPIO_Mode=GPIO_Mode_OUT;
  GPIO_LED.GPIO_OType=GPIO_OType_PP;
  GPIO_LED.GPIO_PuPd=GPIO_PuPd_NOPULL;
  GPIO_LED.GPIO_Speed=GPIO_Speed_50MHz;//Refresh speed
  GPIO_Init(GPIOD,&GPIO_LED); //GPIOD to select port D and pass created GPIO object

  //Switch Initialization
   GPIO_LED.GPIO_Pin=GPIO_Pin_1;
   GPIO_LED.GPIO_Mode=GPIO_Mode_IN;
   GPIO_LED.GPIO_OType=GPIO_OType_PP;
   GPIO_LED.GPIO_PuPd=GPIO_PuPd_DOWN;
   GPIO_LED.GPIO_Speed=GPIO_Speed_50MHz;//Refresh speed
   GPIO_Init(GPIOA,&GPIO_LED); //GPIOD to select port A and pass created GPIO object

   //Interrupt initialization
   SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource1); //Use Port A pin 1 as External Interrupt line
   INT_SW.EXTI_Line=EXTI_Line1;//PA1 pin
   INT_SW.EXTI_Mode=EXTI_Mode_Interrupt; //Set Mode
   INT_SW.EXTI_Trigger=EXTI_Trigger_Rising; // Rising edge
   INT_SW.EXTI_LineCmd=ENABLE; // Enable interrupt
   EXTI_Init(&INT_SW); //Initialize Interrupt

   //NVIC Initialization
   NVIC_SW.NVIC_IRQChannel=EXTI1_IRQn; //Choose External interrupt line 1
   NVIC_SW.NVIC_IRQChannelPreemptionPriority=1; //Set priority
   NVIC_SW.NVIC_IRQChannelSubPriority=0; //Set priority
   NVIC_SW.NVIC_IRQChannelCmd= ENABLE; //Enable NVIC channel
   NVIC_Init(&NVIC_SW);

  while (1)
  {
	  GPIO_WriteBit(GPIOD,GPIO_Pin_0,Bit_SET);
	  delay(k);
	  GPIO_WriteBit(GPIOD,GPIO_Pin_0,Bit_RESET);
	  delay(k);
  }
}
void EXTI1_IRQHandler(void) // Interrupt Service Routine For Ext Interrupt Line 1
{
	t=0;
	if(EXTI_GetITStatus(EXTI_Line1)!=RESET) //Check interrupt status on EXT interrupt line 1 , Pre check
	{
		do
		{
			GPIO_WriteBit(GPIOD,GPIO_Pin_1,Bit_SET);
			delay(k);
			GPIO_WriteBit(GPIOD,GPIO_Pin_1,Bit_RESET);
			delay(k);
			t++;
		}while(t<5);
		EXTI_ClearITPendingBit(EXTI_Line1); //Clear the interrupt line
	}
}
