summaryrefslogtreecommitdiffstats
path: root/watch-library/hardware
diff options
context:
space:
mode:
authorjoeycastillo <joeycastillo@utexas.edu>2022-01-25 17:57:25 -0500
committerGitHub <noreply@github.com>2022-01-25 17:57:25 -0500
commitbbda09e23f0048e42b815a200005df661337caf0 (patch)
tree3ae5d6c0af28986d2c2743604c04777c939f31af /watch-library/hardware
parent71ea3b9de98de7034c081adaae2e1e1ff79390d4 (diff)
parent84b65cb699ead52033844fb9355f426bdaef5e3e (diff)
downloadSensor-Watch-bbda09e23f0048e42b815a200005df661337caf0.tar.gz
Sensor-Watch-bbda09e23f0048e42b815a200005df661337caf0.tar.bz2
Sensor-Watch-bbda09e23f0048e42b815a200005df661337caf0.zip
Merge pull request #44 from a2/voltage-reference
Remove ADC_* defines in favor of hardware-specific mapping
Diffstat (limited to 'watch-library/hardware')
-rw-r--r--watch-library/hardware/watch/watch_adc.c20
1 files changed, 19 insertions, 1 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).