3535#include "stm32f7xx_hal.h"
3636#include "PeripheralPins.h"
3737
38+ // These variables are used for the "free" function
39+ static int channel1_used = 0 ;
40+ #if defined(DAC_CHANNEL_2 )
41+ static int channel2_used = 0 ;
42+ #endif
43+
3844void analogout_init (dac_t * obj , PinName pin )
3945{
4046 DAC_ChannelConfTypeDef sConfig = {0 };
@@ -67,6 +73,9 @@ void analogout_init(dac_t *obj, PinName pin)
6773 // Configure GPIO
6874 pinmap_pinout (pin , PinMap_DAC );
6975
76+ // Save the pin for future use
77+ obj -> pin = pin ;
78+
7079 __GPIOA_CLK_ENABLE ();
7180
7281 __DAC_CLK_ENABLE ();
@@ -85,12 +94,41 @@ void analogout_init(dac_t *obj, PinName pin)
8594 error ("HAL_DAC_ConfigChannel failed" );
8695 }
8796
97+ if (obj -> channel == DAC_CHANNEL_1 ) {
98+ channel1_used = 1 ;
99+ }
100+ #if defined(DAC_CHANNEL_2 )
101+ if (obj -> channel == DAC_CHANNEL_2 ) {
102+ channel2_used = 1 ;
103+ }
104+ #endif
88105 analogout_write_u16 (obj , 0 );
89106 HAL_DAC_Start (& obj -> handle , obj -> channel );
90107}
91108
92109void analogout_free (dac_t * obj )
93110{
111+ if (obj -> channel == DAC_CHANNEL_1 ) {
112+ channel1_used = 0 ;
113+ }
114+ #if defined(DAC_CHANNEL_2 )
115+ if (obj -> channel == DAC_CHANNEL_2 ) {
116+ channel2_used = 0 ;
117+ }
118+ #endif
119+ if ((channel1_used == 0 )
120+ #if defined(DAC_CHANNEL_2 )
121+ & & (channel2_used == 0 )
122+ #endif
123+ ) {
124+ // Reset DAC and disable clock
125+ __HAL_RCC_DAC_FORCE_RESET ();
126+ __HAL_RCC_DAC_RELEASE_RESET ();
127+ __HAL_RCC_DAC_CLK_DISABLE ();
128+
129+ // Configure GPIO back to reset value
130+ pin_function (obj -> pin , STM_PIN_DATA (STM_MODE_ANALOG , GPIO_NOPULL , 0 ));
131+ }
94132}
95133
96134const PinMap * analogout_pinmap ()
0 commit comments