summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhierophect <hierophect@gmail.com>2019-11-07 09:38:19 -0500
committerGitHub <noreply@github.com>2019-11-07 09:38:19 -0500
commit147a1bb8603dcfd54d794b6f2d28273c9e227e85 (patch)
treeebb4274c1859b68fa78038e0ca637adcb0c18594
parentb8373aca0c38d709266e3c0534da26ab3bcbff80 (diff)
parentd42c4b082d2d7d50d3588a5983f5222d3d60b11e (diff)
Merge pull request #2268 from hierophect/stm32-dac-deinit
STM32: DAC auto shutoff
-rw-r--r--ports/stm32f4/common-hal/analogio/AnalogOut.c19
-rw-r--r--ports/stm32f4/common-hal/analogio/AnalogOut.h2
2 files changed, 14 insertions, 7 deletions
diff --git a/ports/stm32f4/common-hal/analogio/AnalogOut.c b/ports/stm32f4/common-hal/analogio/AnalogOut.c
index 5eb8c2dc0..79ced0492 100644
--- a/ports/stm32f4/common-hal/analogio/AnalogOut.c
+++ b/ports/stm32f4/common-hal/analogio/AnalogOut.c
@@ -40,12 +40,12 @@
#include "stm32f4xx_hal.h"
//DAC is shared between both channels.
-//TODO: store as struct with channel info, automatically turn it off if unused
-//on both channels for power save?
#if HAS_DAC
DAC_HandleTypeDef handle;
#endif
+STATIC bool dac_on[2];
+
void common_hal_analogio_analogout_construct(analogio_analogout_obj_t* self,
const mcu_pin_obj_t *pin) {
#if !(HAS_DAC)
@@ -53,8 +53,10 @@ void common_hal_analogio_analogout_construct(analogio_analogout_obj_t* self,
#else
if (pin == &pin_PA04) {
self->channel = DAC_CHANNEL_1;
+ self->dac_index = 0;
} else if (pin == &pin_PA05) {
self->channel = DAC_CHANNEL_2;
+ self->dac_index = 1;
} else {
mp_raise_ValueError(translate("Invalid DAC pin supplied"));
}
@@ -82,22 +84,27 @@ void common_hal_analogio_analogout_construct(analogio_analogout_obj_t* self,
mp_raise_ValueError(translate("DAC Channel Init Error"));
}
+ dac_on[self->dac_index] = true;
self->pin = pin;
- self->deinited = false;
claim_pin(pin);
#endif
}
bool common_hal_analogio_analogout_deinited(analogio_analogout_obj_t *self) {
- return self->deinited;
+ return !dac_on[self->dac_index];
}
void common_hal_analogio_analogout_deinit(analogio_analogout_obj_t *self) {
#if HAS_DAC
reset_pin_number(self->pin->port,self->pin->number);
self->pin = mp_const_none;
- self->deinited = true;
- //TODO: if both are de-inited, should we turn off the DAC?
+ dac_on[self->dac_index] = false;
+
+ //turn off the DAC if both channels are off
+ if(dac_on[0] == false && dac_on[1] == false) {
+ __HAL_RCC_DAC_CLK_DISABLE();
+ HAL_DAC_DeInit(&handle);
+ }
#endif
}
diff --git a/ports/stm32f4/common-hal/analogio/AnalogOut.h b/ports/stm32f4/common-hal/analogio/AnalogOut.h
index 1381d4d3a..61591d0e6 100644
--- a/ports/stm32f4/common-hal/analogio/AnalogOut.h
+++ b/ports/stm32f4/common-hal/analogio/AnalogOut.h
@@ -41,7 +41,7 @@ typedef struct {
#endif
const mcu_pin_obj_t * pin;
uint8_t channel;
- bool deinited;
+ uint8_t dac_index:1;
} analogio_analogout_obj_t;
void analogout_reset(void);