/** * Configure a specific adc. */ void adc_config(uint32_t adc, const uint8_t const *channel_array) { adc_enable_scan_mode(adc); adc_set_continuous_conversion_mode(adc); adc_set_right_aligned(adc); adc_enable_external_trigger_regular(adc, ADC_CR2_EXTSEL_SWSTART); adc_set_sample_time_on_all_channels(adc, ADC_SAMPLE_TIME); adc_enable_dma(adc); adc_power_on(adc); { int i; /* Wait a bit for the adc to power on. */ for (i = 0; i < 800000; i++) { __asm("nop"); } } adc_reset_calibration(adc); adc_calibration(adc); adc_set_regular_sequence(adc, ADC_RAW_SAMPLE_COUNT/2, (uint8_t *)channel_array); }
/*--------------------------------------------------------------------*/ void adc_setup(void) { rcc_periph_clock_enable(RCC_ADC1); rcc_periph_clock_enable(RCC_GPIOA); nvic_enable_irq(NVIC_ADC_IRQ); /* Set port PA1 for ADC1 to analogue mode. */ gpio_mode_setup(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO1); adc_power_on(ADC1); uint8_t channel[1] = { ADC_CHANNEL1 }; adc_set_regular_sequence(ADC1, 1, channel); adc_set_clk_prescale(ADC_CCR_ADCPRE_BY2); adc_enable_scan_mode(ADC1); adc_set_continuous_conversion_mode(ADC1); adc_set_sample_time(ADC1, ADC_CHANNEL1, ADC_SMPR_SMP_3CYC); adc_set_multi_mode(ADC_CCR_MULTI_INDEPENDENT); adc_set_dma_continue(ADC1); adc_enable_dma(ADC1); adc_enable_overrun_interrupt(ADC1); }