analogout: STM32: modified analogout_free api

removed hardcoded pins, implemented multi channel check
implemented DAC_2 initialization for H7 board
Added  #if defined DAC_CHANNEL_2
pull/14864/head
anish-k 2021-07-01 21:12:08 +05:30
parent d83494f54b
commit eb06d5eb59
10 changed files with 203 additions and 59 deletions

View File

@ -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));

View File

@ -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));

View File

@ -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));

View File

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

View File

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

View File

@ -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;

View File

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

View File

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

View File

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

View File

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