From b1e495f51a79cfe039e3805d711713b8843265b4 Mon Sep 17 00:00:00 2001 From: Karl Palsson Date: Wed, 29 Jul 2015 13:22:46 +0000 Subject: [PATCH] stm32f3: adc: Add support for sequence completion flags The f3 adc has separate bits for end of conversion and end of sequence. Support those fully, with the regular enable/disable irq methods, and the flag checking methods. Discovered in github bug: #493 --- include/libopencm3/stm32/f3/adc.h | 6 +++ lib/stm32/f3/adc.c | 81 +++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) diff --git a/include/libopencm3/stm32/f3/adc.h b/include/libopencm3/stm32/f3/adc.h index 9ca95f60..56c97480 100644 --- a/include/libopencm3/stm32/f3/adc.h +++ b/include/libopencm3/stm32/f3/adc.h @@ -888,10 +888,14 @@ void adc_enable_analog_watchdog_on_selected_channel(uint32_t adc, /*void adc_disable_scan_mode(uint32_t adc);*/ void adc_enable_eoc_interrupt_injected(uint32_t adc); void adc_disable_eoc_interrupt_injected(uint32_t adc); +void adc_enable_eos_interrupt_injected(uint32_t adc); +void adc_disable_eos_interrupt_injected(uint32_t adc); void adc_enable_all_awd_interrupt(uint32_t adc); void adc_disable_all_awd_interrupt(uint32_t adc); void adc_enable_eoc_interrupt(uint32_t adc); void adc_disable_eoc_interrupt(uint32_t adc); +void adc_enable_eos_interrupt(uint32_t adc); +void adc_disable_eos_interrupt(uint32_t adc); void adc_start_conversion_regular(uint32_t adc); void adc_start_conversion_injected(uint32_t adc); void adc_disable_external_trigger_regular(uint32_t adc); @@ -910,6 +914,8 @@ void adc_set_regular_sequence(uint32_t adc, uint8_t length, uint8_t channel[]); void adc_set_injected_sequence(uint32_t adc, uint8_t length, uint8_t channel[]); bool adc_eoc(uint32_t adc); bool adc_eoc_injected(uint32_t adc); +bool adc_eos(uint32_t adc); +bool adc_eos_injected(uint32_t adc); uint32_t adc_read_regular(uint32_t adc); uint32_t adc_read_injected(uint32_t adc, uint8_t reg); void adc_set_injected_offset(uint32_t adc, uint8_t reg, uint32_t offset); diff --git a/lib/stm32/f3/adc.c b/lib/stm32/f3/adc.c index 63dc47e7..f4621b1c 100644 --- a/lib/stm32/f3/adc.c +++ b/lib/stm32/f3/adc.c @@ -366,6 +366,31 @@ void adc_disable_eoc_interrupt_injected(uint32_t adc) ADC_IER(adc) &= ~ADC_IER_JEOCIE; } +/*---------------------------------------------------------------------------*/ +/** @brief ADC Enable Injected End-Of-Sequence Interrupt + * + * @param[in] adc Unsigned int32. ADC block register address base @ref + * adc_reg_base + */ + +void adc_enable_eos_interrupt_injected(uint32_t adc) +{ + ADC_IER(adc) |= ADC_IER_JEOSIE; +} + +/*---------------------------------------------------------------------------*/ +/** @brief ADC Disable Injected End-Of-Sequence Interrupt + * + * @param[in] adc Unsigned int32. ADC block register address base @ref + * adc_reg_base + */ + +void adc_disable_eos_interrupt_injected(uint32_t adc) +{ + ADC_IER(adc) &= ~ADC_IER_JEOSIE; +} + + /*---------------------------------------------------------------------------*/ /** @brief ADC Enable Analog Watchdog Interrupt * @@ -418,6 +443,31 @@ void adc_disable_eoc_interrupt(uint32_t adc) ADC_IER(adc) &= ~ADC_IER_EOCIE; } +/*---------------------------------------------------------------------------*/ +/** @brief ADC Enable Regular End-Of-Sequence Interrupt + * + * @param[in] adc Unsigned int32. ADC block register address base @ref + * adc_reg_base + */ + +void adc_enable_eos_interrupt(uint32_t adc) +{ + ADC_IER(adc) |= ADC_IER_EOSIE; +} + +/*---------------------------------------------------------------------------*/ +/** @brief ADC Disable Regular End-Of-Sequence Interrupt + * + * @param[in] adc Unsigned int32. ADC block register address base @ref + * adc_reg_base + */ + +void adc_disable_eos_interrupt(uint32_t adc) +{ + ADC_IER(adc) &= ~ADC_IER_EOSIE; +} + + /*---------------------------------------------------------------------------*/ /** @brief ADC Software Triggered Conversion on Regular Channels * @@ -743,6 +793,37 @@ bool adc_eoc_injected(uint32_t adc) return ADC_ISR(adc) & ADC_ISR_JEOC; } +/*---------------------------------------------------------------------------*/ +/** @brief ADC Read the End-of-Sequence Flag for Regular Conversions + * + * This flag is set after all channels of an regular group have been + * converted. + * + * @param[in] adc Unsigned int32. ADC block register address base + * @ref adc_reg_base + * @returns bool. End of conversion flag. + */ +bool adc_eos(uint32_t adc) +{ + return ADC_ISR(adc) & ADC_ISR_EOS; +} + +/*---------------------------------------------------------------------------*/ +/** @brief ADC Read the End-of-Sequence Flag for Injected Conversions + * + * This flag is set after all channels of an injected group have been + * converted. + * + * @param[in] adc Unsigned int32. ADC block register address base + * @ref adc_reg_base + * @returns bool. End of conversion flag. + */ +bool adc_eos_injected(uint32_t adc) +{ + return ADC_ISR(adc) & ADC_ISR_JEOS; +} + + /*---------------------------------------------------------------------------*/ /** @brief ADC Read from the Regular Conversion Result Register *