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 template <typename T>
86 T, std::void_t<decltype(std::declval<T>()->Init.ContinuousConvMode)>>
87 : std::true_type
88 {
89 };
90
91 template <typename T, typename = void>
92 struct HasDMAContinuousRequests : std::false_type
93 {
94 };
95 template <typename T>
97 T, std::void_t<decltype(std::declval<T>()->Init.DMAContinuousRequests)>>
98 : std::true_type
99 {
100 };
101
102 template <typename T, typename = void>
103 struct HasNbrOfConversion : std::false_type
104 {
105 };
106 template <typename T>
108 T, std::void_t<decltype(std::declval<T>()->Init.NbrOfConversion)>> : std::true_type
109 {
110 };
111
112 template <typename T, typename = void>
113 struct HasDMACircularMode : std::false_type
114 {
115 };
116 template <typename T>
118 T, std::void_t<decltype(std::declval<T>()->DMA_Handle->Init.Mode)>> : std::true_type
119 {
120 };
121
122 template <typename T>
123 static typename std::enable_if<HasContinuousConvMode<T>::value>::type
124 AssertContinuousConvModeEnabled(T hadc)
125 {
126 ASSERT(hadc->Init.ContinuousConvMode == ENABLE);
127 }
128 template <typename T>
129 static typename std::enable_if<!HasContinuousConvMode<T>::value>::type
130 AssertContinuousConvModeEnabled(T)
131 {
132 }
133
134 template <typename T>
135 static typename std::enable_if<HasContinuousConvMode<T>::value>::type
136 AssertContinuousConvModeDisabled(T hadc)
137 {
138 ASSERT(hadc->Init.ContinuousConvMode == DISABLE);
139 }
140 template <typename T>
141 static typename std::enable_if<!HasContinuousConvMode<T>::value>::type
142 AssertContinuousConvModeDisabled(T)
143 {
144 }
145
146 template <typename T>
147 static typename std::enable_if<HasDMAContinuousRequests<T>::value>::type
148 AssertDMAContReqEnabled(T hadc)
149 {
150 ASSERT(hadc->Init.DMAContinuousRequests == ENABLE);
151 }
152 template <typename T>
153 static typename std::enable_if<!HasDMAContinuousRequests<T>::value>::type
154 AssertDMAContReqEnabled(T)
155 {
156 }
157
158 template <typename T>
159 static typename std::enable_if<HasNbrOfConversion<T>::value>::type AssertNbrOfConvEq(
160 T hadc, uint32_t n)
161 {
162 ASSERT(hadc->Init.NbrOfConversion == n);
163 }
164 template <typename T>
165 static typename std::enable_if<!HasNbrOfConversion<T>::value>::type AssertNbrOfConvEq(
166 T, uint32_t)
167 {
168 }
169
170 template <typename T>
171 static typename std::enable_if<HasDMACircularMode<T>::value>::type AssertDMACircular(
172 T hadc)
173 {
174 ASSERT(hadc->DMA_Handle != nullptr);
175 ASSERT(hadc->DMA_Handle->Init.Mode == DMA_CIRCULAR);
176 }
177 template <typename T>
178 static typename std::enable_if<!HasDMACircularMode<T>::value>::type AssertDMACircular(T)
179 {
180 }
181
182 public:
187 class Channel : public ADC
188 {
189 public:
198 Channel(STM32ADC* adc, uint8_t index, uint32_t ch);
199
206 float Read() override;
207
208 private:
209 Channel();
210 STM32ADC* adc_;
211 uint8_t index_;
212 uint32_t ch_;
213
214 friend class STM32ADC;
215 };
216
225 STM32ADC(ADC_HandleTypeDef* hadc, RawData dma_buff,
226 std::initializer_list<uint32_t> channels, float vref);
227
231 ~STM32ADC();
232
239 Channel& GetChannel(uint8_t index);
240
247 float ReadChannel(uint8_t channel);
248
249 private:
250 alignas(LIBXR_CACHE_LINE_SIZE) std::atomic<uint32_t> locked_ = 0U;
251 ADC_HandleTypeDef* hadc_;
252 const uint8_t NUM_CHANNELS;
253 uint8_t filter_size_;
254 bool use_dma_;
255 RawData dma_buffer_;
256 float resolution_;
257 Channel** channels_;
258 float vref_;
259
260 float ConvertToVoltage(float adc_value);
261};
262
263} // namespace LibXR
264
265#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