libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
stm32_adc.hpp
1#pragma once
2
3#include <initializer_list>
4
5#include "main.h"
6
7#ifdef HAL_ADC_MODULE_ENABLED
8
9#ifdef ADC
10#undef ADC
11#endif
12
13#include "adc.hpp"
14#include "libxr.hpp"
15
16namespace LibXR
17{
18
25{
32 template <typename, typename = void>
34 {
35 float Get(ADC_HandleTypeDef* hadc)
36 {
37 UNUSED(hadc);
38 return 4095.0f;
39 }
40 };
41
47 template <typename T>
48 struct GetADCResolution<T, std::void_t<decltype(std::declval<T>().Init.Resolution)>>
49 {
50 float Get(T* hadc)
51 {
52 switch (hadc->Init.Resolution)
53 {
54#ifdef ADC_RESOLUTION_16B
55 case ADC_RESOLUTION_16B:
56 return 65535.0f;
57#endif
58#ifdef ADC_RESOLUTION_12B
59 case ADC_RESOLUTION_12B:
60 return 4095.0f;
61#endif
62#ifdef ADC_RESOLUTION_10B
63 case ADC_RESOLUTION_10B:
64 return 1023.0f;
65#endif
66#ifdef ADC_RESOLUTION_8B
67 case ADC_RESOLUTION_8B:
68 return 255.0f;
69#endif
70#ifdef ADC_RESOLUTION_6B
71 case ADC_RESOLUTION_6B:
72 return 63.0f;
73#endif
74 default:
75 return 4095.0f;
76 }
77 }
78 };
79
80 template <typename T, typename = void>
81 struct HasContinuousConvMode : std::false_type
82 {
83 };
84
85 template <typename T>
87 T, std::void_t<decltype(std::declval<T>()->Init.ContinuousConvMode)>>
88 : std::true_type
89 {
90 };
91
92 template <typename T, typename = void>
93 struct HasDMAContinuousRequests : std::false_type
94 {
95 };
96
97 template <typename T>
99 T, std::void_t<decltype(std::declval<T>()->Init.DMAContinuousRequests)>>
100 : std::true_type
101 {
102 };
103
104 template <typename T, typename = void>
105 struct HasNbrOfConversion : std::false_type
106 {
107 };
108
109 template <typename T>
111 T, std::void_t<decltype(std::declval<T>()->Init.NbrOfConversion)>> : std::true_type
112 {
113 };
114
115 template <typename T, typename = void>
116 struct HasDMACircularMode : std::false_type
117 {
118 };
119
120 template <typename T>
122 T, std::void_t<decltype(std::declval<T>()->DMA_Handle->Init.Mode)>> : std::true_type
123 {
124 };
125
126 template <typename T, typename = void>
127 struct HasConversionDataManagement : std::false_type
128 {
129 };
130
131 template <typename T>
133 T, std::void_t<decltype(std::declval<T>()->Init.ConversionDataManagement)>>
134 : std::true_type
135 {
136 };
137
138 template <typename T>
139 static typename std::enable_if<HasContinuousConvMode<T>::value>::type
140 AssertContinuousConvModeEnabled(T hadc)
141 {
142 ASSERT(hadc->Init.ContinuousConvMode == ENABLE);
143 }
144
145 template <typename T>
146 static typename std::enable_if<!HasContinuousConvMode<T>::value>::type
147 AssertContinuousConvModeEnabled(T)
148 {
149 }
150
151 template <typename T>
152 static typename std::enable_if<HasContinuousConvMode<T>::value>::type
153 AssertContinuousConvModeDisabled(T hadc)
154 {
155 ASSERT(hadc->Init.ContinuousConvMode == DISABLE);
156 }
157
158 template <typename T>
159 static typename std::enable_if<!HasContinuousConvMode<T>::value>::type
160 AssertContinuousConvModeDisabled(T)
161 {
162 }
163
164 // 有 ConversionDataManagement 的时候,只看 ConversionDataManagement ==
165 // ADC_CONVERSIONDATA_DMA_CIRCULAR
166 template <typename T>
167 static typename std::enable_if<HasConversionDataManagement<T>::value>::type
168 AssertDMAContReqEnabled(T hadc)
169 {
170#ifdef ADC_CONVERSIONDATA_DMA_CIRCULAR
171 ASSERT(hadc->Init.ConversionDataManagement == ADC_CONVERSIONDATA_DMA_CIRCULAR);
172#else
173 UNUSED(hadc);
174#endif
175 }
176
177 // 没有 ConversionDataManagement,但有 DMAContinuousRequests => 维持原有检查
178 template <typename T>
179 static typename std::enable_if<!HasConversionDataManagement<T>::value &&
180 HasDMAContinuousRequests<T>::value>::type
181 AssertDMAContReqEnabled(T hadc)
182 {
183 ASSERT(hadc->Init.DMAContinuousRequests == ENABLE);
184 }
185
186 template <typename T>
187 static typename std::enable_if<!HasConversionDataManagement<T>::value &&
188 !HasDMAContinuousRequests<T>::value>::type
189 AssertDMAContReqEnabled(T)
190 {
191 }
192
193 template <typename T>
194 static typename std::enable_if<HasNbrOfConversion<T>::value>::type AssertNbrOfConvEq(
195 T hadc, uint32_t n)
196 {
197 ASSERT(hadc->Init.NbrOfConversion == n);
198 }
199
200 template <typename T>
201 static typename std::enable_if<!HasNbrOfConversion<T>::value>::type AssertNbrOfConvEq(
202 T, uint32_t)
203 {
204 }
205
206 template <typename T>
207 static typename std::enable_if<HasDMACircularMode<T>::value>::type AssertDMACircular(
208 T hadc)
209 {
210 ASSERT(hadc->DMA_Handle != nullptr);
211 ASSERT(hadc->DMA_Handle->Init.Mode == DMA_CIRCULAR);
212 }
213
214 template <typename T>
215 static typename std::enable_if<!HasDMACircularMode<T>::value>::type AssertDMACircular(T)
216 {
217 }
218
219 public:
224 class Channel : public ADC
225 {
226 public:
235 Channel(STM32ADC* adc, uint8_t index, uint32_t ch);
236
243 float Read() override;
244
245 private:
246 Channel();
247 STM32ADC* adc_;
248 uint8_t index_;
249 uint32_t ch_;
250
251 friend class STM32ADC;
252 };
253
262 STM32ADC(ADC_HandleTypeDef* hadc, RawData dma_buff,
263 std::initializer_list<uint32_t> channels, float vref);
264
268 ~STM32ADC();
269
276 Channel& GetChannel(uint8_t index);
277
284 float ReadChannel(uint8_t channel);
285
286 private:
287 alignas(LIBXR_CACHE_LINE_SIZE) std::atomic<uint32_t> locked_ = 0U;
288 ADC_HandleTypeDef* hadc_;
289 const uint8_t NUM_CHANNELS;
290 uint8_t filter_size_;
291 bool use_dma_;
292 RawData dma_buffer_;
293 float resolution_;
294 Channel** channels_;
295 float vref_;
296
297 float ConvertToVoltage(float adc_value);
298};
299
300} // namespace LibXR
301
302#endif
模拟数字转换器(ADC)基类
Definition adc.hpp:18
原始数据封装类。 A class for encapsulating raw data.
STM32ADC 类,用于处理 STM32 系统的 ADC 通道。 Provides handling for STM32 ADC.
float Read() override
读取 ADC 值
Definition stm32_adc.cpp:27
STM32ADC 类,用于处理 STM32 系统的 ADC 通道。 Provides handling for STM32 ADC channels.
Definition stm32_adc.hpp:25
STM32ADC(ADC_HandleTypeDef *hadc, RawData dma_buff, std::initializer_list< uint32_t > channels, float vref)
STM32ADC 类,用于处理 STM32 系统的 ADC 通道。 Provides handling for STM32.
Definition stm32_adc.cpp:29
~STM32ADC()
析构函数 Destructor
Definition stm32_adc.cpp:76
float ReadChannel(uint8_t channel)
读取 ADC 值
Definition stm32_adc.cpp:88
Channel & GetChannel(uint8_t index)
获取 ADC 通道对象 Get ADC channel object
Definition stm32_adc.cpp:86
LibXR 命名空间
获取 ADC 分辨率 Get ADC resolution
Definition stm32_adc.hpp:34