#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"

uint16_t adcValue = 0;

void ADC_IRQHandler() {
        /* acknowledge interrupt */
        ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);

        adcValue = ADC_GetConversionValue(ADC1);
    
    	/* Test if the interrupt is working by switching on some LEDS  */
        volatile int i;
        GPIO_ToggleBits(GPIOG, GPIO_Pin_13 | GPIO_Pin_14);
		// Waste some time
		for (i = 0; i < 500000; i++);
}
int main(void)
{


	        ADC_InitTypeDef       ADC_InitStructure;
	        ADC_CommonInitTypeDef ADC_CommonInitStructure;
	        NVIC_InitTypeDef NVIC_InitStructure;

	 
	        ADC_StructInit(&ADC_InitStructure);
	        ADC_CommonStructInit(&ADC_CommonInitStructure);

	      
	        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

	      
	        ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
	        ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
	        ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
	        ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
	        ADC_CommonInit(&ADC_CommonInitStructure);

	 
	        ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
	        ADC_InitStructure.ADC_ScanConvMode = ENABLE;
	        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
	        ADC_InitStructure.ADC_DataAlign= ADC_DataAlign_Right;
	        ADC_InitStructure.ADC_ExternalTrigConv= 0;
	        ADC_InitStructure.ADC_ExternalTrigConvEdge= 0;
	        ADC_InitStructure.ADC_NbrOfConversion= 1;

	        ADC_Init(ADC1, &ADC_InitStructure);

	        
	        ADC_TempSensorVrefintCmd(ENABLE);

	      
	        ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_480Cycles);
	       

	        ADC_EOCOnEachRegularChannelCmd(ADC1, ENABLE);

	        ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);

	        /* Configure NVIC */
	        NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQn;
	        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
	        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
	        NVIC_Init(&NVIC_InitStructure);

	        /* Enable ADC1 */
	        ADC_Cmd(ADC1, ENABLE);

	        /* Intialize GPIO */
	        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
			GPIO_InitTypeDef GPIO_InitDef;

			GPIO_InitDef.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
			GPIO_InitDef.GPIO_OType = GPIO_OType_PP;
			GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT;
			GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_NOPULL;
			GPIO_InitDef.GPIO_Speed = GPIO_Speed_100MHz;
			//Initialize pins
			GPIO_Init(GPIOG, &GPIO_InitDef);
	for(;;)
	{
		int value = 0;
		ADC_SoftwareStartConv(ADC1);
		value = adcValue;


	}
}