35 LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC);
37 LL_ADC_SetCommonClock(__LL_ADC_COMMON_INSTANCE(ADC1), LL_ADC_CLOCK_SYNC_PCLK_DIV4);
38 LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(ADC1), LL_ADC_PATH_INTERNAL_VREFINT);
40 if (LL_ADC_IsEnabled(ADC1))
return 0;
41 LL_ADC_DisableDeepPowerDown(ADC1);
42 LL_ADC_EnableInternalRegulator(ADC1);
43 delay_us(LL_ADC_DELAY_INTERNAL_REGUL_STAB_US + 10u);
45 LL_ADC_StartCalibration(ADC1, LL_ADC_SINGLE_ENDED);
47 while (LL_ADC_IsCalibrationOnGoing(ADC1))
if (++t > 1000000u)
return -1;
50 LL_ADC_SetResolution(ADC1, LL_ADC_RESOLUTION_12B);
51 LL_ADC_SetDataAlignment(ADC1, LL_ADC_DATA_ALIGN_RIGHT);
52 LL_ADC_SetChannelSamplingTime(ADC1, __LL_ADC_DECIMAL_NB_TO_CHANNEL(
APP_BATT_VBAT_CH), LL_ADC_SAMPLINGTIME_247CYCLES_5);
53 LL_ADC_SetChannelSamplingTime(ADC1, __LL_ADC_DECIMAL_NB_TO_CHANNEL(
APP_BATT_CUR_CH), LL_ADC_SAMPLINGTIME_247CYCLES_5);
54 LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_VREFINT, LL_ADC_SAMPLINGTIME_247CYCLES_5);
55 LL_ADC_SetChannelSingleDiff(ADC1, __LL_ADC_DECIMAL_NB_TO_CHANNEL(
APP_BATT_VBAT_CH), LL_ADC_SINGLE_ENDED);
56 LL_ADC_SetChannelSingleDiff(ADC1, __LL_ADC_DECIMAL_NB_TO_CHANNEL(
APP_BATT_CUR_CH), LL_ADC_SINGLE_ENDED);
59 LL_ADC_INJ_SetTriggerSource(ADC1, LL_ADC_INJ_TRIG_SOFTWARE);
60 LL_ADC_INJ_SetSequencerLength(ADC1, LL_ADC_INJ_SEQ_SCAN_ENABLE_3RANKS);
61 LL_ADC_INJ_SetSequencerRanks(ADC1, LL_ADC_INJ_RANK_1, __LL_ADC_DECIMAL_NB_TO_CHANNEL(
APP_BATT_VBAT_CH));
62 LL_ADC_INJ_SetSequencerRanks(ADC1, LL_ADC_INJ_RANK_2, __LL_ADC_DECIMAL_NB_TO_CHANNEL(
APP_BATT_CUR_CH));
63 LL_ADC_INJ_SetSequencerRanks(ADC1, LL_ADC_INJ_RANK_3, LL_ADC_CHANNEL_VREFINT);
65 LL_ADC_SetOverSamplingScope(ADC1, LL_ADC_OVS_GRP_INJECTED);
66 LL_ADC_ConfigOverSamplingRatioShift(ADC1, LL_ADC_OVS_RATIO_16, LL_ADC_OVS_SHIFT_RIGHT_4);
68 LL_ADC_ClearFlag_ADRDY(ADC1);
71 while (!LL_ADC_IsActiveFlag_ADRDY(ADC1))
if (++t > 1000000u)
return -1;
72 delay_us(LL_ADC_DELAY_VREFINT_STAB_US);
73 LL_ADC_ClearFlag_JEOS(ADC1);
74 LL_ADC_INJ_StartConversion(ADC1);
81 if (!
s_started || !LL_ADC_IsActiveFlag_JEOS(ADC1))
return -1;
82 const uint32_t v = LL_ADC_INJ_ReadConversionData12(ADC1, LL_ADC_INJ_RANK_1);
83 const uint32_t c = LL_ADC_INJ_ReadConversionData12(ADC1, LL_ADC_INJ_RANK_2);
84 const uint32_t vr = LL_ADC_INJ_ReadConversionData12(ADC1, LL_ADC_INJ_RANK_3);
85 LL_ADC_ClearFlag_JEOS(ADC1);
86 LL_ADC_INJ_StartConversion(ADC1);
87 if (vr == 0u)
return -1;
89 const float vdda = (float)VREFINT_CAL_VREF * 1e-3f * (
float)(*VREFINT_CAL_ADDR) / (float)vr;
90 *vbat_pin = vdda * (float)v / 4095.0f;
91 *cur_pin = vdda * (float)c / 4095.0f;