Skip to content

Commit b2e82d0

Browse files
committed
analogout: STM32: Implemented analogout_free for STM32H7 series
analogout_free implemented with multiple DAC channel usage check.
1 parent 7d05015 commit b2e82d0

File tree

1 file changed

+40
-0
lines changed

1 file changed

+40
-0
lines changed

targets/TARGET_STM/TARGET_STM32H7/analogout_device.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
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+
static int channel2_used = 0;
29+
2630
void analogout_init(dac_t *obj, PinName pin)
2731
{
2832
DAC_ChannelConfTypeDef sConfig = {0};
@@ -55,6 +59,9 @@ void analogout_init(dac_t *obj, PinName pin)
5559
// Configure GPIO
5660
pinmap_pinout(pin, PinMap_DAC);
5761

62+
// Save the pin for future use
63+
obj->pin = pin;
64+
5865
__GPIOA_CLK_ENABLE();
5966

6067
__HAL_RCC_DAC12_CLK_ENABLE();
@@ -73,12 +80,45 @@ void analogout_init(dac_t *obj, PinName pin)
7380
error("HAL_DAC_ConfigChannel failed");
7481
}
7582

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+
7691
analogout_write_u16(obj, 0);
7792
HAL_DAC_Start(&obj->handle, obj->channel);
7893
}
7994

8095
void analogout_free(dac_t *obj)
8196
{
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));
82122
}
83123

84124
const PinMap *analogout_pinmap()

0 commit comments

Comments
 (0)