Skip to content

Commit e57de63

Browse files
committed
ADC tests running with new MPU
1 parent e091ee3 commit e57de63

3 files changed

Lines changed: 157 additions & 51 deletions

File tree

Inc/HALAL/Services/ADC/ADC.hpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@
1212
#include "HALAL/Models/GPIO.hpp"
1313

1414
#include "HALAL/Models/Pin.hpp"
15+
#ifdef SIM_ON
16+
#define STLIB_ADC_DMA_BUFFER_ATTR
17+
#else
1518
#include "HALAL/Models/MPU.hpp"
19+
#define STLIB_ADC_DMA_BUFFER_ATTR D1_NC
20+
#endif
1621

1722
using std::array;
1823
using std::size_t;
@@ -744,7 +749,7 @@ struct ADCDomain {
744749
"ADC DMA buffer size exceeds max_instances"
745750
);
746751

747-
alignas(32) D1_NC
752+
alignas(32) STLIB_ADC_DMA_BUFFER_ATTR
748753
static inline uint16_t dma_buffer_pool[total_dma_slots > 0 ? total_dma_slots : 1]{};
749754

750755
static constexpr bool is_resolved_config(const Config& cfg) {
@@ -998,4 +1003,6 @@ struct ADCDomain {
9981003

9991004
#endif // HAL_ADC_MODULE_ENABLED
10001005

1006+
#undef STLIB_ADC_DMA_BUFFER_ATTR
1007+
10011008
} // namespace ST_LIB

Tests/adc_sensor_test.cpp

Lines changed: 57 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717

1818
namespace {
1919

20+
inline float adc_sensor_template_output_0 = 0.0f;
21+
inline float adc_sensor_template_output_1 = 0.0f;
22+
2023
constexpr std::array<ST_LIB::DMADomain::Entry, 2> adc_dma_entries{{
2124
{.instance = ST_LIB::DMADomain::Peripheral::adc1,
2225
.stream = ST_LIB::DMADomain::Stream::dma1_stream0,
@@ -31,6 +34,45 @@ constexpr std::array<ST_LIB::DMADomain::Entry, 2> adc_dma_entries{{
3134
constexpr auto adc_dma_cfg =
3235
ST_LIB::DMADomain::build<2>(std::span<const ST_LIB::DMADomain::Entry, 2>{adc_dma_entries});
3336

37+
constexpr std::array<ST_LIB::ADCDomain::Config, 1> single_adc1_init_cfgs{{
38+
{.gpio_idx = 0,
39+
.peripheral = ST_LIB::ADCDomain::Peripheral::ADC_1,
40+
.channel = ST_LIB::ADCDomain::Channel::CH16,
41+
.resolution = ST_LIB::ADCDomain::Resolution::BITS_12,
42+
.sample_time = ST_LIB::ADCDomain::SampleTime::CYCLES_8_5,
43+
.prescaler = ST_LIB::ADCDomain::ClockPrescaler::DIV1,
44+
.sample_rate_hz = 0,
45+
.dma_request = DMA_REQUEST_ADC1,
46+
.output = &adc_sensor_template_output_0},
47+
}};
48+
49+
constexpr std::array<ST_LIB::ADCDomain::Config, 2> split_adc12_init_cfgs{{
50+
{.gpio_idx = 0,
51+
.peripheral = ST_LIB::ADCDomain::Peripheral::ADC_1,
52+
.channel = ST_LIB::ADCDomain::Channel::CH16,
53+
.resolution = ST_LIB::ADCDomain::Resolution::BITS_12,
54+
.sample_time = ST_LIB::ADCDomain::SampleTime::CYCLES_8_5,
55+
.prescaler = ST_LIB::ADCDomain::ClockPrescaler::DIV1,
56+
.sample_rate_hz = 0,
57+
.dma_request = DMA_REQUEST_ADC1,
58+
.output = &adc_sensor_template_output_0},
59+
{.gpio_idx = 1,
60+
.peripheral = ST_LIB::ADCDomain::Peripheral::ADC_2,
61+
.channel = ST_LIB::ADCDomain::Channel::CH2,
62+
.resolution = ST_LIB::ADCDomain::Resolution::BITS_16,
63+
.sample_time = ST_LIB::ADCDomain::SampleTime::CYCLES_8_5,
64+
.prescaler = ST_LIB::ADCDomain::ClockPrescaler::DIV1,
65+
.sample_rate_hz = 0,
66+
.dma_request = DMA_REQUEST_ADC2,
67+
.output = &adc_sensor_template_output_1},
68+
}};
69+
70+
template <std::size_t N, const std::array<ST_LIB::ADCDomain::Config, N>& Cfgs>
71+
using ADCInit = ST_LIB::ADCDomain::Init<N, Cfgs>;
72+
73+
using SingleADCInit = ADCInit<1, single_adc1_init_cfgs>;
74+
using SplitADCInit = ADCInit<2, split_adc12_init_cfgs>;
75+
3476
void clear_nvic_enables() {
3577
for (auto& reg : NVIC->ISER) {
3678
reg = 0U;
@@ -52,10 +94,10 @@ class ADCSensorTest : public ::testing::Test {
5294
clear_dma_irq_table();
5395
}
5496

55-
template <std::size_t N>
97+
template <std::size_t N, const std::array<ST_LIB::ADCDomain::Config, N>& InitCfgs>
5698
void init_adc_with_dma(const std::array<ST_LIB::ADCDomain::Config, N>& cfgs) {
5799
ST_LIB::DMADomain::Init<2>::init(adc_dma_cfg);
58-
ST_LIB::ADCDomain::Init<N>::init(
100+
ADCInit<N, InitCfgs>::init(
59101
cfgs,
60102
std::span<ST_LIB::GPIODomain::Instance>{},
61103
std::span<ST_LIB::DMADomain::Instance>(ST_LIB::DMADomain::Init<2>::instances)
@@ -77,10 +119,10 @@ TEST_F(ADCSensorTest, LinearSensorUsesNormalizedADCVoltageForItsTransferFunction
77119
.output = &output},
78120
}};
79121

80-
init_adc_with_dma(cfgs);
122+
init_adc_with_dma<1, single_adc1_init_cfgs>(cfgs);
81123
ST_LIB::MockedHAL::adc_set_channel_raw(ADC1, ADC_CHANNEL_16, 512U);
82124

83-
LinearSensor<float> sensor(ST_LIB::ADCDomain::Init<1>::instances[0], 2.0f, -1.0f, output, 5.0f);
125+
LinearSensor<float> sensor(SingleADCInit::instances[0], 2.0f, -1.0f, output, 5.0f);
84126
sensor.read();
85127

86128
EXPECT_NEAR(output, 2.0f * ((512.0f / 1023.0f) * 5.0f) - 1.0f, 0.001f);
@@ -100,12 +142,11 @@ TEST_F(ADCSensorTest, FilteredLinearSensorReusesTheSameADCConversionPath) {
100142
.output = &output},
101143
}};
102144

103-
init_adc_with_dma(cfgs);
145+
init_adc_with_dma<1, single_adc1_init_cfgs>(cfgs);
104146
ST_LIB::MockedHAL::adc_set_channel_raw(ADC1, ADC_CHANNEL_16, 2048U);
105147

106148
MovingAverage<1> filter;
107-
FilteredLinearSensor<float, 1>
108-
sensor(ST_LIB::ADCDomain::Init<1>::instances[0], 2.0f, 1.0f, output, filter);
149+
FilteredLinearSensor<float, 1> sensor(SingleADCInit::instances[0], 2.0f, 1.0f, output, filter);
109150

110151
sensor.read();
111152
sensor.read();
@@ -138,15 +179,10 @@ TEST_F(ADCSensorTest, LookupSensorMapsEquivalentNormalizedReadingsAcrossResoluti
138179
.output = nullptr},
139180
}};
140181

141-
init_adc_with_dma(cfgs);
182+
init_adc_with_dma<2, split_adc12_init_cfgs>(cfgs);
142183

143-
LookupSensor span_sensor(
144-
ST_LIB::ADCDomain::Init<2>::instances[0],
145-
std::span<const double>(table),
146-
out12
147-
);
148-
LookupSensor
149-
ptr_sensor(ST_LIB::ADCDomain::Init<2>::instances[1], table.data(), table.size(), out16);
184+
LookupSensor span_sensor(SplitADCInit::instances[0], std::span<const double>(table), out12);
185+
LookupSensor ptr_sensor(SplitADCInit::instances[1], table.data(), table.size(), out16);
150186

151187
ST_LIB::MockedHAL::adc_set_channel_raw(ADC1, ADC_CHANNEL_16, 2048U);
152188
ST_LIB::MockedHAL::adc_set_channel_raw(ADC2, ADC_CHANNEL_2, 32768U);
@@ -180,12 +216,12 @@ TEST_F(ADCSensorTest, PT100ReadsFromADCVoltageAndSupportsFilteredMode) {
180216
.output = &direct_output},
181217
}};
182218

183-
init_adc_with_dma(cfgs);
219+
init_adc_with_dma<1, single_adc1_init_cfgs>(cfgs);
184220
ST_LIB::MockedHAL::adc_set_channel_raw(ADC1, ADC_CHANNEL_16, 2048U);
185221

186-
PT100<1> direct_sensor(ST_LIB::ADCDomain::Init<1>::instances[0], direct_output);
222+
PT100<1> direct_sensor(SingleADCInit::instances[0], direct_output);
187223
MovingAverage<1> filter;
188-
PT100<1> filtered_sensor(ST_LIB::ADCDomain::Init<1>::instances[0], filtered_output, filter);
224+
PT100<1> filtered_sensor(SingleADCInit::instances[0], filtered_output, filter);
189225

190226
direct_sensor.read();
191227
filtered_sensor.read();
@@ -222,10 +258,10 @@ TEST_F(ADCSensorTest, NTCUsesNormalizedADCCountsAcrossResolutions) {
222258
.output = nullptr},
223259
}};
224260

225-
init_adc_with_dma(cfgs);
261+
init_adc_with_dma<2, split_adc12_init_cfgs>(cfgs);
226262

227-
NTC ntc12(ST_LIB::ADCDomain::Init<2>::instances[0], out12);
228-
NTC ntc16(ST_LIB::ADCDomain::Init<2>::instances[1], out16);
263+
NTC ntc12(SplitADCInit::instances[0], out12);
264+
NTC ntc16(SplitADCInit::instances[1], out16);
229265

230266
ST_LIB::MockedHAL::adc_set_channel_raw(ADC1, ADC_CHANNEL_16, 2047U);
231267
ST_LIB::MockedHAL::adc_set_channel_raw(ADC2, ADC_CHANNEL_2, 32767U);

0 commit comments

Comments
 (0)