Skip to content

Commit 1e3f7cd

Browse files
committed
Fix analogout issue on 12 to 16 bits conversion
1 parent 0e3e29d commit 1e3f7cd

File tree

7 files changed

+108
-168
lines changed

7 files changed

+108
-168
lines changed

libraries/mbed/targets/hal/TARGET_STM/TARGET_STM32F0/analogout_api.c

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include "PeripheralPins.h"
3737

3838
#define DAC_RANGE (0xFFF) // 12 bits
39+
#define DAC_NB_BITS (12)
3940

4041
static DAC_HandleTypeDef DacHandle;
4142

@@ -80,49 +81,47 @@ void analogout_free(dac_t *obj) {
8081
pin_function(obj->pin, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
8182
}
8283

83-
static inline void dac_write(dac_t *obj, uint16_t value) {
84+
static inline void dac_write(dac_t *obj, int value) {
8485
if (obj->pin == PA_4) {
85-
HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, value);
86+
HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, (value & DAC_RANGE));
8687
HAL_DAC_Start(&DacHandle, DAC_CHANNEL_1);
87-
} else { // PA_5
88-
HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_2, DAC_ALIGN_12B_R, value);
88+
} else if (obj->pin == PA_5) {
89+
HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_2, DAC_ALIGN_12B_R, (value & DAC_RANGE));
8990
HAL_DAC_Start(&DacHandle, DAC_CHANNEL_2);
9091
}
9192
}
9293

9394
static inline int dac_read(dac_t *obj) {
9495
if (obj->pin == PA_4) {
9596
return (int)HAL_DAC_GetValue(&DacHandle, DAC_CHANNEL_1);
96-
} else { // PA_5
97+
} else if (obj->pin == PA_5) {
9798
return (int)HAL_DAC_GetValue(&DacHandle, DAC_CHANNEL_2);
9899
}
100+
return 0; /* Just silented warning */
99101
}
100102

101103
void analogout_write(dac_t *obj, float value) {
102104
if (value < 0.0f) {
103105
dac_write(obj, 0); // Min value
104106
} else if (value > 1.0f) {
105-
dac_write(obj, (uint16_t)DAC_RANGE); // Max value
107+
dac_write(obj, (int)DAC_RANGE); // Max value
106108
} else {
107-
dac_write(obj, (uint16_t)(value * (float)DAC_RANGE));
109+
dac_write(obj, (int)(value * (float)DAC_RANGE));
108110
}
109111
}
110112

111113
void analogout_write_u16(dac_t *obj, uint16_t value) {
112-
if (value > (uint16_t)DAC_RANGE) {
113-
dac_write(obj, (uint16_t)DAC_RANGE); // Max value
114-
} else {
115-
dac_write(obj, value);
116-
}
114+
dac_write(obj, value >> (16 - DAC_NB_BITS));
117115
}
118116

119117
float analogout_read(dac_t *obj) {
120118
uint32_t value = dac_read(obj);
121-
return (float)((float)value * (1.0f / (float)DAC_RANGE));
119+
return (float)value * (1.0f / (float)DAC_RANGE);
122120
}
123121

124122
uint16_t analogout_read_u16(dac_t *obj) {
125-
return (uint16_t)dac_read(obj);
123+
uint32_t value = dac_read(obj);
124+
return (value << 4) | ((value >> 8) & 0x000F); // Conversion from 12 to 16 bits
126125
}
127126

128127
#endif // DEVICE_ANALOGOUT

libraries/mbed/targets/hal/TARGET_STM/TARGET_STM32F3/analogout_api.c

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,15 @@
3636
#include "PeripheralPins.h"
3737

3838
#define DAC_RANGE (0xFFF) // 12 bits
39+
#define DAC_NB_BITS (12)
3940

4041
static DAC_HandleTypeDef DacHandle;
4142

4243
// These variables are used for the "free" function
4344
static int pa4_used = 0;
4445
static int pa5_used = 0;
4546

46-
void analogout_init(dac_t *obj, PinName pin)
47-
{
47+
void analogout_init(dac_t *obj, PinName pin) {
4848
DAC_ChannelConfTypeDef sConfig;
4949

5050
// Get the peripheral name from the pin and assign it to the object
@@ -97,8 +97,7 @@ void analogout_init(dac_t *obj, PinName pin)
9797
analogout_write_u16(obj, 0);
9898
}
9999

100-
void analogout_free(dac_t *obj)
101-
{
100+
void analogout_free(dac_t *obj) {
102101
// Reset DAC and disable clock
103102
if (obj->pin == PA_4) pa4_used = 0;
104103
if (obj->pin == PA_5) pa5_used = 0;
@@ -121,22 +120,20 @@ void analogout_free(dac_t *obj)
121120
pin_function(obj->pin, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
122121
}
123122

124-
static inline void dac_write(dac_t *obj, uint16_t value)
125-
{
123+
static inline void dac_write(dac_t *obj, int value) {
126124
if (obj->channel == 1) {
127-
HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, value);
125+
HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, (value & DAC_RANGE));
128126
HAL_DAC_Start(&DacHandle, DAC_CHANNEL_1);
129127
}
130128
#if defined(DAC_CHANNEL_2)
131129
if (obj->channel == 2) {
132-
HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_2, DAC_ALIGN_12B_R, value);
130+
HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_2, DAC_ALIGN_12B_R, (value & DAC_RANGE));
133131
HAL_DAC_Start(&DacHandle, DAC_CHANNEL_2);
134132
}
135133
#endif
136134
}
137135

138-
static inline int dac_read(dac_t *obj)
139-
{
136+
static inline int dac_read(dac_t *obj) {
140137
if (obj->channel == 1) {
141138
return (int)HAL_DAC_GetValue(&DacHandle, DAC_CHANNEL_1);
142139
}
@@ -148,35 +145,28 @@ static inline int dac_read(dac_t *obj)
148145
return 0;
149146
}
150147

151-
void analogout_write(dac_t *obj, float value)
152-
{
148+
void analogout_write(dac_t *obj, float value) {
153149
if (value < 0.0f) {
154150
dac_write(obj, 0); // Min value
155151
} else if (value > 1.0f) {
156-
dac_write(obj, (uint16_t)DAC_RANGE); // Max value
152+
dac_write(obj, (int)DAC_RANGE); // Max value
157153
} else {
158-
dac_write(obj, (uint16_t)(value * (float)DAC_RANGE));
154+
dac_write(obj, (int)(value * (float)DAC_RANGE));
159155
}
160156
}
161157

162-
void analogout_write_u16(dac_t *obj, uint16_t value)
163-
{
164-
if (value > (uint16_t)DAC_RANGE) {
165-
dac_write(obj, (uint16_t)DAC_RANGE); // Max value
166-
} else {
167-
dac_write(obj, value);
168-
}
158+
void analogout_write_u16(dac_t *obj, uint16_t value) {
159+
dac_write(obj, value >> (16 - DAC_NB_BITS));
169160
}
170161

171-
float analogout_read(dac_t *obj)
172-
{
162+
float analogout_read(dac_t *obj) {
173163
uint32_t value = dac_read(obj);
174-
return (float)((float)value * (1.0f / (float)DAC_RANGE));
164+
return (float)value * (1.0f / (float)DAC_RANGE);
175165
}
176166

177-
uint16_t analogout_read_u16(dac_t *obj)
178-
{
179-
return (uint16_t)dac_read(obj);
167+
uint16_t analogout_read_u16(dac_t *obj) {
168+
uint32_t value = dac_read(obj);
169+
return (value << 4) | ((value >> 8) & 0x000F); // Conversion from 12 to 16 bits
180170
}
181171

182172
#endif // DEVICE_ANALOGOUT

libraries/mbed/targets/hal/TARGET_STM/TARGET_STM32F4/analogout_api.c

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@
4141
DAC_HandleTypeDef DacHandle;
4242
static DAC_ChannelConfTypeDef sConfig;
4343

44-
void analogout_init(dac_t *obj, PinName pin)
45-
{
44+
void analogout_init(dac_t *obj, PinName pin) {
4645
uint32_t channel ;
4746
HAL_StatusTypeDef status;
4847

@@ -95,12 +94,10 @@ void analogout_init(dac_t *obj, PinName pin)
9594

9695
}
9796

98-
void analogout_free(dac_t *obj)
99-
{
97+
void analogout_free(dac_t *obj) {
10098
}
10199

102-
static inline void dac_write(dac_t *obj, int value)
103-
{
100+
static inline void dac_write(dac_t *obj, int value) {
104101
HAL_StatusTypeDef status = HAL_ERROR;
105102

106103
if (obj->channel == 1) {
@@ -114,18 +111,16 @@ static inline void dac_write(dac_t *obj, int value)
114111
}
115112
}
116113

117-
static inline int dac_read(dac_t *obj)
118-
{
114+
static inline int dac_read(dac_t *obj) {
119115
if (obj->channel == 1) {
120116
return (int)HAL_DAC_GetValue(&DacHandle, DAC_CHANNEL_1);
121117
} else if (obj->channel == 2) {
122118
return (int)HAL_DAC_GetValue(&DacHandle, DAC_CHANNEL_2);
123119
}
124-
return 0; /* Just silented warning */
120+
return 0; /* Just silented warning */
125121
}
126122

127-
void analogout_write(dac_t *obj, float value)
128-
{
123+
void analogout_write(dac_t *obj, float value) {
129124
if (value < 0.0f) {
130125
dac_write(obj, 0); // Min value
131126
} else if (value > 1.0f) {
@@ -135,19 +130,16 @@ void analogout_write(dac_t *obj, float value)
135130
}
136131
}
137132

138-
void analogout_write_u16(dac_t *obj, uint16_t value)
139-
{
133+
void analogout_write_u16(dac_t *obj, uint16_t value) {
140134
dac_write(obj, value >> (16 - DAC_NB_BITS));
141135
}
142136

143-
float analogout_read(dac_t *obj)
144-
{
137+
float analogout_read(dac_t *obj) {
145138
uint32_t value = dac_read(obj);
146139
return (float)value * (1.0f / (float)DAC_RANGE);
147140
}
148141

149-
uint16_t analogout_read_u16(dac_t *obj)
150-
{
142+
uint16_t analogout_read_u16(dac_t *obj) {
151143
uint32_t value = dac_read(obj);
152144
return (value << 4) | ((value >> 8) & 0x000F); // Conversion from 12 to 16 bits
153145
}

libraries/mbed/targets/hal/TARGET_STM/TARGET_STM32F7/analogout_api.c

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,13 @@
3535
#include "stm32f7xx_hal.h"
3636
#include "PeripheralPins.h"
3737

38-
#define RANGE_12BIT (0xFFF)
38+
#define DAC_RANGE (0xFFF) // 12 bits
39+
#define DAC_NB_BITS (12)
3940

4041
DAC_HandleTypeDef DacHandle;
4142
static DAC_ChannelConfTypeDef sConfig;
4243

43-
void analogout_init(dac_t *obj, PinName pin)
44-
{
44+
void analogout_init(dac_t *obj, PinName pin) {
4545
uint32_t channel ;
4646
HAL_StatusTypeDef status;
4747

@@ -94,27 +94,24 @@ void analogout_init(dac_t *obj, PinName pin)
9494

9595
}
9696

97-
void analogout_free(dac_t *obj)
98-
{
97+
void analogout_free(dac_t *obj) {
9998
}
10099

101-
static inline void dac_write(dac_t *obj, uint16_t value)
102-
{
100+
static inline void dac_write(dac_t *obj, int value) {
103101
HAL_StatusTypeDef status = HAL_ERROR;
104102

105103
if (obj->channel == 1) {
106-
status = HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, value);
104+
status = HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, (value & DAC_RANGE));
107105
} else if (obj->channel == 2) {
108-
status = HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_2, DAC_ALIGN_12B_R, value);
106+
status = HAL_DAC_SetValue(&DacHandle, DAC_CHANNEL_2, DAC_ALIGN_12B_R, (value & DAC_RANGE));
109107
}
110108

111109
if (status != HAL_OK) {
112110
error("DAC pin mapping failed");
113111
}
114112
}
115113

116-
static inline int dac_read(dac_t *obj)
117-
{
114+
static inline int dac_read(dac_t *obj) {
118115
if (obj->channel == 1) {
119116
return (int)HAL_DAC_GetValue(&DacHandle, DAC_CHANNEL_1);
120117
} else if (obj->channel == 2) {
@@ -123,36 +120,28 @@ static inline int dac_read(dac_t *obj)
123120
return 0; /* Just silented warning */
124121
}
125122

126-
void analogout_write(dac_t *obj, float value)
127-
{
123+
void analogout_write(dac_t *obj, float value) {
128124
if (value < 0.0f) {
129125
dac_write(obj, 0); // Min value
130126
} else if (value > 1.0f) {
131-
dac_write(obj, (uint16_t)RANGE_12BIT); // Max value
127+
dac_write(obj, (int)DAC_RANGE); // Max value
132128
} else {
133-
dac_write(obj, (uint16_t)(value * (float)RANGE_12BIT));
129+
dac_write(obj, (int)(value * (float)DAC_RANGE));
134130
}
135131
}
136132

137-
void analogout_write_u16(dac_t *obj, uint16_t value)
138-
{
139-
if (value > (uint16_t)RANGE_12BIT) {
140-
value = (uint16_t)RANGE_12BIT; // Max value
141-
}
142-
143-
dac_write(obj, value);
133+
void analogout_write_u16(dac_t *obj, uint16_t value) {
134+
dac_write(obj, value >> (16 - DAC_NB_BITS));
144135
}
145136

146-
float analogout_read(dac_t *obj)
147-
{
148-
137+
float analogout_read(dac_t *obj) {
149138
uint32_t value = dac_read(obj);
150-
return (float)value * (1.0f / (float)RANGE_12BIT);
139+
return (float)value * (1.0f / (float)DAC_RANGE);
151140
}
152141

153-
uint16_t analogout_read_u16(dac_t *obj)
154-
{
155-
return (uint16_t)dac_read(obj);
142+
uint16_t analogout_read_u16(dac_t *obj) {
143+
uint32_t value = dac_read(obj);
144+
return (value << 4) | ((value >> 8) & 0x000F); // Conversion from 12 to 16 bits
156145
}
157146

158147
#endif // DEVICE_ANALOGOUT

0 commit comments

Comments
 (0)