Skip to content

Commit 59ba97f

Browse files
committed
analogout: STM32: Implemented analogout_free for STM32H7 series
analogout_free implemented with multiple DAC channel usage check.
1 parent c22331c commit 59ba97f

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

targets/TARGET_STM/TARGET_STM32H7/analogout_device.c

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@
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+
2632
void 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

8097
void 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

84131
const PinMap *analogout_pinmap()

0 commit comments

Comments
 (0)