Skip to content

Commit c22331c

Browse files
committed
analogout: STM32: analogout_free implementation for STM32F7
Implemented analogout_free for STM32F7 Series.
1 parent b52b3b6 commit c22331c

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

targets/TARGET_STM/TARGET_STM32F7/analogout_device.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@
3535
#include "stm32f7xx_hal.h"
3636
#include "PeripheralPins.h"
3737

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+
3844
void analogout_init(dac_t *obj, PinName pin)
3945
{
4046
DAC_ChannelConfTypeDef sConfig = {0};
@@ -67,6 +73,9 @@ void analogout_init(dac_t *obj, PinName pin)
6773
// Configure GPIO
6874
pinmap_pinout(pin, PinMap_DAC);
6975

76+
// Save the pin for future use
77+
obj->pin = pin;
78+
7079
__GPIOA_CLK_ENABLE();
7180

7281
__DAC_CLK_ENABLE();
@@ -85,12 +94,41 @@ void analogout_init(dac_t *obj, PinName pin)
8594
error("HAL_DAC_ConfigChannel failed");
8695
}
8796

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
88105
analogout_write_u16(obj, 0);
89106
HAL_DAC_Start(&obj->handle, obj->channel);
90107
}
91108

92109
void analogout_free(dac_t *obj)
93110
{
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+
}
94132
}
95133

96134
const PinMap *analogout_pinmap()

0 commit comments

Comments
 (0)