diff options
| -rw-r--r-- | watch-library/hardware/watch/watch_adc.c | 20 | ||||
| -rw-r--r-- | watch-library/shared/watch/watch_adc.h | 25 | 
2 files changed, 23 insertions, 22 deletions
diff --git a/watch-library/hardware/watch/watch_adc.c b/watch-library/hardware/watch/watch_adc.c index 5ba7abdf..32f06680 100644 --- a/watch-library/hardware/watch/watch_adc.c +++ b/watch-library/hardware/watch/watch_adc.c @@ -23,6 +23,7 @@   */  #include "watch_adc.h" +#include "driver_init.h"  static void _watch_sync_adc(void) {      while (ADC->SYNCBUSY.reg); @@ -138,13 +139,30 @@ void watch_set_analog_sampling_length(uint8_t cycles) {      _watch_sync_adc();  } +static inline uint32_t _watch_adc_get_reference_voltage(const watch_adc_reference_voltage reference) { +    switch (reference) { +        case ADC_REFERENCE_INTREF: +            return ADC_REFCTRL_REFSEL_INTREF_Val; +            break; +        case ADC_REFERENCE_VCC_DIV1POINT6: +            return ADC_REFCTRL_REFSEL_INTVCC0_Val; +            break; +        case ADC_REFERENCE_VCC_DIV2: +            return ADC_REFCTRL_REFSEL_INTVCC1_Val; +            break; +        case ADC_REFERENCE_VCC: +            return ADC_REFCTRL_REFSEL_INTVCC2_Val; +            break; +    } +} +  void watch_set_analog_reference_voltage(watch_adc_reference_voltage reference) {      ADC->CTRLA.bit.ENABLE = 0;      if (reference == ADC_REFERENCE_INTREF) SUPC->VREF.bit.VREFOE = 1;      else SUPC->VREF.bit.VREFOE = 0; -    ADC->REFCTRL.bit.REFSEL = reference; +    ADC->REFCTRL.bit.REFSEL = _watch_adc_get_reference_voltage(reference);      ADC->CTRLA.bit.ENABLE = 1;      _watch_sync_adc();      // throw away one measurement after reference change (the channel doesn't matter). diff --git a/watch-library/shared/watch/watch_adc.h b/watch-library/shared/watch/watch_adc.h index d4c8586d..ea4fa9e3 100644 --- a/watch-library/shared/watch/watch_adc.h +++ b/watch-library/shared/watch/watch_adc.h @@ -27,23 +27,6 @@  #include "watch.h" -// matches adc.h -#ifndef ADC_REFCTRL_REFSEL_INTREF_Val -#define ADC_REFCTRL_REFSEL_INTREF_Val 0x0 -#endif - -#ifndef ADC_REFCTRL_REFSEL_INTVCC0_Val -#define ADC_REFCTRL_REFSEL_INTVCC0_Val 0x1 -#endif - -#ifndef ADC_REFCTRL_REFSEL_INTVCC1_Val -#define ADC_REFCTRL_REFSEL_INTVCC1_Val 0x2 -#endif - -#ifndef ADC_REFCTRL_REFSEL_INTVCC2_Val -#define ADC_REFCTRL_REFSEL_INTVCC2_Val 0x5 -#endif -  /** @addtogroup adc Analog Input    * @brief This section covers functions related to the SAM L22's analog-to-digital converter,    *        as well as configuring and reading values from the five analog-capable pins on the @@ -112,10 +95,10 @@ void watch_set_analog_num_samples(uint16_t samples);  void watch_set_analog_sampling_length(uint8_t cycles);  typedef enum { -    ADC_REFERENCE_INTREF = ADC_REFCTRL_REFSEL_INTREF_Val, -    ADC_REFERENCE_VCC_DIV1POINT6 = ADC_REFCTRL_REFSEL_INTVCC0_Val, -    ADC_REFERENCE_VCC_DIV2 = ADC_REFCTRL_REFSEL_INTVCC1_Val, -    ADC_REFERENCE_VCC = ADC_REFCTRL_REFSEL_INTVCC2_Val, +    ADC_REFERENCE_INTREF = 0, +    ADC_REFERENCE_VCC_DIV1POINT6, +    ADC_REFERENCE_VCC_DIV2, +    ADC_REFERENCE_VCC,  } watch_adc_reference_voltage;  | 
