diff options
| author | hierophect <hierophect@gmail.com> | 2019-11-07 09:38:19 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-11-07 09:38:19 -0500 |
| commit | 147a1bb8603dcfd54d794b6f2d28273c9e227e85 (patch) | |
| tree | ebb4274c1859b68fa78038e0ca637adcb0c18594 | |
| parent | b8373aca0c38d709266e3c0534da26ab3bcbff80 (diff) | |
| parent | d42c4b082d2d7d50d3588a5983f5222d3d60b11e (diff) | |
Merge pull request #2268 from hierophect/stm32-dac-deinit
STM32: DAC auto shutoff
| -rw-r--r-- | ports/stm32f4/common-hal/analogio/AnalogOut.c | 19 | ||||
| -rw-r--r-- | ports/stm32f4/common-hal/analogio/AnalogOut.h | 2 |
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); |
