Skip to content

Commit 678c64c

Browse files
committed
chore(wb0): ADC support
Signed-off-by: Frederic Pillon <frederic.pillon@st.com>
1 parent d3b0ef6 commit 678c64c

File tree

2 files changed

+192
-32
lines changed

2 files changed

+192
-32
lines changed

cores/arduino/wiring_analog.c

Lines changed: 51 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,14 @@ extern "C" {
2929
uint32_t g_anOutputPinConfigured[MAX_NB_PORT] = {0};
3030
#endif
3131

32-
#if defined(ADC_RESOLUTION_16B)
32+
#if defined(ADC_RESOLUTION_16B) || defined(ADC_DS_DATA_WIDTH_16_BIT)
3333
#define MAX_ADC_RESOLUTION 16
34-
#elif defined(ADC_RESOLUTION_14B)
34+
#elif defined(ADC_DS_DATA_WIDTH_15_BIT)
35+
#define MAX_ADC_RESOLUTION 15
36+
#elif defined(ADC_RESOLUTION_14B) || defined(ADC_DS_DATA_WIDTH_14_BIT)
3537
#define MAX_ADC_RESOLUTION 14
38+
#elif defined(ADC_DS_DATA_WIDTH_13_BIT)
39+
#define MAX_ADC_RESOLUTION 13
3640
#else
3741
#define MAX_ADC_RESOLUTION 12
3842
#endif
@@ -43,25 +47,27 @@ static int _internalReadResolution =
4347
#if ADC_RESOLUTION > MAX_ADC_RESOLUTION
4448
MAX_ADC_RESOLUTION
4549
#else
46-
47-
#ifdef ADC_RESOLUTION_12B
48-
50+
#if defined(ADC_RESOLUTION_12B) || defined(ADC_DS_DATA_WIDTH_12_BIT)
4951
#if ADC_RESOLUTION <= 6 && defined(ADC_RESOLUTION_6B)
5052
6
51-
#elif ADC_RESOLUTION <= 8
53+
#elif ADC_RESOLUTION <= 8 && defined(ADC_RESOLUTION_8B)
5254
8
53-
#elif ADC_RESOLUTION <= 10
55+
#elif ADC_RESOLUTION <= 10 && defined(ADC_RESOLUTION_10B)
5456
10
5557
#elif ADC_RESOLUTION <= 12
5658
12
57-
#elif ADC_RESOLUTION <= 14 && defined(ADC_RESOLUTION_14B)
59+
#elif ADC_RESOLUTION <= 13 && defined(ADC_DS_DATA_WIDTH_13_BIT)
60+
13
61+
#elif ADC_RESOLUTION <= 14 && (defined(ADC_RESOLUTION_14B) || defined(ADC_DS_DATA_WIDTH_14_BIT))
5862
14
59-
#elif defined(ADC_RESOLUTION_16B)
63+
#elif ADC_RESOLUTION <= 15 && defined(ADC_DS_DATA_WIDTH_15_BIT)
64+
15
65+
#elif defined(ADC_RESOLUTION_16B) || defined(ADC_DS_DATA_WIDTH_16_BIT)
6066
16
6167
#endif
6268
#else /* ADC_RESOLUTION_12B */
6369
12
64-
#endif /* ADC_RESOLUTION_12B */
70+
#endif /* ADC_RESOLUTION_12B || ADC_DS_DATA_WIDTH_12_BIT */
6571
#endif /* ADC_RESOLUTION > MAX_ADC_RESOLUTION */
6672
;
6773

@@ -84,28 +90,49 @@ void analogReadResolution(int res)
8490
if (_readResolution > MAX_ADC_RESOLUTION) {
8591
_internalReadResolution = MAX_ADC_RESOLUTION;
8692
} else {
87-
#ifdef ADC_RESOLUTION_12B
93+
#if defined(ADC_RESOLUTION_12B) || defined(ADC_DS_DATA_WIDTH_12_BIT)
8894
#ifdef ADC_RESOLUTION_6B
8995
if (_internalReadResolution <= 6) {
9096
_internalReadResolution = 6;
9197
} else
9298
#endif
99+
#if defined(ADC_RESOLUTION_8B)
93100
if (_internalReadResolution <= 8) {
94101
_internalReadResolution = 8;
95-
} else if (_internalReadResolution <= 10) {
96-
_internalReadResolution = 10;
97-
} else if (_internalReadResolution <= 12) {
98-
_internalReadResolution = 12;
99-
}
100-
#ifdef ADC_RESOLUTION_14B
101-
else if (_internalReadResolution <= 14) {
102-
_internalReadResolution = 14;
103-
}
102+
} else
104103
#endif
105-
#ifdef ADC_RESOLUTION_16B
106-
else if (_internalReadResolution <= 16) {
107-
_internalReadResolution = 16;
108-
}
104+
#if defined(ADC_RESOLUTION_10B)
105+
if (_internalReadResolution <= 10) {
106+
_internalReadResolution = 10;
107+
} else
108+
#endif
109+
#if defined(ADC_DS_DATA_WIDTH_11_BIT)
110+
else if (_internalReadResolution <= 11) {
111+
_internalReadResolution = 11;
112+
}
113+
#endif
114+
if (_internalReadResolution <= 12) {
115+
_internalReadResolution = 12;
116+
}
117+
#if defined(ADC_DS_DATA_WIDTH_13_BIT)
118+
else if (_internalReadResolution <= 13) {
119+
_internalReadResolution = 13;
120+
}
121+
#endif
122+
#if defined(ADC_RESOLUTION_14B) || defined(ADC_DS_DATA_WIDTH_14_BIT)
123+
else if (_internalReadResolution <= 14) {
124+
_internalReadResolution = 14;
125+
}
126+
#endif
127+
#if defined(ADC_DS_DATA_WIDTH_15_BIT)
128+
else if (_internalReadResolution <= 15) {
129+
_internalReadResolution = 15;
130+
}
131+
#endif
132+
#if defined( ADC_RESOLUTION_16B) || defined(ADC_DS_DATA_WIDTH_16_BIT)
133+
else if (_internalReadResolution <= 16) {
134+
_internalReadResolution = 16;
135+
}
109136
#endif
110137
#else
111138
/* STM32F1xx have no ADC_RESOLUTION_xB */

libraries/SrcWrapper/src/stm32/analog.cpp

Lines changed: 141 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,17 @@ static PinName g_current_pin = NC;
3030
/* Private_Defines */
3131
#if defined(HAL_ADC_MODULE_ENABLED) && !defined(HAL_ADC_MODULE_ONLY)
3232

33+
#if defined(STM32WB0x)
34+
#ifndef ADC_SAMPLING_RATE
35+
#define ADC_SAMPLING_RATE ADC_SAMPLE_RATE_16
36+
#endif /* !ADC_SAMPLING_RATE */
37+
#ifndef ADC_SAMPLING_RATE_INTERNAL
38+
#define ADC_SAMPLING_RATE_INTERNAL ADC_SAMPLE_RATE_16
39+
#endif /* !ADC_SAMPLING_RATE_INTERNAL */
40+
#ifndef ADC_VOLT_RANGE
41+
#define ADC_VOLT_RANGE ADC_VIN_RANGE_3V6
42+
#endif /* !ADC_VOLT_RANGE */
43+
#else
3344
#ifndef ADC_SAMPLINGTIME
3445
#if defined(ADC_SAMPLETIME_8CYCLES_5)
3546
#define ADC_SAMPLINGTIME ADC_SAMPLETIME_8CYCLES_5
@@ -106,6 +117,7 @@ static PinName g_current_pin = NC;
106117
#ifndef ADC_REGULAR_RANK_1
107118
#define ADC_REGULAR_RANK_1 1
108119
#endif
120+
#endif /* STM32WB0x */
109121

110122
/* Exported Functions */
111123
/**
@@ -119,6 +131,20 @@ uint32_t get_adc_channel(PinName pin, uint32_t *bank)
119131
uint32_t function = pinmap_function(pin, PinMap_ADC);
120132
uint32_t channel = 0;
121133
switch (STM_PIN_CHANNEL(function)) {
134+
#ifdef ADC_CHANNEL_VINP0
135+
case 0:
136+
channel = ADC_CHANNEL_VINP0;
137+
break;
138+
case 1:
139+
channel = ADC_CHANNEL_VINP1;
140+
break;
141+
case 2:
142+
channel = ADC_CHANNEL_VINP2;
143+
break;
144+
case 3:
145+
channel = ADC_CHANNEL_VINP3;
146+
break;
147+
#else
122148
#ifdef ADC_CHANNEL_0
123149
case 0:
124150
channel = ADC_CHANNEL_0;
@@ -228,11 +254,12 @@ uint32_t get_adc_channel(PinName pin, uint32_t *bank)
228254
case 31:
229255
channel = ADC_CHANNEL_31;
230256
break;
231-
#endif
232-
#endif
233-
#endif
234-
#endif
235-
#endif
257+
#endif /* ADC_CHANNEL_27 */
258+
#endif /* ADC_CHANNEL_24 */
259+
#endif /* ADC_CHANNEL_23 */
260+
#endif /* ADC_CHANNEL_20 */
261+
#endif /* ADC_CHANNEL_14 */
262+
#endif /* ADC_CHANNEL_VINP0 */
236263
default:
237264
_Error_Handler("ADC: Unknown adc channel", (int)(STM_PIN_CHANNEL(function)));
238265
break;
@@ -595,6 +622,12 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
595622
/* ADC Periph clock enable */
596623
#ifdef ADC1
597624
if (hadc->Instance == ADC1) {
625+
#ifdef __HAL_RCC_ADCDIG_CLK_ENABLE
626+
__HAL_RCC_ADCDIG_CLK_ENABLE();
627+
#endif
628+
#ifdef __HAL_RCC_ADCANA_CLK_ENABLE
629+
__HAL_RCC_ADCANA_CLK_ENABLE();
630+
#endif
598631
#ifdef __HAL_RCC_ADC1_CLK_ENABLE
599632
__HAL_RCC_ADC1_CLK_ENABLE();
600633
#endif
@@ -698,6 +731,12 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef *hadc)
698731
#endif
699732
#ifdef __HAL_RCC_ADC12_CLK_DISABLE
700733
__HAL_RCC_ADC12_CLK_DISABLE();
734+
#endif
735+
#ifdef __HAL_RCC_ADCANA_CLK_DISABLE
736+
__HAL_RCC_ADCANA_CLK_DISABLE();
737+
#endif
738+
#ifdef __HAL_RCC_ADCDIG_CLK_DISABLE
739+
__HAL_RCC_ADCDIG_CLK_DISABLE();
701740
#endif
702741
}
703742
#endif
@@ -804,7 +843,12 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution)
804843
ADC_HandleTypeDef AdcHandle = {};
805844
ADC_ChannelConfTypeDef AdcChannelConf = {};
806845
__IO uint16_t uhADCxConvertedValue = 0;
846+
#if defined(STM32WB0x)
847+
uint32_t samplingRate = ADC_SAMPLING_RATE;
848+
uint32_t voltageRange = ADC_VOLT_RANGE;
849+
#else
807850
uint32_t samplingTime = ADC_SAMPLINGTIME;
851+
#endif /* STM32WB0x */
808852
uint32_t channel = 0;
809853
uint32_t bank = 0;
810854

@@ -826,10 +870,22 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution)
826870
#endif
827871
#endif
828872
channel = get_adc_internal_channel(pin);
873+
#if defined(STM32WB0x)
874+
samplingRate = ADC_SAMPLING_RATE_INTERNAL;
875+
if (channel == ADC_CHANNEL_TEMPSENSOR) {
876+
voltageRange = ADC_VIN_RANGE_1V2;
877+
} else if (channel == ADC_CHANNEL_VBAT) {
878+
voltageRange = ADC_VIN_RANGE_3V6;
879+
}
880+
#else
829881
samplingTime = ADC_SAMPLINGTIME_INTERNAL;
882+
#endif /* STM32WB0x */
830883
} else {
831884
AdcHandle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC);
832885
channel = get_adc_channel(pin, &bank);
886+
#if defined(STM32WB0x)
887+
888+
#else
833889
#if defined(ADC_VER_V5_V90)
834890
if (AdcHandle.Instance == ADC3) {
835891
samplingTime = ADC3_SAMPLINGTIME;
@@ -840,12 +896,40 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution)
840896
samplingTime = ADC4_SAMPLINGTIME;
841897
}
842898
#endif
899+
#endif /* STM32WB0x */
843900
}
844901

845902
if (AdcHandle.Instance == NP) {
846903
return 0;
847904
}
848-
905+
#if defined(STM32WB0x)
906+
AdcHandle.Init.ConversionType = ADC_CONVERSION_WITH_DS;
907+
AdcHandle.Init.ContinuousConvMode = DISABLE;
908+
AdcHandle.Init.SequenceLength = 1;
909+
AdcHandle.Init.SamplingMode = ADC_SAMPLING_AT_START;
910+
AdcHandle.Init.SampleRate = samplingRate;
911+
switch (resolution) {
912+
case 12:
913+
default:
914+
AdcHandle.Init.DownSamplerConfig.DataWidth = ADC_DS_DATA_WIDTH_12_BIT;
915+
break;
916+
case 13:
917+
AdcHandle.Init.DownSamplerConfig.DataWidth = ADC_DS_DATA_WIDTH_13_BIT;
918+
break;
919+
case 14:
920+
AdcHandle.Init.DownSamplerConfig.DataWidth = ADC_DS_DATA_WIDTH_14_BIT;
921+
break;
922+
case 15:
923+
AdcHandle.Init.DownSamplerConfig.DataWidth = ADC_DS_DATA_WIDTH_15_BIT;
924+
break;
925+
case 16:
926+
AdcHandle.Init.DownSamplerConfig.DataWidth = ADC_DS_DATA_WIDTH_16_BIT;
927+
break;
928+
}
929+
AdcHandle.Init.DownSamplerConfig.DataRatio = ADC_DS_RATIO_8;
930+
AdcHandle.Init.InvertOutputMode = ADC_DATA_INVERT_NONE;
931+
AdcHandle.Init.Overrun = ADC_NEW_DATA_IS_LOST;
932+
#else
849933
#ifdef ADC_CLOCK_DIV
850934
AdcHandle.Init.ClockPrescaler = ADC_CLOCK_DIV; /* (A)synchronous clock mode, input ADC clock divided */
851935
#endif
@@ -963,7 +1047,7 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution)
9631047
#ifdef ADC_VREF_PPROT_NONE
9641048
AdcHandle.Init.VrefProtection = ADC_VREF_PPROT_NONE;
9651049
#endif
966-
1050+
#endif /* STM32WB0x*/
9671051
AdcHandle.State = HAL_ADC_STATE_RESET;
9681052
AdcHandle.DMA_Handle = NULL;
9691053
AdcHandle.Lock = HAL_UNLOCKED;
@@ -985,6 +1069,49 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution)
9851069
#endif
9861070
return 0;
9871071
}
1072+
1073+
#if defined(STM32WB0x)
1074+
AdcChannelConf.Rank = ADC_RANK_1;
1075+
AdcChannelConf.VoltRange = voltageRange;
1076+
AdcChannelConf.CalibrationPoint.Number = ADC_CALIB_POINT_1;
1077+
1078+
uint32_t uADCxCalibrationPoint_Gain = 0;
1079+
uint32_t uADCxCalibrationPoint_Offset = 0;
1080+
if (channel != ADC_CHANNEL_VBAT && channel != ADC_CHANNEL_TEMPSENSOR) {
1081+
/* Calibration point gain and offset */
1082+
switch (voltageRange) {
1083+
case ADC_VIN_RANGE_3V6:
1084+
uADCxCalibrationPoint_Gain = LL_ADC_GET_CALIB_GAIN_FOR_VINPX_3V6();
1085+
uADCxCalibrationPoint_Offset = LL_ADC_GET_CALIB_OFFSET_FOR_VINPX_3V6();
1086+
if (uADCxCalibrationPoint_Gain == 0xFFF) {
1087+
uADCxCalibrationPoint_Gain = LL_ADC_DEFAULT_RANGE_VALUE_3V6;
1088+
uADCxCalibrationPoint_Offset = 0UL;
1089+
}
1090+
break;
1091+
case ADC_VIN_RANGE_2V4:
1092+
uADCxCalibrationPoint_Gain = LL_ADC_GET_CALIB_GAIN_FOR_VINPX_2V4();
1093+
uADCxCalibrationPoint_Offset = LL_ADC_GET_CALIB_OFFSET_FOR_VINPX_2V4();
1094+
if (uADCxCalibrationPoint_Gain == 0xFFF) {
1095+
uADCxCalibrationPoint_Gain = LL_ADC_DEFAULT_RANGE_VALUE_2V4;
1096+
uADCxCalibrationPoint_Offset = 0UL;
1097+
}
1098+
break;
1099+
case ADC_VIN_RANGE_1V2:
1100+
uADCxCalibrationPoint_Gain = LL_ADC_GET_CALIB_GAIN_FOR_VINPX_1V2();
1101+
uADCxCalibrationPoint_Offset = LL_ADC_GET_CALIB_OFFSET_FOR_VINPX_1V2();
1102+
if (uADCxCalibrationPoint_Gain == 0xFFF) {
1103+
uADCxCalibrationPoint_Gain = LL_ADC_DEFAULT_RANGE_VALUE_1V2;
1104+
uADCxCalibrationPoint_Offset = 0UL;
1105+
}
1106+
break;
1107+
default:
1108+
_Error_Handler("ADC: Unknown ADC_VOLT_RANGE", (int)(ADC_VOLT_RANGE));
1109+
break;
1110+
}
1111+
}
1112+
AdcChannelConf.CalibrationPoint.Gain = uADCxCalibrationPoint_Gain;
1113+
AdcChannelConf.CalibrationPoint.Offset = uADCxCalibrationPoint_Offset;
1114+
#else
9881115
#if defined(ADC_SCAN_SEQ_FIXED) && defined(ADC_RANK_CHANNEL_NUMBER)
9891116
AdcChannelConf.Rank = ADC_RANK_CHANNEL_NUMBER; /* Enable the rank of the selected channels when not fully configurable */
9901117
#else
@@ -1011,7 +1138,7 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution)
10111138
AdcChannelConf.OffsetRightShift = DISABLE; /* No Right Offset Shift */
10121139
AdcChannelConf.OffsetSignedSaturation = DISABLE; /* Signed saturation feature is not used */
10131140
#endif
1014-
1141+
#endif /* STM32WB0x */
10151142
/*##-2- Configure ADC regular channel ######################################*/
10161143
if (HAL_ADC_ConfigChannel(&AdcHandle, &AdcChannelConf) != HAL_OK) {
10171144
/* Channel Configuration Error */
@@ -1049,7 +1176,11 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution)
10491176
}
10501177

10511178
/* Check if the continuous conversion of regular channel is finished */
1179+
#if defined(HAL_ADC_STATE_DS_EOC)
1180+
if ((HAL_ADC_GetState(&AdcHandle) & HAL_ADC_STATE_DS_EOC) == HAL_ADC_STATE_DS_EOC) {
1181+
#else
10521182
if ((HAL_ADC_GetState(&AdcHandle) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC) {
1183+
#endif
10531184
/*##-5- Get the converted value of regular channel ########################*/
10541185
uhADCxConvertedValue = HAL_ADC_GetValue(&AdcHandle);
10551186
}
@@ -1063,9 +1194,11 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution)
10631194
return 0;
10641195
}
10651196

1197+
#if defined(LL_ADC_PATH_INTERNAL_NONE)
10661198
if (__LL_ADC_COMMON_INSTANCE(AdcHandle.Instance) != 0U) {
10671199
LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(AdcHandle.Instance), LL_ADC_PATH_INTERNAL_NONE);
10681200
}
1201+
#endif
10691202
return uhADCxConvertedValue;
10701203
}
10711204
#endif /* HAL_ADC_MODULE_ENABLED && !HAL_ADC_MODULE_ONLY*/

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy