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