35
35
#include "stm32f7xx_hal.h"
36
36
#include "PeripheralPins.h"
37
37
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
+
38
44
void analogout_init (dac_t * obj , PinName pin )
39
45
{
40
46
DAC_ChannelConfTypeDef sConfig = {0 };
@@ -67,6 +73,9 @@ void analogout_init(dac_t *obj, PinName pin)
67
73
// Configure GPIO
68
74
pinmap_pinout (pin , PinMap_DAC );
69
75
76
+ // Save the pin for future use
77
+ obj -> pin = pin ;
78
+
70
79
__GPIOA_CLK_ENABLE ();
71
80
72
81
__DAC_CLK_ENABLE ();
@@ -85,12 +94,41 @@ void analogout_init(dac_t *obj, PinName pin)
85
94
error ("HAL_DAC_ConfigChannel failed" );
86
95
}
87
96
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
88
105
analogout_write_u16 (obj , 0 );
89
106
HAL_DAC_Start (& obj -> handle , obj -> channel );
90
107
}
91
108
92
109
void analogout_free (dac_t * obj )
93
110
{
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
+ }
94
132
}
95
133
96
134
const PinMap * analogout_pinmap ()
0 commit comments