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)