30 std::initializer_list<uint32_t> channels,
float vref)
32 NUM_CHANNELS(channels.size()),
33 filter_size_(dma_buff.size_ / NUM_CHANNELS / 2),
34 use_dma_(hadc_->DMA_Handle != nullptr),
35 dma_buffer_(dma_buff),
37 channels_(
new Channel*[NUM_CHANNELS]),
40 auto it = channels.begin();
41 for (uint8_t i = 0; i < NUM_CHANNELS; ++i)
43 channels_[i] =
new Channel(
this, i, *it++);
46#if defined(ADC_CALIB_OFFSET_AND_LINEARITY) && defined(ADC_SINGLE_ENDED)
47 HAL_ADCEx_Calibration_Start(hadc, ADC_CALIB_OFFSET_AND_LINEARITY, ADC_SINGLE_ENDED);
48#elif defined(ADC_CALIB_OFFSET_LINEARITY) && defined(ADC_SINGLE_ENDED)
49 HAL_ADCEx_Calibration_Start(hadc, ADC_CALIB_OFFSET_LINEARITY, ADC_SINGLE_ENDED);
50#elif defined(ADC_CALIB_OFFSET) && defined(ADC_SINGLE_ENDED)
51 HAL_ADCEx_Calibration_Start(hadc, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);
52#elif defined(ADC_SINGLE_ENDED)
53 HAL_ADCEx_Calibration_Start(hadc, ADC_SINGLE_ENDED);
55 HAL_ADCEx_Calibration_Start(hadc);
61 AssertContinuousConvModeEnabled<H>(hadc_);
62 AssertDMAContReqEnabled<H>(hadc_);
63 AssertDMACircular<H>(hadc_);
64 AssertNbrOfConvEq<H>(hadc_, NUM_CHANNELS);
65 HAL_ADC_Start_DMA(hadc_,
reinterpret_cast<uint32_t*
>(dma_buffer_.addr_),
66 NUM_CHANNELS * filter_size_);
70 AssertNbrOfConvEq<H>(hadc_, 1);
71 AssertContinuousConvModeDisabled<H>(hadc_);
90 if (channel >= NUM_CHANNELS)
96 uint16_t* buffer =
reinterpret_cast<uint16_t*
>(dma_buffer_.
addr_);
99#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
100 SCB_InvalidateDCache_by_Addr(buffer, filter_size_ * NUM_CHANNELS * 2);
103 for (uint8_t i = 0; i < filter_size_; ++i)
105 sum += buffer[channel + i * NUM_CHANNELS];
107 return ConvertToVoltage(
static_cast<float>(sum) /
static_cast<float>(filter_size_));
110 ADC_ChannelConfTypeDef config = {};
113#if defined(ADC_SAMPLETIME_16CYCLES)
114 time = ADC_SAMPLETIME_16CYCLES;
115#elif defined(ADC_SAMPLETIME_16CYCLES_5)
116 time = ADC_SAMPLETIME_16CYCLES_5;
117#elif defined(ADC_SAMPLETIME_17CYCLES)
118 time = ADC_SAMPLETIME_17CYCLES;
119#elif defined(ADC_SAMPLETIME_17CYCLES_5)
120 time = ADC_SAMPLETIME_17CYCLES_5;
121#elif defined(ADC_SAMPLETIME_18CYCLES)
122 time = ADC_SAMPLETIME_18CYCLES;
123#elif defined(ADC_SAMPLETIME_18CYCLES_5)
124 time = ADC_SAMPLETIME_18CYCLES_5;
125#elif defined(ADC_SAMPLETIME_19CYCLES)
126 time = ADC_SAMPLETIME_19CYCLES;
127#elif defined(ADC_SAMPLETIME_19CYCLES_5)
128 time = ADC_SAMPLETIME_19CYCLES_5;
129#elif defined(ADC_SAMPLETIME_20CYCLES)
130 time = ADC_SAMPLETIME_20CYCLES;
131#elif defined(ADC_SAMPLETIME_20CYCLES_5)
132 time = ADC_SAMPLETIME_20CYCLES_5;
133#elif defined(ADC_SAMPLETIME_21CYCLES)
134 time = ADC_SAMPLETIME_21CYCLES;
135#elif defined(ADC_SAMPLETIME_21CYCLES_5)
136 time = ADC_SAMPLETIME_21CYCLES_5;
137#elif defined(ADC_SAMPLETIME_22CYCLES)
138 time = ADC_SAMPLETIME_22CYCLES;
139#elif defined(ADC_SAMPLETIME_22CYCLES_5)
140 time = ADC_SAMPLETIME_22CYCLES_5;
141#elif defined(ADC_SAMPLETIME_23CYCLES)
142 time = ADC_SAMPLETIME_23CYCLES;
143#elif defined(ADC_SAMPLETIME_23CYCLES_5)
144 time = ADC_SAMPLETIME_23CYCLES_5;
145#elif defined(ADC_SAMPLETIME_24CYCLES)
146 time = ADC_SAMPLETIME_24CYCLES;
147#elif defined(ADC_SAMPLETIME_24CYCLES_5)
148 time = ADC_SAMPLETIME_24CYCLES_5;
149#elif defined(ADC_SAMPLETIME_25CYCLES)
150 time = ADC_SAMPLETIME_25CYCLES;
151#elif defined(ADC_SAMPLETIME_25CYCLES_5)
152 time = ADC_SAMPLETIME_25CYCLES_5;
153#elif defined(ADC_SAMPLETIME_26CYCLES)
154 time = ADC_SAMPLETIME_26CYCLES;
155#elif defined(ADC_SAMPLETIME_26CYCLES_5)
156 time = ADC_SAMPLETIME_26CYCLES_5;
157#elif defined(ADC_SAMPLETIME_27CYCLES)
158 time = ADC_SAMPLETIME_27CYCLES;
159#elif defined(ADC_SAMPLETIME_27CYCLES_5)
160 time = ADC_SAMPLETIME_27CYCLES_5;
161#elif defined(ADC_SAMPLETIME_28CYCLES)
162 time = ADC_SAMPLETIME_28CYCLES;
163#elif defined(ADC_SAMPLETIME_28CYCLES_5)
164 time = ADC_SAMPLETIME_28CYCLES_5;
165#elif defined(ADC_SAMPLETIME_29CYCLES)
166 time = ADC_SAMPLETIME_29CYCLES;
167#elif defined(ADC_SAMPLETIME_29CYCLES_5)
168 time = ADC_SAMPLETIME_29CYCLES_5;
169#elif defined(ADC_SAMPLETIME_30CYCLES)
170 time = ADC_SAMPLETIME_30CYCLES;
171#elif defined(ADC_SAMPLETIME_30CYCLES_5)
172 time = ADC_SAMPLETIME_30CYCLES_5;
173#elif defined(ADC_SAMPLETIME_31CYCLES)
174 time = ADC_SAMPLETIME_31CYCLES;
175#elif defined(ADC_SAMPLETIME_31CYCLES_5)
176 time = ADC_SAMPLETIME_31CYCLES_5;
177#elif defined(ADC_SAMPLETIME_32CYCLES)
178 time = ADC_SAMPLETIME_32CYCLES;
179#elif defined(ADC_SAMPLETIME_32CYCLES_5)
180 time = ADC_SAMPLETIME_32CYCLES_5;
181#error "Unsupported sample time"
184 config.Channel = channels_[channel]->ch_;
185#if defined(ADC_REGULAR_RANK_1)
186 config.Rank = ADC_REGULAR_RANK_1;
190#if defined(ADC_SINGLE_ENDED) && !defined(STM32L0)
191 config.SingleDiff = ADC_SINGLE_ENDED;
193#if defined(ADC_OFFSET_NONE)
194 config.OffsetNumber = ADC_OFFSET_NONE;
198 config.SamplingTime = time;
201 uint32_t expected = 0U;
203 if (!locked_.compare_exchange_strong(expected, 0xF0F0F0F0U, std::memory_order_acquire,
204 std::memory_order_relaxed))
212 HAL_ADC_ConfigChannel(hadc_, &config);
215 for (uint8_t i = 0; i < filter_size_; ++i)
217 HAL_ADC_Start(hadc_);
218 HAL_ADC_PollForConversion(hadc_, 20);
219 buffer[channel + i * NUM_CHANNELS] = HAL_ADC_GetValue(hadc_);
220 sum += buffer[channel + i * NUM_CHANNELS];
223 locked_.store(0, std::memory_order_release);
225 return ConvertToVoltage(
static_cast<float>(sum) /
static_cast<float>(filter_size_));