24 template <
typename,
typename =
void>
27 float Get(ADC_HandleTypeDef* hadc)
39 switch (hadc->Init.Resolution)
41#ifdef ADC_RESOLUTION_16B
42 case ADC_RESOLUTION_16B:
45#ifdef ADC_RESOLUTION_12B
46 case ADC_RESOLUTION_12B:
49#ifdef ADC_RESOLUTION_10B
50 case ADC_RESOLUTION_10B:
53#ifdef ADC_RESOLUTION_8B
54 case ADC_RESOLUTION_8B:
57#ifdef ADC_RESOLUTION_6B
58 case ADC_RESOLUTION_6B:
67 template <
typename T,
typename =
void>
74 T, std::void_t<decltype(std::declval<T>()->Init.ContinuousConvMode)>>
79 template <
typename T,
typename =
void>
86 T, std::void_t<decltype(std::declval<T>()->Init.DMAContinuousRequests)>>
91 template <
typename T,
typename =
void>
98 T, std::void_t<decltype(std::declval<T>()->Init.NbrOfConversion)>> : std::true_type
102 template <
typename T,
typename =
void>
107 template <
typename T>
109 T, std::void_t<decltype(std::declval<T>()->DMA_Handle->Init.Mode)>> : std::true_type
113 template <
typename T,
typename =
void>
118 template <
typename T>
120 T, std::void_t<decltype(std::declval<T>()->Init.ConversionDataManagement)>>
125 template <
typename T>
126 static typename std::enable_if<HasContinuousConvMode<T>::value>::type
127 AssertContinuousConvModeEnabled(T hadc)
129 ASSERT(hadc->Init.ContinuousConvMode == ENABLE);
132 template <
typename T>
133 static typename std::enable_if<!HasContinuousConvMode<T>::value>::type
134 AssertContinuousConvModeEnabled(T)
138 template <
typename T>
139 static typename std::enable_if<HasContinuousConvMode<T>::value>::type
140 AssertContinuousConvModeDisabled(T hadc)
142 ASSERT(hadc->Init.ContinuousConvMode == DISABLE);
145 template <
typename T>
146 static typename std::enable_if<!HasContinuousConvMode<T>::value>::type
147 AssertContinuousConvModeDisabled(T)
153 template <
typename T>
154 static typename std::enable_if<HasConversionDataManagement<T>::value>::type
155 AssertDMAContReqEnabled(T hadc)
157#ifdef ADC_CONVERSIONDATA_DMA_CIRCULAR
158 ASSERT(hadc->Init.ConversionDataManagement == ADC_CONVERSIONDATA_DMA_CIRCULAR);
165 template <
typename T>
166 static typename std::enable_if<!HasConversionDataManagement<T>::value &&
167 HasDMAContinuousRequests<T>::value>::type
168 AssertDMAContReqEnabled(T hadc)
170 ASSERT(hadc->Init.DMAContinuousRequests == ENABLE);
173 template <
typename T>
174 static typename std::enable_if<!HasConversionDataManagement<T>::value &&
175 !HasDMAContinuousRequests<T>::value>::type
176 AssertDMAContReqEnabled(T)
180 template <
typename T>
181 static typename std::enable_if<HasNbrOfConversion<T>::value>::type AssertNbrOfConvEq(
184 ASSERT(hadc->Init.NbrOfConversion == n);
187 template <
typename T>
188 static typename std::enable_if<!HasNbrOfConversion<T>::value>::type AssertNbrOfConvEq(
193 template <
typename T>
194 static typename std::enable_if<HasDMACircularMode<T>::value>::type AssertDMACircular(
197 ASSERT(hadc->DMA_Handle !=
nullptr);
198 ASSERT(hadc->DMA_Handle->Init.Mode == DMA_CIRCULAR);
201 template <
typename T>
202 static typename std::enable_if<!HasDMACircularMode<T>::value>::type AssertDMACircular(T)
227 float Read()
override;
247 std::initializer_list<uint32_t> channels,
float vref);
271 alignas(LIBXR_CACHE_LINE_SIZE) std::atomic<uint32_t> locked_ = 0U;
272 ADC_HandleTypeDef* hadc_;
273 const uint8_t NUM_CHANNELS;
274 uint8_t filter_size_;
281 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