@@ -30,6 +30,17 @@ static PinName g_current_pin = NC;
30
30
/* Private_Defines */
31
31
#if defined(HAL_ADC_MODULE_ENABLED) && !defined(HAL_ADC_MODULE_ONLY)
32
32
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
33
44
#ifndef ADC_SAMPLINGTIME
34
45
#if defined(ADC_SAMPLETIME_8CYCLES_5)
35
46
#define ADC_SAMPLINGTIME ADC_SAMPLETIME_8CYCLES_5
@@ -106,6 +117,7 @@ static PinName g_current_pin = NC;
106
117
#ifndef ADC_REGULAR_RANK_1
107
118
#define ADC_REGULAR_RANK_1 1
108
119
#endif
120
+ #endif /* STM32WB0x */
109
121
110
122
/* Exported Functions */
111
123
/* *
@@ -119,6 +131,20 @@ uint32_t get_adc_channel(PinName pin, uint32_t *bank)
119
131
uint32_t function = pinmap_function (pin, PinMap_ADC);
120
132
uint32_t channel = 0 ;
121
133
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
122
148
#ifdef ADC_CHANNEL_0
123
149
case 0 :
124
150
channel = ADC_CHANNEL_0;
@@ -228,11 +254,12 @@ uint32_t get_adc_channel(PinName pin, uint32_t *bank)
228
254
case 31 :
229
255
channel = ADC_CHANNEL_31;
230
256
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 */
236
263
default :
237
264
_Error_Handler (" ADC: Unknown adc channel" , (int )(STM_PIN_CHANNEL (function)));
238
265
break ;
@@ -595,6 +622,12 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
595
622
/* ADC Periph clock enable */
596
623
#ifdef ADC1
597
624
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
598
631
#ifdef __HAL_RCC_ADC1_CLK_ENABLE
599
632
__HAL_RCC_ADC1_CLK_ENABLE ();
600
633
#endif
@@ -698,6 +731,12 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef *hadc)
698
731
#endif
699
732
#ifdef __HAL_RCC_ADC12_CLK_DISABLE
700
733
__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 ();
701
740
#endif
702
741
}
703
742
#endif
@@ -804,7 +843,12 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution)
804
843
ADC_HandleTypeDef AdcHandle = {};
805
844
ADC_ChannelConfTypeDef AdcChannelConf = {};
806
845
__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
807
850
uint32_t samplingTime = ADC_SAMPLINGTIME;
851
+ #endif /* STM32WB0x */
808
852
uint32_t channel = 0 ;
809
853
uint32_t bank = 0 ;
810
854
@@ -826,10 +870,22 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution)
826
870
#endif
827
871
#endif
828
872
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
829
881
samplingTime = ADC_SAMPLINGTIME_INTERNAL;
882
+ #endif /* STM32WB0x */
830
883
} else {
831
884
AdcHandle.Instance = (ADC_TypeDef *)pinmap_peripheral (pin, PinMap_ADC);
832
885
channel = get_adc_channel (pin, &bank);
886
+ #if defined(STM32WB0x)
887
+
888
+ #else
833
889
#if defined(ADC_VER_V5_V90)
834
890
if (AdcHandle.Instance == ADC3) {
835
891
samplingTime = ADC3_SAMPLINGTIME;
@@ -840,12 +896,40 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution)
840
896
samplingTime = ADC4_SAMPLINGTIME;
841
897
}
842
898
#endif
899
+ #endif /* STM32WB0x */
843
900
}
844
901
845
902
if (AdcHandle.Instance == NP) {
846
903
return 0 ;
847
904
}
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
849
933
#ifdef ADC_CLOCK_DIV
850
934
AdcHandle.Init .ClockPrescaler = ADC_CLOCK_DIV; /* (A)synchronous clock mode, input ADC clock divided */
851
935
#endif
@@ -963,7 +1047,7 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution)
963
1047
#ifdef ADC_VREF_PPROT_NONE
964
1048
AdcHandle.Init .VrefProtection = ADC_VREF_PPROT_NONE;
965
1049
#endif
966
-
1050
+ # endif /* STM32WB0x */
967
1051
AdcHandle.State = HAL_ADC_STATE_RESET;
968
1052
AdcHandle.DMA_Handle = NULL ;
969
1053
AdcHandle.Lock = HAL_UNLOCKED;
@@ -985,6 +1069,49 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution)
985
1069
#endif
986
1070
return 0 ;
987
1071
}
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
988
1115
#if defined(ADC_SCAN_SEQ_FIXED) && defined(ADC_RANK_CHANNEL_NUMBER)
989
1116
AdcChannelConf.Rank = ADC_RANK_CHANNEL_NUMBER; /* Enable the rank of the selected channels when not fully configurable */
990
1117
#else
@@ -1011,7 +1138,7 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution)
1011
1138
AdcChannelConf.OffsetRightShift = DISABLE; /* No Right Offset Shift */
1012
1139
AdcChannelConf.OffsetSignedSaturation = DISABLE; /* Signed saturation feature is not used */
1013
1140
#endif
1014
-
1141
+ # endif /* STM32WB0x */
1015
1142
/* ##-2- Configure ADC regular channel ######################################*/
1016
1143
if (HAL_ADC_ConfigChannel (&AdcHandle, &AdcChannelConf) != HAL_OK) {
1017
1144
/* Channel Configuration Error */
@@ -1049,7 +1176,11 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution)
1049
1176
}
1050
1177
1051
1178
/* 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
1052
1182
if ((HAL_ADC_GetState (&AdcHandle) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC) {
1183
+ #endif
1053
1184
/* ##-5- Get the converted value of regular channel ########################*/
1054
1185
uhADCxConvertedValue = HAL_ADC_GetValue (&AdcHandle);
1055
1186
}
@@ -1063,9 +1194,11 @@ uint16_t adc_read_value(PinName pin, uint32_t resolution)
1063
1194
return 0 ;
1064
1195
}
1065
1196
1197
+ #if defined(LL_ADC_PATH_INTERNAL_NONE)
1066
1198
if (__LL_ADC_COMMON_INSTANCE (AdcHandle.Instance ) != 0U ) {
1067
1199
LL_ADC_SetCommonPathInternalCh (__LL_ADC_COMMON_INSTANCE (AdcHandle.Instance ), LL_ADC_PATH_INTERNAL_NONE);
1068
1200
}
1201
+ #endif
1069
1202
return uhADCxConvertedValue;
1070
1203
}
1071
1204
#endif /* HAL_ADC_MODULE_ENABLED && !HAL_ADC_MODULE_ONLY*/
0 commit comments