23
23
#include "stm32h7xx_hal.h"
24
24
#include "PeripheralPins.h"
25
25
26
+ // These variables are used for the "free" function
27
+ static int channel1_used = 0 ;
28
+ #if defined(DAC_CHANNEL_2 )
29
+ static int channel2_used = 0 ;
30
+ #endif
31
+
26
32
void analogout_init (dac_t * obj , PinName pin )
27
33
{
28
34
DAC_ChannelConfTypeDef sConfig = {0 };
@@ -55,6 +61,9 @@ void analogout_init(dac_t *obj, PinName pin)
55
61
// Configure GPIO
56
62
pinmap_pinout (pin , PinMap_DAC );
57
63
64
+ // Save the pin for future use
65
+ obj -> pin = pin ;
66
+
58
67
__GPIOA_CLK_ENABLE ();
59
68
60
69
__HAL_RCC_DAC12_CLK_ENABLE ();
@@ -73,12 +82,50 @@ void analogout_init(dac_t *obj, PinName pin)
73
82
error ("HAL_DAC_ConfigChannel failed" );
74
83
}
75
84
85
+ if (obj -> channel == DAC_CHANNEL_1 ) {
86
+ channel1_used = 1 ;
87
+ }
88
+ #if defined(DAC_CHANNEL_2 )
89
+ if (obj -> channel == DAC_CHANNEL_2 ) {
90
+ channel2_used = 1 ;
91
+ }
92
+ #endif
76
93
analogout_write_u16 (obj , 0 );
77
94
HAL_DAC_Start (& obj -> handle , obj -> channel );
78
95
}
79
96
80
97
void analogout_free (dac_t * obj )
81
98
{
99
+ if (obj -> channel == DAC_CHANNEL_1 ) {
100
+ channel1_used = 0 ;
101
+ }
102
+ #if defined(DAC_CHANNEL_2 )
103
+ if (obj -> channel == DAC_CHANNEL_2 ) {
104
+ channel2_used = 0 ;
105
+ }
106
+ #endif
107
+
108
+ if ((channel1_used == 0 )
109
+ #if defined(DAC_CHANNEL_2 )
110
+ & & (channel2_used == 0 )
111
+ #endif
112
+ ) {
113
+ // Reset DAC and disable clock
114
+ __HAL_RCC_DAC12_FORCE_RESET ();
115
+ __HAL_RCC_DAC12_RELEASE_RESET ();
116
+ __HAL_RCC_DAC12_CLK_DISABLE ();
117
+ }
118
+
119
+ #if defined(DAC2 )
120
+ if (obj -> dac == DAC_2 ) {
121
+ __HAL_RCC_DAC2_FORCE_RESET ();
122
+ __HAL_RCC_DAC2_RELEASE_RESET ();
123
+ __HAL_RCC_DAC2_CLK_DISABLE ();
124
+ }
125
+ #endif
126
+
127
+ // Configure GPIO back to reset value
128
+ pin_function (obj -> pin , STM_PIN_DATA (STM_MODE_ANALOG , GPIO_NOPULL , 0 ));
82
129
}
83
130
84
131
const PinMap * analogout_pinmap ()
0 commit comments