26 template <
typename,
typename =
void>
27 struct GetADCResolution
29 float Get(ADC_HandleTypeDef* hadc)
37 struct GetADCResolution<T, std::void_t<decltype(std::declval<T>().Init.Resolution)>>
41 switch (hadc->Init.Resolution)
43#ifdef ADC_RESOLUTION_16B
44 case ADC_RESOLUTION_16B:
47#ifdef ADC_RESOLUTION_12B
48 case ADC_RESOLUTION_12B:
51#ifdef ADC_RESOLUTION_10B
52 case ADC_RESOLUTION_10B:
55#ifdef ADC_RESOLUTION_8B
56 case ADC_RESOLUTION_8B:
59#ifdef ADC_RESOLUTION_6B
60 case ADC_RESOLUTION_6B:
69 template <
typename T,
typename =
void>
70 struct HasContinuousConvMode : std::false_type
75 struct HasContinuousConvMode<
76 T, std::void_t<decltype(std::declval<T>()->Init.ContinuousConvMode)>>
81 template <
typename T,
typename =
void>
82 struct HasDMAContinuousRequests : std::false_type
87 struct HasDMAContinuousRequests<
88 T, std::void_t<decltype(std::declval<T>()->Init.DMAContinuousRequests)>>
93 template <
typename T,
typename =
void>
94 struct HasNbrOfConversion : std::false_type
99 struct HasNbrOfConversion<
100 T, std::void_t<decltype(std::declval<T>()->Init.NbrOfConversion)>> : std::true_type
104 template <
typename T,
typename =
void>
105 struct HasDMACircularMode : std::false_type
109 template <
typename T>
110 struct HasDMACircularMode<
111 T, std::void_t<decltype(std::declval<T>()->DMA_Handle->Init.Mode)>> : std::true_type
115 template <
typename T,
typename =
void>
116 struct HasConversionDataManagement : std::false_type
120 template <
typename T>
121 struct HasConversionDataManagement<
122 T, std::void_t<decltype(std::declval<T>()->Init.ConversionDataManagement)>>
127 template <
typename T>
128 static typename std::enable_if<HasContinuousConvMode<T>::value>::type
129 AssertContinuousConvModeEnabled(T hadc)
131 ASSERT(hadc->Init.ContinuousConvMode == ENABLE);
134 template <
typename T>
135 static typename std::enable_if<!HasContinuousConvMode<T>::value>::type
136 AssertContinuousConvModeEnabled(T)
140 template <
typename T>
141 static typename std::enable_if<HasContinuousConvMode<T>::value>::type
142 AssertContinuousConvModeDisabled(T hadc)
144 ASSERT(hadc->Init.ContinuousConvMode == DISABLE);
147 template <
typename T>
148 static typename std::enable_if<!HasContinuousConvMode<T>::value>::type
149 AssertContinuousConvModeDisabled(T)
155 template <
typename T>
156 static typename std::enable_if<HasConversionDataManagement<T>::value>::type
157 AssertDMAContReqEnabled(T hadc)
159#ifdef ADC_CONVERSIONDATA_DMA_CIRCULAR
160 ASSERT(hadc->Init.ConversionDataManagement == ADC_CONVERSIONDATA_DMA_CIRCULAR);
167 template <
typename T>
168 static typename std::enable_if<!HasConversionDataManagement<T>::value &&
169 HasDMAContinuousRequests<T>::value>::type
170 AssertDMAContReqEnabled(T hadc)
172 ASSERT(hadc->Init.DMAContinuousRequests == ENABLE);
175 template <
typename T>
176 static typename std::enable_if<!HasConversionDataManagement<T>::value &&
177 !HasDMAContinuousRequests<T>::value>::type
178 AssertDMAContReqEnabled(T)
182 template <
typename T>
183 static typename std::enable_if<HasNbrOfConversion<T>::value>::type AssertNbrOfConvEq(
186 ASSERT(hadc->Init.NbrOfConversion == n);
189 template <
typename T>
190 static typename std::enable_if<!HasNbrOfConversion<T>::value>::type AssertNbrOfConvEq(
195 template <
typename T>
196 static typename std::enable_if<HasDMACircularMode<T>::value>::type AssertDMACircular(
199 ASSERT(hadc->DMA_Handle !=
nullptr);
200#if defined(DMA_CIRCULAR)
201 ASSERT(hadc->DMA_Handle->Init.Mode == DMA_CIRCULAR);
203 static_assert(
sizeof(T) == 0,
"DMA_CIRCULAR is not defined by the HAL");
207 template <
typename T>
208 static typename std::enable_if<!HasDMACircularMode<T>::value>::type AssertDMACircular(T)
233 float Read()
override;
256 std::initializer_list<uint32_t> channels,
float vref);
281 ADC_HandleTypeDef* hadc_;
282 const uint8_t NUM_CHANNELS;
283 uint8_t filter_size_;
289#if defined(LIBXR_STM32_ADC_GPDMA)
293 float ConvertToVoltage(
float adc_value);