25 template <
typename,
typename =
void>
28 float Get(ADC_HandleTypeDef* hadc)
40 switch (hadc->Init.Resolution)
42#ifdef ADC_RESOLUTION_16B
43 case ADC_RESOLUTION_16B:
46#ifdef ADC_RESOLUTION_12B
47 case ADC_RESOLUTION_12B:
50#ifdef ADC_RESOLUTION_10B
51 case ADC_RESOLUTION_10B:
54#ifdef ADC_RESOLUTION_8B
55 case ADC_RESOLUTION_8B:
58#ifdef ADC_RESOLUTION_6B
59 case ADC_RESOLUTION_6B:
68 template <
typename T,
typename =
void>
75 T, std::void_t<decltype(std::declval<T>()->Init.ContinuousConvMode)>>
80 template <
typename T,
typename =
void>
87 T, std::void_t<decltype(std::declval<T>()->Init.DMAContinuousRequests)>>
92 template <
typename T,
typename =
void>
99 T, std::void_t<decltype(std::declval<T>()->Init.NbrOfConversion)>> : std::true_type
103 template <
typename T,
typename =
void>
108 template <
typename T>
110 T, std::void_t<decltype(std::declval<T>()->DMA_Handle->Init.Mode)>> : std::true_type
114 template <
typename T,
typename =
void>
119 template <
typename T>
121 T, std::void_t<decltype(std::declval<T>()->Init.ConversionDataManagement)>>
126 template <
typename T>
127 static typename std::enable_if<HasContinuousConvMode<T>::value>::type
128 AssertContinuousConvModeEnabled(T hadc)
130 ASSERT(hadc->Init.ContinuousConvMode == ENABLE);
133 template <
typename T>
134 static typename std::enable_if<!HasContinuousConvMode<T>::value>::type
135 AssertContinuousConvModeEnabled(T)
139 template <
typename T>
140 static typename std::enable_if<HasContinuousConvMode<T>::value>::type
141 AssertContinuousConvModeDisabled(T hadc)
143 ASSERT(hadc->Init.ContinuousConvMode == DISABLE);
146 template <
typename T>
147 static typename std::enable_if<!HasContinuousConvMode<T>::value>::type
148 AssertContinuousConvModeDisabled(T)
154 template <
typename T>
155 static typename std::enable_if<HasConversionDataManagement<T>::value>::type
156 AssertDMAContReqEnabled(T hadc)
158#ifdef ADC_CONVERSIONDATA_DMA_CIRCULAR
159 ASSERT(hadc->Init.ConversionDataManagement == ADC_CONVERSIONDATA_DMA_CIRCULAR);
166 template <
typename T>
167 static typename std::enable_if<!HasConversionDataManagement<T>::value &&
168 HasDMAContinuousRequests<T>::value>::type
169 AssertDMAContReqEnabled(T hadc)
171 ASSERT(hadc->Init.DMAContinuousRequests == ENABLE);
174 template <
typename T>
175 static typename std::enable_if<!HasConversionDataManagement<T>::value &&
176 !HasDMAContinuousRequests<T>::value>::type
177 AssertDMAContReqEnabled(T)
181 template <
typename T>
182 static typename std::enable_if<HasNbrOfConversion<T>::value>::type AssertNbrOfConvEq(
185 ASSERT(hadc->Init.NbrOfConversion == n);
188 template <
typename T>
189 static typename std::enable_if<!HasNbrOfConversion<T>::value>::type AssertNbrOfConvEq(
194 template <
typename T>
195 static typename std::enable_if<HasDMACircularMode<T>::value>::type AssertDMACircular(
198 ASSERT(hadc->DMA_Handle !=
nullptr);
199 ASSERT(hadc->DMA_Handle->Init.Mode == DMA_CIRCULAR);
202 template <
typename T>
203 static typename std::enable_if<!HasDMACircularMode<T>::value>::type AssertDMACircular(T)
228 float Read()
override;
248 std::initializer_list<uint32_t> channels,
float vref);
273 ADC_HandleTypeDef* hadc_;
274 const uint8_t NUM_CHANNELS;
275 uint8_t filter_size_;
282 float ConvertToVoltage(
float adc_value);
STM32ADC(ADC_HandleTypeDef *hadc, RawData dma_buff, std::initializer_list< uint32_t > channels, float vref)
构造 ADC 驱动对象 / Construct ADC driver object