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