Skip to content

Commit 3fcc834

Browse files
authored
Merge pull request #14844 from AnishKumarHCL/analogout_free_implementation
Analogout free implementation for F4/F7/H7 boards
2 parents 6597cd1 + 59ba97f commit 3fcc834

File tree

4 files changed

+125
-0
lines changed

4 files changed

+125
-0
lines changed

targets/TARGET_STM/TARGET_STM32F4/analogout_device.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@
2323
#include "stm32f4xx_hal.h"
2424
#include "PeripheralPins.h"
2525

26+
// These variables are used for the "free" function
27+
static int dac_channel1_used = 0;
28+
#if defined(DAC_CHANNEL_2)
29+
static int dac_channel2_used = 0;
30+
#endif
31+
2632
#if STATIC_PINMAP_READY
2733
#define ANALOGOUT_INIT_DIRECT analogout_init_direct
2834
void analogout_init_direct(dac_t *obj, const PinMap *pinmap)
@@ -62,6 +68,9 @@ static void _analogout_init_direct(dac_t *obj, const PinMap *pinmap)
6268
pin_function(pinmap->pin, pinmap->function);
6369
pin_mode(pinmap->pin, PullNone);
6470

71+
// Save the pin for future use
72+
obj->pin = pinmap->pin;
73+
6574
__HAL_RCC_GPIOA_CLK_ENABLE();
6675

6776
__HAL_RCC_DAC_CLK_ENABLE();
@@ -80,6 +89,14 @@ static void _analogout_init_direct(dac_t *obj, const PinMap *pinmap)
8089
error("HAL_DAC_ConfigChannel failed");
8190
}
8291

92+
if (obj->channel == DAC_CHANNEL_1) {
93+
dac_channel1_used = 1;
94+
}
95+
#if defined(DAC_CHANNEL_2)
96+
if (obj->channel == DAC_CHANNEL_2) {
97+
dac_channel2_used = 1;
98+
}
99+
#endif
83100
analogout_write_u16(obj, 0);
84101
HAL_DAC_Start(&obj->handle, obj->channel);
85102
}
@@ -96,6 +113,28 @@ void analogout_init(dac_t *obj, PinName pin)
96113

97114
void analogout_free(dac_t *obj)
98115
{
116+
if (obj->channel == DAC_CHANNEL_1) {
117+
dac_channel1_used = 0;
118+
}
119+
#if defined(DAC_CHANNEL_2)
120+
if (obj->channel == DAC_CHANNEL_2) {
121+
dac_channel2_used = 0;
122+
}
123+
#endif
124+
125+
if ((dac_channel1_used == 0)
126+
#if defined(DAC_CHANNEL_2)
127+
&& (dac_channel2_used == 0)
128+
#endif
129+
) {
130+
// Reset DAC and disable clock
131+
__HAL_RCC_DAC_FORCE_RESET();
132+
__HAL_RCC_DAC_RELEASE_RESET();
133+
__HAL_RCC_DAC_CLK_DISABLE();
134+
135+
// Configure GPIO back to reset value
136+
pin_function(obj->pin, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
137+
}
99138
}
100139

101140
const PinMap *analogout_pinmap()

targets/TARGET_STM/TARGET_STM32F4/objects.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ struct analogin_s {
141141
#if DEVICE_ANALOGOUT
142142
struct dac_s {
143143
DACName dac;
144+
PinName pin;
144145
uint32_t channel;
145146
DAC_HandleTypeDef handle;
146147
};

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()

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
if (obj->dac == DAC_1) {
@@ -80,12 +89,50 @@ void analogout_init(dac_t *obj, PinName pin)
8089
error("HAL_DAC_ConfigChannel failed");
8190
}
8291

92+
if (obj->channel == DAC_CHANNEL_1) {
93+
channel1_used = 1;
94+
}
95+
#if defined(DAC_CHANNEL_2)
96+
if (obj->channel == DAC_CHANNEL_2) {
97+
channel2_used = 1;
98+
}
99+
#endif
83100
analogout_write_u16(obj, 0);
84101
HAL_DAC_Start(&obj->handle, obj->channel);
85102
}
86103

87104
void analogout_free(dac_t *obj)
88105
{
106+
if (obj->channel == DAC_CHANNEL_1) {
107+
channel1_used = 0;
108+
}
109+
#if defined(DAC_CHANNEL_2)
110+
if (obj->channel == DAC_CHANNEL_2) {
111+
channel2_used = 0;
112+
}
113+
#endif
114+
115+
if ((channel1_used == 0)
116+
#if defined(DAC_CHANNEL_2)
117+
&& (channel2_used == 0)
118+
#endif
119+
) {
120+
// Reset DAC and disable clock
121+
__HAL_RCC_DAC12_FORCE_RESET();
122+
__HAL_RCC_DAC12_RELEASE_RESET();
123+
__HAL_RCC_DAC12_CLK_DISABLE();
124+
}
125+
126+
#if defined(DAC2)
127+
if (obj->dac == DAC_2) {
128+
__HAL_RCC_DAC2_FORCE_RESET();
129+
__HAL_RCC_DAC2_RELEASE_RESET();
130+
__HAL_RCC_DAC2_CLK_DISABLE();
131+
}
132+
#endif
133+
134+
// Configure GPIO back to reset value
135+
pin_function(obj->pin, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0));
89136
}
90137

91138
const PinMap *analogout_pinmap()

0 commit comments

Comments
 (0)