diff --git a/targets/TARGET_STM/TARGET_STM32F0/analogout_device.c b/targets/TARGET_STM/TARGET_STM32F0/analogout_device.c index db8cb48d18..86257a45aa 100644 --- a/targets/TARGET_STM/TARGET_STM32F0/analogout_device.c +++ b/targets/TARGET_STM/TARGET_STM32F0/analogout_device.c @@ -23,6 +23,11 @@ #include "mbed_error.h" #include "PeripheralPins.h" +static int channel1_used = 0; +#if defined(DAC_CHANNEL_2) +static int channel2_used = 0; +#endif + void analogout_init(dac_t *obj, PinName pin) { DAC_ChannelConfTypeDef sConfig = {0}; @@ -72,6 +77,15 @@ void analogout_init(dac_t *obj, PinName pin) if (HAL_DAC_ConfigChannel(&obj->handle, &sConfig, obj->channel) != HAL_OK) { error("HAL_DAC_ConfigChannel failed"); } + + if (obj->channel == DAC_CHANNEL_1) { + channel1_used = 1; + } +#if defined(DAC_CHANNEL_2) + if (obj->channel == DAC_CHANNEL_2) { + channel2_used = 1; + } +#endif analogout_write_u16(obj, 0); HAL_DAC_Start(&obj->handle, obj->channel); @@ -79,10 +93,24 @@ void analogout_init(dac_t *obj, PinName pin) void analogout_free(dac_t *obj) { - // Reset DAC and disable clock - __HAL_RCC_DAC1_FORCE_RESET(); - __HAL_RCC_DAC1_RELEASE_RESET(); - __HAL_RCC_DAC1_CLK_DISABLE(); + if (obj->channel == DAC_CHANNEL_1) { + channel1_used = 0; + } +#if defined(DAC_CHANNEL_2) + if (obj->channel == DAC_CHANNEL_2) { + channel2_used = 0; + } +#endif + if ((channel1_used == 0) +#if defined(DAC_CHANNEL_2) + && (channel2_used == 0) +#endif + ) { + // Reset DAC and disable clock + __HAL_RCC_DAC1_FORCE_RESET(); + __HAL_RCC_DAC1_RELEASE_RESET(); + __HAL_RCC_DAC1_CLK_DISABLE(); + } // Configure GPIO back to reset value pin_function(obj->pin, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)); diff --git a/targets/TARGET_STM/TARGET_STM32F1/analogout_device.c b/targets/TARGET_STM/TARGET_STM32F1/analogout_device.c index d50e8e464c..23b1d58a94 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/analogout_device.c +++ b/targets/TARGET_STM/TARGET_STM32F1/analogout_device.c @@ -35,6 +35,11 @@ #include "mbed_error.h" #include "PeripheralPins.h" +static int channel1_used = 0; +#if defined(DAC_CHANNEL_2) +static int channel2_used = 0; +#endif + void analogout_init(dac_t *obj, PinName pin) { DAC_ChannelConfTypeDef sConfig = {0}; @@ -85,16 +90,38 @@ void analogout_init(dac_t *obj, PinName pin) error("HAL_DAC_ConfigChannel failed"); } + if (obj->channel == DAC_CHANNEL_1) { + channel1_used = 1; + } +#if defined(DAC_CHANNEL_2) + if (obj->channel == DAC_CHANNEL_2) { + channel2_used = 1; + } +#endif analogout_write_u16(obj, 0); HAL_DAC_Start(&obj->handle, obj->channel); } void analogout_free(dac_t *obj) { - // Reset DAC and disable clock - __HAL_RCC_DAC_FORCE_RESET(); - __HAL_RCC_DAC_RELEASE_RESET(); - __HAL_RCC_DAC_CLK_DISABLE(); + if (obj->channel == DAC_CHANNEL_1) { + channel1_used = 0; + } +#if defined(DAC_CHANNEL_2) + if (obj->channel == DAC_CHANNEL_2) { + channel2_used = 0; + } +#endif + if ((channel1_used == 0) +#if defined(DAC_CHANNEL_2) + && (channel2_used == 0) +#endif + ) { + // Reset DAC and disable clock + __HAL_RCC_DAC_FORCE_RESET(); + __HAL_RCC_DAC_RELEASE_RESET(); + __HAL_RCC_DAC_CLK_DISABLE(); + } // Configure GPIO back to reset value pin_function(obj->pin, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)); diff --git a/targets/TARGET_STM/TARGET_STM32F2/analogout_device.c b/targets/TARGET_STM/TARGET_STM32F2/analogout_device.c index d50e8e464c..71855b45c0 100644 --- a/targets/TARGET_STM/TARGET_STM32F2/analogout_device.c +++ b/targets/TARGET_STM/TARGET_STM32F2/analogout_device.c @@ -35,6 +35,11 @@ #include "mbed_error.h" #include "PeripheralPins.h" +static int channel1_used = 0; +#if defined(DAC_CHANNEL_2) +static int channel2_used = 0; +#endif + void analogout_init(dac_t *obj, PinName pin) { DAC_ChannelConfTypeDef sConfig = {0}; @@ -84,6 +89,15 @@ void analogout_init(dac_t *obj, PinName pin) if (HAL_DAC_ConfigChannel(&obj->handle, &sConfig, obj->channel) != HAL_OK) { error("HAL_DAC_ConfigChannel failed"); } + + if (obj->channel == DAC_CHANNEL_1) { + channel1_used = 1; + } +#if defined(DAC_CHANNEL_2) + if (obj->channel == DAC_CHANNEL_2) { + channel2_used = 1; + } +#endif analogout_write_u16(obj, 0); HAL_DAC_Start(&obj->handle, obj->channel); @@ -91,10 +105,24 @@ void analogout_init(dac_t *obj, PinName pin) void analogout_free(dac_t *obj) { - // Reset DAC and disable clock - __HAL_RCC_DAC_FORCE_RESET(); - __HAL_RCC_DAC_RELEASE_RESET(); - __HAL_RCC_DAC_CLK_DISABLE(); + if (obj->channel == DAC_CHANNEL_1) { + channel1_used = 0; + } +#if defined(DAC_CHANNEL_2) + if (obj->channel == DAC_CHANNEL_2) { + channel2_used = 0; + } +#endif + if ((channel1_used == 0) +#if defined(DAC_CHANNEL_2) + && (channel2_used == 0) +#endif + ) { + // Reset DAC and disable clock + __HAL_RCC_DAC_FORCE_RESET(); + __HAL_RCC_DAC_RELEASE_RESET(); + __HAL_RCC_DAC_CLK_DISABLE(); + } // Configure GPIO back to reset value pin_function(obj->pin, STM_PIN_DATA(STM_MODE_ANALOG, GPIO_NOPULL, 0)); diff --git a/targets/TARGET_STM/TARGET_STM32F3/analogout_device.c b/targets/TARGET_STM/TARGET_STM32F3/analogout_device.c index 2e13095567..3b6bed6133 100644 --- a/targets/TARGET_STM/TARGET_STM32F3/analogout_device.c +++ b/targets/TARGET_STM/TARGET_STM32F3/analogout_device.c @@ -36,8 +36,10 @@ #include "PeripheralPins.h" // These variables are used for the "free" function -static int pa4_used = 0; -static int pa5_used = 0; +static int channel1_used = 0; +#if defined(DAC_CHANNEL_2) +static int channel2_used = 0; +#endif #if STATIC_PINMAP_READY #define ANALOGOUT_INIT_DIRECT analogout_init_direct @@ -108,14 +110,14 @@ static void _analogout_init_direct(dac_t *obj, const PinMap *pinmap) sConfig.DAC_OutputSwitch = DAC_OUTPUTSWITCH_ENABLE; #endif - if (pinmap->pin == PA_4) { - pa4_used = 1; + if (obj->channel == DAC_CHANNEL_1) { + channel1_used = 1; } - - if (pinmap->pin == PA_5) { - pa5_used = 1; +#if defined(DAC_CHANNEL_2) + if (obj->channel == DAC_CHANNEL_2) { + channel2_used = 1; } - +#endif if (HAL_DAC_ConfigChannel(&obj->handle, &sConfig, obj->channel) != HAL_OK) { error("HAL_DAC_ConfigChannel failed"); } @@ -137,21 +139,26 @@ void analogout_init(dac_t *obj, PinName pin) void analogout_free(dac_t *obj) { // Reset DAC and disable clock - if (obj->pin == PA_4) { - pa4_used = 0; + if (obj->channel == DAC_CHANNEL_1) { + channel1_used = 0; } - if (obj->pin == PA_5) { - pa5_used = 0; +#if defined(DAC_CHANNEL_2) + if (obj->channel == DAC_CHANNEL_2) { + channel2_used = 0; } - - if ((pa4_used == 0) && (pa5_used == 0)) { +#endif + if ((channel1_used == 0) +#if defined(DAC_CHANNEL_2) + && (channel2_used == 0) +#endif + ) { __HAL_RCC_DAC1_FORCE_RESET(); __HAL_RCC_DAC1_RELEASE_RESET(); __HAL_RCC_DAC1_CLK_DISABLE(); } #if defined(DAC2) - if (obj->pin == PA_6) { + if (obj->dac == DAC_2) { __HAL_RCC_DAC2_FORCE_RESET(); __HAL_RCC_DAC2_RELEASE_RESET(); __HAL_RCC_DAC2_CLK_DISABLE(); diff --git a/targets/TARGET_STM/TARGET_STM32G4/analogout_device.c b/targets/TARGET_STM/TARGET_STM32G4/analogout_device.c index 6e260940ea..0b608b2abe 100644 --- a/targets/TARGET_STM/TARGET_STM32G4/analogout_device.c +++ b/targets/TARGET_STM/TARGET_STM32G4/analogout_device.c @@ -24,8 +24,10 @@ #include "PeripheralPins.h" // These variables are used for the "free" function -static int pa4_used = 0; -static int pa5_used = 0; +static int channel1_used = 0; +#if defined(DAC_CHANNEL_2) +static int channel2_used = 0; +#endif #if STATIC_PINMAP_READY #define ANALOGOUT_INIT_DIRECT analogout_init_direct @@ -96,13 +98,14 @@ static void _analogout_init_direct(dac_t *obj, const PinMap *pinmap) sConfig.DAC_OutputSwitch = DAC_OUTPUTSWITCH_ENABLE; #endif - if (pinmap->pin == PA_4) { - pa4_used = 1; + if (obj->channel == DAC_CHANNEL_1) { + channel1_used = 1; } - - if (pinmap->pin == PA_5) { - pa5_used = 1; +#if defined(DAC_CHANNEL_2) + if (obj->channel == DAC_CHANNEL_2) { + channel2_used = 1; } +#endif if (HAL_DAC_ConfigChannel(&obj->handle, &sConfig, obj->channel) != HAL_OK) { error("HAL_DAC_ConfigChannel failed"); @@ -125,21 +128,27 @@ void analogout_init(dac_t *obj, PinName pin) void analogout_free(dac_t *obj) { // Reset DAC and disable clock - if (obj->pin == PA_4) { - pa4_used = 0; + if (obj->channel == DAC_CHANNEL_1) { + channel1_used = 0; } - if (obj->pin == PA_5) { - pa5_used = 0; +#if defined(DAC_CHANNEL_2) + if (obj->channel == DAC_CHANNEL_2) { + channel2_used = 0; } +#endif - if ((pa4_used == 0) && (pa5_used == 0)) { + if ((channel1_used == 0) +#if defined(DAC_CHANNEL_2) + && (channel2_used == 0) +#endif + ) { __HAL_RCC_DAC1_FORCE_RESET(); __HAL_RCC_DAC1_RELEASE_RESET(); __HAL_RCC_DAC1_CLK_DISABLE(); } #if defined(DAC2) - if (obj->pin == PA_6) { + if (obj->dac == DAC_2) { __HAL_RCC_DAC2_FORCE_RESET(); __HAL_RCC_DAC2_RELEASE_RESET(); __HAL_RCC_DAC2_CLK_DISABLE(); diff --git a/targets/TARGET_STM/TARGET_STM32H7/analogout_device.c b/targets/TARGET_STM/TARGET_STM32H7/analogout_device.c index f152113022..e375e16a8a 100644 --- a/targets/TARGET_STM/TARGET_STM32H7/analogout_device.c +++ b/targets/TARGET_STM/TARGET_STM32H7/analogout_device.c @@ -57,7 +57,14 @@ void analogout_init(dac_t *obj, PinName pin) __GPIOA_CLK_ENABLE(); - __HAL_RCC_DAC12_CLK_ENABLE(); + if (obj->dac == DAC_1) { + __HAL_RCC_DAC12_CLK_ENABLE(); + } +#if defined(DAC2) + if (obj->dac == DAC_2) { + __HAL_RCC_DAC2_CLK_ENABLE(); + } +#endif obj->handle.Instance = DAC1; obj->handle.State = HAL_DAC_STATE_RESET; diff --git a/targets/TARGET_STM/TARGET_STM32L0/analogout_device.c b/targets/TARGET_STM/TARGET_STM32L0/analogout_device.c index ef63640406..f6caf530cb 100644 --- a/targets/TARGET_STM/TARGET_STM32L0/analogout_device.c +++ b/targets/TARGET_STM/TARGET_STM32L0/analogout_device.c @@ -25,7 +25,9 @@ // These variables are used for the "free" function static int channel1_used = 0; +#if defined(DAC_CHANNEL_2) static int channel2_used = 0; +#endif #if STATIC_PINMAP_READY #define ANALOGOUT_INIT_DIRECT analogout_init_direct @@ -85,9 +87,12 @@ static void _analogout_init_direct(dac_t *obj, const PinMap *pinmap) if (obj->channel == DAC_CHANNEL_1) { channel1_used = 1; - } else { + } +#if defined(DAC_CHANNEL_2) + if (obj->channel == DAC_CHANNEL_2) { channel2_used = 1; } +#endif analogout_write_u16(obj, 0); HAL_DAC_Start(&obj->handle, obj->channel); @@ -114,7 +119,11 @@ void analogout_free(dac_t *obj) channel2_used = 0; } #endif - if ((channel1_used == 0) && (channel2_used == 0)) { + if ((channel1_used == 0) +#if defined(DAC_CHANNEL_2) + && (channel2_used == 0) +#endif + ) { __DAC_FORCE_RESET(); __DAC_RELEASE_RESET(); __DAC_CLK_DISABLE(); diff --git a/targets/TARGET_STM/TARGET_STM32L1/analogout_device.c b/targets/TARGET_STM/TARGET_STM32L1/analogout_device.c index e4bd9b0761..2cee697717 100644 --- a/targets/TARGET_STM/TARGET_STM32L1/analogout_device.c +++ b/targets/TARGET_STM/TARGET_STM32L1/analogout_device.c @@ -24,8 +24,10 @@ #include "PeripheralPins.h" // These variables are used for the "free" function -static int pa4_used = 0; -static int pa5_used = 0; +static int channel1_used = 0; +#if defined(DAC_CHANNEL_2) +static int channel2_used = 0; +#endif void analogout_init(dac_t *obj, PinName pin) { @@ -70,12 +72,14 @@ void analogout_init(dac_t *obj, PinName pin) sConfig.DAC_Trigger = DAC_TRIGGER_NONE; sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; - if (pin == PA_4) { - pa4_used = 1; - } else { // PA_5 - pa5_used = 1; + if (obj->channel == DAC_CHANNEL_1) { + channel1_used = 1; } - +#if defined(DAC_CHANNEL_2) + if (obj->channel == DAC_CHANNEL_2) { + channel2_used = 1; + } +#endif if (HAL_DAC_ConfigChannel(&obj->handle, &sConfig, obj->channel) != HAL_OK) { error("Cannot configure DAC channel\n"); } @@ -87,13 +91,20 @@ void analogout_init(dac_t *obj, PinName pin) void analogout_free(dac_t *obj) { // Reset DAC and disable clock - if (obj->pin == PA_4) { - pa4_used = 0; + if (obj->channel == DAC_CHANNEL_1) { + channel1_used = 0; } - if (obj->pin == PA_5) { - pa5_used = 0; +#if defined(DAC_CHANNEL_2) + if (obj->channel == DAC_CHANNEL_2) { + channel2_used = 0; } - if ((pa4_used == 0) && (pa5_used == 0)) { +#endif + + if ((channel1_used == 0) +#if defined(DAC_CHANNEL_2) + && (channel2_used == 0) +#endif + ) { __DAC_FORCE_RESET(); __DAC_RELEASE_RESET(); __DAC_CLK_DISABLE(); diff --git a/targets/TARGET_STM/TARGET_STM32L4/analogout_device.c b/targets/TARGET_STM/TARGET_STM32L4/analogout_device.c index c1e8be56fd..beeec626e9 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/analogout_device.c +++ b/targets/TARGET_STM/TARGET_STM32L4/analogout_device.c @@ -28,7 +28,9 @@ // These variables are used for the "free" function static int channel1_used = 0; +#if defined(DAC_CHANNEL_2) static int channel2_used = 0; +#endif #if STATIC_PINMAP_READY #define ANALOGOUT_INIT_DIRECT analogout_init_direct @@ -88,9 +90,12 @@ static void _analogout_init_direct(dac_t *obj, const PinMap *pinmap) if (obj->channel == DAC_CHANNEL_1) { channel1_used = 1; - } else { // channel 1 per default + } +#if defined(DAC_CHANNEL_2) + if (obj->channel == DAC_CHANNEL_2) { channel2_used = 1; } +#endif if (HAL_DAC_ConfigChannel(&obj->handle, &sConfig, obj->channel) != HAL_OK) { error("Cannot configure DAC channel\n"); @@ -125,7 +130,11 @@ void analogout_free(dac_t *obj) } #endif - if ((channel1_used == 0) && (channel2_used == 0)) { + if ((channel1_used == 0) +#if defined(DAC_CHANNEL_2) + && (channel2_used == 0) +#endif + ) { __HAL_RCC_DAC1_FORCE_RESET(); __HAL_RCC_DAC1_RELEASE_RESET(); __HAL_RCC_DAC1_CLK_DISABLE(); diff --git a/targets/TARGET_STM/TARGET_STM32L5/analogout_device.c b/targets/TARGET_STM/TARGET_STM32L5/analogout_device.c index fcf8fd7033..4cab2b9bae 100644 --- a/targets/TARGET_STM/TARGET_STM32L5/analogout_device.c +++ b/targets/TARGET_STM/TARGET_STM32L5/analogout_device.c @@ -25,7 +25,9 @@ // These variables are used for the "free" function static int channel1_used = 0; +#if defined(DAC_CHANNEL_2) static int channel2_used = 0; +#endif #if STATIC_PINMAP_READY #define ANALOGOUT_INIT_DIRECT analogout_init_direct @@ -85,9 +87,12 @@ static void _analogout_init_direct(dac_t *obj, const PinMap *pinmap) if (obj->channel == DAC_CHANNEL_1) { channel1_used = 1; - } else { // channel 1 per default + } +#if defined(DAC_CHANNEL_2) + if (obj->channel == DAC_CHANNEL_2) { channel2_used = 1; } +#endif if (HAL_DAC_ConfigChannel(&obj->handle, &sConfig, obj->channel) != HAL_OK) { error("Cannot configure DAC channel\n"); @@ -119,7 +124,11 @@ void analogout_free(dac_t *obj) } #endif - if ((channel1_used == 0) && (channel2_used == 0)) { + if ((channel1_used == 0) +#if defined(DAC_CHANNEL_2) + && (channel2_used == 0) +#endif + ) { __HAL_RCC_DAC1_FORCE_RESET(); __HAL_RCC_DAC1_RELEASE_RESET(); __HAL_RCC_DAC1_CLK_DISABLE();