From d035a9cd39cf9720416ead3a149f7e2e1a1aa7d6 Mon Sep 17 00:00:00 2001 From: Karl Palsson Date: Sat, 10 Sep 2016 13:16:55 +0000 Subject: [PATCH] stm32f1: adc: use common api for calibration routines Use same names as adv-v2 peripheral uses. F1 is the only v1 peripheral adc that has calibration modes at all. Old: adc_calibration(ADC1); // blocking call New (blocking): adc_calibrate(ADC1); New (asynch): adc_calibrate_async(ADC1); // do stuff adc_is_calibrating(ADC1); // false when calibration finished Old routines are preserved but marked deprecated for now. --- include/libopencm3/stm32/f1/adc.h | 6 +++++- lib/stm32/f1/adc.c | 35 ++++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/include/libopencm3/stm32/f1/adc.h b/include/libopencm3/stm32/f1/adc.h index 54045948..91a03bbb 100644 --- a/include/libopencm3/stm32/f1/adc.h +++ b/include/libopencm3/stm32/f1/adc.h @@ -412,7 +412,11 @@ void adc_disable_temperature_sensor(uint32_t adc); void adc_enable_external_trigger_regular(uint32_t adc, uint32_t trigger); void adc_enable_external_trigger_injected(uint32_t adc, uint32_t trigger); void adc_reset_calibration(uint32_t adc); -void adc_calibration(uint32_t adc); +void adc_calibration(uint32_t adc) + LIBOPENCM3_DEPRECATED("see adc_calibrate/_async");; +void adc_calibrate_async(uint32_t adc); +bool adc_is_calibrating(uint32_t adc); +void adc_calibrate(uint32_t adc); void adc_on(uint32_t adc) LIBOPENCM3_DEPRECATED("will be removed in the first release"); diff --git a/lib/stm32/f1/adc.c b/lib/stm32/f1/adc.c index 3830ce12..c915ae88 100644 --- a/lib/stm32/f1/adc.c +++ b/lib/stm32/f1/adc.c @@ -349,7 +349,7 @@ void adc_reset_calibration(uint32_t adc) /*---------------------------------------------------------------------------*/ /** @brief ADC Calibration - +@deprecated replaced by adc_calibrate/_async/_is_calibrating The calibration data for the ADC is recomputed. The hardware clears the calibration status flag when calibration is complete. This function does not return until this happens and the ADC is ready for use. @@ -367,6 +367,39 @@ void adc_calibration(uint32_t adc) while (ADC_CR2(adc) & ADC_CR2_CAL); } +/** + * Start the ADC calibration and immediately return. + * @sa adc_calibrate + * @sa adc_is_calibrate + * @param adc ADC Block register address base @ref adc_reg_base + */ +void adc_calibrate_async(uint32_t adc) +{ + ADC_CR2(adc) |= ADC_CR2_CAL; +} + +/** + * Is the ADC Calibrating? + * @param adc ADC Block register address base @ref adc_reg_base + * @return true if the adc is currently calibrating + */ +bool adc_is_calibrating(uint32_t adc) +{ + return (ADC_CR2(adc) & ADC_CR2_CAL); +} + +/** + * Start ADC calibration and wait for it to finish. + * The ADC must have been powered down for at least 2 ADC clock cycles, then + * powered on before calibration starts + * @param adc ADC Block register address base @ref adc_reg_base + */ +void adc_calibrate(uint32_t adc) +{ + adc_calibrate_async(adc); + while (adc_is_calibrating(adc)); +} + /*---------------------------------------------------------------------------*/ /** @brief ADC Power On