static void setup_stm32f1_peripherals(void)
{
	rcc_peripheral_enable_clock(&RCC_APB1ENR, 
			RCC_APB1ENR_I2C1EN);

	rcc_peripheral_enable_clock(&RCC_APB2ENR, 
			RCC_APB2ENR_ADC1EN);

	/* GPIO pin for I2C1 SCL, SDA */

	/* VESNA v1.0
	gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ,
			GPIO_CNF_OUTPUT_ALTFN_OPENDRAIN, GPIO6);
	gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ,
			GPIO_CNF_OUTPUT_ALTFN_OPENDRAIN, GPIO7);
	*/

	/* VESNA v1.1 */
	AFIO_MAPR |= AFIO_MAPR_I2C1_REMAP;
	gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ,
			GPIO_CNF_OUTPUT_ALTFN_OPENDRAIN, TDA_PIN_SCL);
	gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ,
			GPIO_CNF_OUTPUT_ALTFN_OPENDRAIN, TDA_PIN_SDA);

	/* GPIO pin for TDA18219 IRQ */
	gpio_set_mode(GPIOA, GPIO_MODE_INPUT,
			GPIO_CNF_INPUT_FLOAT, TDA_PIN_IRQ);

	/* GPIO pin for TDA18219 IF AGC */
	gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ,
			GPIO_CNF_OUTPUT_PUSHPULL, TDA_PIN_IF_AGC);
	/* Set to lowest gain for now */
	gpio_clear(GPIOA, TDA_PIN_IF_AGC);

	/* GPIO pin for AD8307 ENB */
	gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ,
			GPIO_CNF_OUTPUT_PUSHPULL, TDA_PIN_ENB);

	/* ADC pin for AD8307 output */
	gpio_set_mode(GPIOA, GPIO_MODE_INPUT,
			GPIO_CNF_INPUT_ANALOG, TDA_PIN_OUT);

	/* Setup I2C */
	i2c_peripheral_disable(I2C1);

	/* 400 kHz - I2C Fast Mode */
	i2c_set_clock_frequency(I2C1, I2C_CR2_FREQ_24MHZ);
	i2c_set_fast_mode(I2C1);
	/* 400 kHz */
	i2c_set_ccr(I2C1, 0x14);
	/* 300 ns rise time */
	i2c_set_trise(I2C1, 0x08);

	i2c_peripheral_enable(I2C1);


	/* Make sure the ADC doesn't run during config. */
	adc_off(ADC1);

	/* We configure everything for one single conversion. */
	adc_disable_scan_mode(ADC1);
	adc_set_single_conversion_mode(ADC1);
	adc_enable_discontinous_mode_regular(ADC1);
	adc_disable_external_trigger_regular(ADC1);
	adc_set_right_aligned(ADC1);
	adc_set_conversion_time_on_all_channels(ADC1, ADC_SMPR_SMP_28DOT5CYC);

	adc_on(ADC1);

	/* Wait for ADC starting up. */
	int i;
	for (i = 0; i < 800000; i++)    /* Wait a bit. */
		__asm__("nop");

	adc_reset_calibration(ADC1);
	adc_calibration(ADC1);

	uint8_t channel_array[16];
	/* Select the channel we want to convert. */
	if(TDA_PIN_OUT == GPIO0) {
		channel_array[0] = 0;
	} else if(TDA_PIN_OUT == GPIO2) {
		channel_array[0] = 2;
	}
	adc_set_regular_sequence(ADC1, 1, channel_array);
}
/*
    Usage:

        adc_init_single(ADC1, 1, 1, 0, 0);

    ... would enable ADC1, enabling channels 1 and 2,
    but not 3 and 4.
*/
static inline void adc_init_single(uint32_t adc,
                   uint8_t chan1, uint8_t chan2,
                   uint8_t chan3, uint8_t chan4)
{
    uint8_t num_channels, rank;
    uint8_t channels[4];

    // Paranoia, must be down for 2+ ADC clock cycles before calibration
    adc_off(adc);

    /* enable adc clock */
    if (adc == ADC1) {
#ifdef USE_AD1
        num_channels = NB_ADC1_CHANNELS;
        ADC1_GPIO_INIT();
#endif
    }
    else if (adc == ADC2) {
#ifdef USE_AD2
        num_channels = NB_ADC2_CHANNELS;
        ADC2_GPIO_INIT();
#endif
    }

    /* Configure ADC */

    /* Explicitly setting most registers, reset/default values are correct for most */

    /* Set CR1 register. */

    /* Clear AWDEN */
    adc_disable_analog_watchdog_regular(adc);
    /* Clear JAWDEN */
    adc_disable_analog_watchdog_injected(adc);
    /* Clear DISCEN */
    adc_disable_discontinuous_mode_regular(adc);
    /* Clear JDISCEN */
    adc_disable_discontinuous_mode_injected(adc);
    /* Clear JAUTO */
    adc_disable_automatic_injected_group_conversion(adc);
    /* Set SCAN */
    adc_enable_scan_mode(adc);
    /* Enable ADC<X> JEOC interrupt (Set JEOCIE) */
    adc_enable_eoc_interrupt_injected(adc);
    /* Clear AWDIE */
    adc_disable_awd_interrupt(adc);
    /* Clear EOCIE */
    adc_disable_eoc_interrupt(adc);

    /* Set CR2 register. */

    /* Clear TSVREFE */
    adc_disable_temperature_sensor(adc);
    /* Clear EXTTRIG */
    adc_disable_external_trigger_regular(adc);
    /* Clear ALIGN */
    adc_set_right_aligned(adc);
    /* Clear DMA */
    adc_disable_dma(adc);
    /* Clear CONT */
    adc_set_single_conversion_mode(adc);

    rank = 0;
    if (chan1) {
	   adc_set_sample_time(adc, adc_channel_map[0], ADC_SMPR1_SMP_41DOT5CYC);
	   channels[rank] = adc_channel_map[0];
        rank++;
    }
    if (chan2) {
	   adc_set_sample_time(adc, adc_channel_map[1], ADC_SMPR1_SMP_41DOT5CYC);
	   channels[rank] = adc_channel_map[1];
        rank++;
    }
    if (chan3) {
	   adc_set_sample_time(adc, adc_channel_map[2], ADC_SMPR1_SMP_41DOT5CYC);
	   channels[rank] = adc_channel_map[2];
        rank++;
    }
    if (chan4) {
	   adc_set_sample_time(adc, adc_channel_map[3], ADC_SMPR1_SMP_41DOT5CYC);
	   channels[rank] = adc_channel_map[3];
    }

    adc_set_injected_sequence(adc, num_channels, channels);

#if defined(USE_AD_TIM4)
    adc_enable_external_trigger_injected(adc, ADC_CR2_JEXTSEL_TIM4_TRGO);
#elif defined(USE_AD_TIM1)
    adc_enable_external_trigger_injected(adc, ADC_CR2_JEXTSEL_TIM1_TRGO);
#else
    adc_enable_external_trigger_injected(adc, ADC_CR2_JEXTSEL_TIM2_TRGO);
#endif

    /* Enable ADC<X> */
    adc_power_on(adc);

    /* Enable ADC<X> reset calibaration register */
    adc_reset_calibration(adc);
    /* Check the end of ADC<X> reset calibration */
    while ((ADC_CR2(adc) & ADC_CR2_RSTCAL) != 0);
    /* Start ADC<X> calibaration */
    adc_calibration(adc);
    /* Check the end of ADC<X> calibration */
    while ((ADC_CR2(adc) & ADC_CR2_CAL) != 0);

} // adc_init_single