Remove ADC_* defines in favor of hardware-specific mapping

This commit is contained in:
Alexsander Akers 2022-01-24 19:06:54 -05:00
parent f819a18791
commit 84b65cb699
2 changed files with 23 additions and 22 deletions

View File

@ -23,6 +23,7 @@
*/ */
#include "watch_adc.h" #include "watch_adc.h"
#include "driver_init.h"
static void _watch_sync_adc(void) { static void _watch_sync_adc(void) {
while (ADC->SYNCBUSY.reg); while (ADC->SYNCBUSY.reg);
@ -138,13 +139,30 @@ void watch_set_analog_sampling_length(uint8_t cycles) {
_watch_sync_adc(); _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) { void watch_set_analog_reference_voltage(watch_adc_reference_voltage reference) {
ADC->CTRLA.bit.ENABLE = 0; ADC->CTRLA.bit.ENABLE = 0;
if (reference == ADC_REFERENCE_INTREF) SUPC->VREF.bit.VREFOE = 1; if (reference == ADC_REFERENCE_INTREF) SUPC->VREF.bit.VREFOE = 1;
else SUPC->VREF.bit.VREFOE = 0; 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; ADC->CTRLA.bit.ENABLE = 1;
_watch_sync_adc(); _watch_sync_adc();
// throw away one measurement after reference change (the channel doesn't matter). // throw away one measurement after reference change (the channel doesn't matter).

View File

@ -27,23 +27,6 @@
#include "watch.h" #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 /** @addtogroup adc Analog Input
* @brief This section covers functions related to the SAM L22's analog-to-digital converter, * @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 * 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); void watch_set_analog_sampling_length(uint8_t cycles);
typedef enum { typedef enum {
ADC_REFERENCE_INTREF = ADC_REFCTRL_REFSEL_INTREF_Val, ADC_REFERENCE_INTREF = 0,
ADC_REFERENCE_VCC_DIV1POINT6 = ADC_REFCTRL_REFSEL_INTVCC0_Val, ADC_REFERENCE_VCC_DIV1POINT6,
ADC_REFERENCE_VCC_DIV2 = ADC_REFCTRL_REFSEL_INTVCC1_Val, ADC_REFERENCE_VCC_DIV2,
ADC_REFERENCE_VCC = ADC_REFCTRL_REFSEL_INTVCC2_Val, ADC_REFERENCE_VCC,
} watch_adc_reference_voltage; } watch_adc_reference_voltage;