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