@@ -29,18 +29,19 @@ struct adc_descr_t {
29
29
IRQn_Type dma_irqn;
30
30
TIM_HandleTypeDef tim;
31
31
uint32_t tim_trig;
32
- uint32_t pin_alt;
33
32
DMABufferPool<Sample> *pool;
34
33
DMABuffer<Sample> *dmabuf[2 ];
35
34
};
36
35
36
+ static uint32_t pin_alt[3 ] = {0 , ALT0, ALT1};
37
+
37
38
static adc_descr_t adc_descr_all[3 ] = {
38
39
{{ADC1}, {DMA1_Stream1, {DMA_REQUEST_ADC1}}, DMA1_Stream1_IRQn, {TIM1}, ADC_EXTERNALTRIG_T1_TRGO,
39
- 0 , nullptr , {nullptr , nullptr }},
40
+ nullptr , {nullptr , nullptr }},
40
41
{{ADC2}, {DMA1_Stream2, {DMA_REQUEST_ADC2}}, DMA1_Stream2_IRQn, {TIM2}, ADC_EXTERNALTRIG_T2_TRGO,
41
- ALT0, nullptr , {nullptr , nullptr }},
42
+ nullptr , {nullptr , nullptr }},
42
43
{{ADC3}, {DMA1_Stream3, {DMA_REQUEST_ADC3}}, DMA1_Stream3_IRQn, {TIM3}, ADC_EXTERNALTRIG_T3_TRGO,
43
- ALT1, nullptr , {nullptr , nullptr }},
44
+ nullptr , {nullptr , nullptr }},
44
45
};
45
46
46
47
static uint32_t ADC_RES_LUT[] = {
@@ -121,13 +122,28 @@ int AdvancedADC::begin(uint32_t resolution, uint32_t sample_rate, size_t n_sampl
121
122
return 0 ;
122
123
}
123
124
125
+ // Clear ALTx pin.
126
+ for (size_t i=0 ; i<n_channels; i++) {
127
+ for (size_t j=0 ; j<AN_ARRAY_SIZE (pin_alt); j++) {
128
+ adc_pins[i] = (PinName) (adc_pins[i] & ~(uint32_t )pin_alt[j]);
129
+ }
130
+ }
131
+
124
132
// Find an ADC that can be used with these set of pins/channels.
125
- for (size_t i=0 ; instance == ADC_NP && i<AN_ARRAY_SIZE (adc_descr_all); i++) {
126
- descr = &adc_descr_all[i];
127
- if (descr->pool == nullptr ) {
128
- // Check if the first channel is connected to this ADC.
129
- PinName pin = (PinName) (adc_pins[0 ] | descr->pin_alt );
130
- instance = (ADCName) pinmap_peripheral (pin, PinMap_ADC);
133
+ for (size_t i=0 ; instance == ADC_NP && i<AN_ARRAY_SIZE (pin_alt); i++) {
134
+ // Calculate alternate function pin.
135
+ PinName pin = (PinName) (adc_pins[0 ] | pin_alt[i]); // First pin decides the ADC.
136
+
137
+ // Check if pin is mapped.
138
+ if (pinmap_find_peripheral (pin, PinMap_ADC) == NC) break ;
139
+
140
+ // Find the first free ADC according to the available ADCs on pin.
141
+ for (size_t j=0 ; instance == ADC_NP && j<AN_ARRAY_SIZE (adc_descr_all); j++) {
142
+ descr = &adc_descr_all[j];
143
+ if (descr->pool == nullptr && ((ADC_TypeDef*)pinmap_peripheral (pin, PinMap_ADC) == descr->adc .Instance )) {
144
+ instance = (ADCName) pinmap_peripheral (pin, PinMap_ADC);
145
+ adc_pins[0 ] = pin;
146
+ }
131
147
}
132
148
}
133
149
@@ -138,16 +154,27 @@ int AdvancedADC::begin(uint32_t resolution, uint32_t sample_rate, size_t n_sampl
138
154
}
139
155
140
156
// Configure ADC pins.
141
- for (size_t i=0 ; i<n_channels; i++) {
142
- // Set the alternate pin names for this ADC instance.
143
- adc_pins[i] = (PinName) (adc_pins[i] | descr->pin_alt );
144
- // All channels must share the same instance; if not, bail out
145
- if (instance != pinmap_peripheral (adc_pins[i], PinMap_ADC)) {
146
- return 0 ;
157
+ pinmap_pinout (adc_pins[0 ], PinMap_ADC);
158
+ uint8_t ch_init = 1 ;
159
+ for (size_t i=1 ; i<n_channels; i++) {
160
+ for (size_t j=0 ; j<AN_ARRAY_SIZE (pin_alt); j++) {
161
+ // Calculate alternate function pin.
162
+ PinName pin = (PinName) (adc_pins[i] | pin_alt[j]);
163
+ // Check if pin is mapped.
164
+ if (pinmap_find_peripheral (pin, PinMap_ADC) == NC) break ;
165
+ // Check if pin is connected to the selected ADC.
166
+ if (instance == pinmap_peripheral (pin, PinMap_ADC)) {
167
+ pinmap_pinout (pin, PinMap_ADC);
168
+ adc_pins[i] = pin;
169
+ ch_init++;
170
+ break ;
171
+ }
147
172
}
148
- pinmap_pinout (adc_pins[i], PinMap_ADC);
149
173
}
150
174
175
+ // All channels must share the same instance; if not, bail out.
176
+ if (ch_init < n_channels) return 0 ;
177
+
151
178
// Allocate DMA buffer pool.
152
179
descr->pool = new DMABufferPool<Sample>(n_samples, n_channels, n_buffers);
153
180
if (descr->pool == nullptr ) {
0 commit comments