46
46
DAC_HandleTypeDef handle ;
47
47
#endif
48
48
49
+ STATIC bool dac_on [2 ];
50
+
49
51
void common_hal_analogio_analogout_construct (analogio_analogout_obj_t * self ,
50
52
const mcu_pin_obj_t * pin ) {
51
53
#if !(HAS_DAC )
52
54
mp_raise_ValueError (translate ("No DAC on chip" ));
53
55
#else
54
56
if (pin == & pin_PA04 ) {
55
57
self -> channel = DAC_CHANNEL_1 ;
58
+ self -> dac_index = 0 ;
56
59
} else if (pin == & pin_PA05 ) {
57
60
self -> channel = DAC_CHANNEL_2 ;
61
+ self -> dac_index = 1 ;
58
62
} else {
59
63
mp_raise_ValueError (translate ("Invalid DAC pin supplied" ));
60
64
}
65
+ dac_on [self -> dac_index ] = true;
61
66
62
67
//Only init if the shared DAC is empty or reset
63
68
if (handle .Instance == NULL || handle .State == HAL_DAC_STATE_RESET ) {
@@ -83,21 +88,25 @@ void common_hal_analogio_analogout_construct(analogio_analogout_obj_t* self,
83
88
}
84
89
85
90
self -> pin = pin ;
86
- self -> deinited = false;
87
91
claim_pin (pin );
88
92
#endif
89
93
}
90
94
91
95
bool common_hal_analogio_analogout_deinited (analogio_analogout_obj_t * self ) {
92
- return self -> deinited ;
96
+ return ! dac_on [ self -> dac_index ] ;
93
97
}
94
98
95
99
void common_hal_analogio_analogout_deinit (analogio_analogout_obj_t * self ) {
96
100
#if HAS_DAC
97
101
reset_pin_number (self -> pin -> port ,self -> pin -> number );
98
102
self -> pin = mp_const_none ;
99
- self -> deinited = true;
100
- //TODO: if both are de-inited, should we turn off the DAC?
103
+ dac_on [self -> dac_index ] = false;
104
+
105
+ //turn off the DAC if both channels are off
106
+ if (dac_on [0 ] == false && dac_on [1 ] == false) {
107
+ __HAL_RCC_DAC_CLK_DISABLE ();
108
+ HAL_DAC_DeInit (& handle );
109
+ }
101
110
#endif
102
111
}
103
112
0 commit comments