2323#include "stm32h7xx_hal.h"
2424#include "PeripheralPins.h"
2525
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+
2632void analogout_init (dac_t * obj , PinName pin )
2733{
2834 DAC_ChannelConfTypeDef sConfig = {0 };
@@ -55,6 +61,9 @@ void analogout_init(dac_t *obj, PinName pin)
5561 // Configure GPIO
5662 pinmap_pinout (pin , PinMap_DAC );
5763
64+ // Save the pin for future use
65+ obj -> pin = pin ;
66+
5867 __GPIOA_CLK_ENABLE ();
5968
6069 __HAL_RCC_DAC12_CLK_ENABLE ();
@@ -73,12 +82,50 @@ void analogout_init(dac_t *obj, PinName pin)
7382 error ("HAL_DAC_ConfigChannel failed" );
7483 }
7584
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
7693 analogout_write_u16 (obj , 0 );
7794 HAL_DAC_Start (& obj -> handle , obj -> channel );
7895}
7996
8097void analogout_free (dac_t * obj )
8198{
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 ));
82129}
83130
84131const PinMap * analogout_pinmap ()
0 commit comments