22
22
#include " AdvancedADC.h"
23
23
24
24
#define ADC_NP ((ADCName) NC)
25
+ #define ADC_PIN_ALT_MASK (uint32_t ) (ALT0 | ALT1 )
25
26
26
27
struct adc_descr_t {
27
28
ADC_HandleTypeDef adc;
@@ -33,7 +34,7 @@ struct adc_descr_t {
33
34
DMABuffer<Sample> *dmabuf[2 ];
34
35
};
35
36
36
- static uint32_t pin_alt [3 ] = {0 , ALT0, ALT1};
37
+ static uint32_t adc_pin_alt [3 ] = {0 , ALT0, ALT1};
37
38
38
39
static adc_descr_t adc_descr_all[3 ] = {
39
40
{{ADC1}, {DMA1_Stream1, {DMA_REQUEST_ADC1}}, DMA1_Stream1_IRQn, {TIM1}, ADC_EXTERNALTRIG_T1_TRGO,
@@ -124,25 +125,28 @@ int AdvancedADC::begin(uint32_t resolution, uint32_t sample_rate, size_t n_sampl
124
125
125
126
// Clear ALTx pin.
126
127
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
- }
128
+ adc_pins[i] = (PinName) (adc_pins[i] & ~(ADC_PIN_ALT_MASK));
130
129
}
131
130
132
131
// Find an ADC that can be used with these set of pins/channels.
133
- for (size_t i=0 ; instance == ADC_NP && i<AN_ARRAY_SIZE (pin_alt ); i++) {
132
+ for (size_t i=0 ; instance == ADC_NP && i<AN_ARRAY_SIZE (adc_pin_alt ); i++) {
134
133
// Calculate alternate function pin.
135
- PinName pin = (PinName) (adc_pins[0 ] | pin_alt [i]); // First pin decides the ADC.
134
+ PinName pin = (PinName) (adc_pins[0 ] | adc_pin_alt [i]); // First pin decides the ADC.
136
135
137
136
// Check if pin is mapped.
138
- if (pinmap_find_peripheral (pin, PinMap_ADC) == NC) break ;
137
+ if (pinmap_find_peripheral (pin, PinMap_ADC) == NC) {
138
+ break ;
139
+ }
139
140
140
141
// Find the first free ADC according to the available ADCs on pin.
141
142
for (size_t j=0 ; instance == ADC_NP && j<AN_ARRAY_SIZE (adc_descr_all); j++) {
142
143
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;
144
+ if (descr->pool == nullptr ) {
145
+ ADCName tmp_instance = (ADCName) pinmap_peripheral (pin, PinMap_ADC);
146
+ if (descr->adc .Instance == ((ADC_TypeDef*) tmp_instance)) {
147
+ instance = tmp_instance;
148
+ adc_pins[0 ] = pin;
149
+ }
146
150
}
147
151
}
148
152
}
@@ -157,11 +161,13 @@ int AdvancedADC::begin(uint32_t resolution, uint32_t sample_rate, size_t n_sampl
157
161
pinmap_pinout (adc_pins[0 ], PinMap_ADC);
158
162
uint8_t ch_init = 1 ;
159
163
for (size_t i=1 ; i<n_channels; i++) {
160
- for (size_t j=0 ; j<AN_ARRAY_SIZE (pin_alt ); j++) {
164
+ for (size_t j=0 ; j<AN_ARRAY_SIZE (adc_pin_alt ); j++) {
161
165
// Calculate alternate function pin.
162
- PinName pin = (PinName) (adc_pins[i] | pin_alt [j]);
166
+ PinName pin = (PinName) (adc_pins[i] | adc_pin_alt [j]);
163
167
// Check if pin is mapped.
164
- if (pinmap_find_peripheral (pin, PinMap_ADC) == NC) break ;
168
+ if (pinmap_find_peripheral (pin, PinMap_ADC) == NC) {
169
+ break ;
170
+ }
165
171
// Check if pin is connected to the selected ADC.
166
172
if (instance == pinmap_peripheral (pin, PinMap_ADC)) {
167
173
pinmap_pinout (pin, PinMap_ADC);
@@ -173,7 +179,9 @@ int AdvancedADC::begin(uint32_t resolution, uint32_t sample_rate, size_t n_sampl
173
179
}
174
180
175
181
// All channels must share the same instance; if not, bail out.
176
- if (ch_init < n_channels) return 0 ;
182
+ if (ch_init < n_channels) {
183
+ return 0 ;
184
+ }
177
185
178
186
// Allocate DMA buffer pool.
179
187
descr->pool = new DMABufferPool<Sample>(n_samples, n_channels, n_buffers);
@@ -184,21 +192,29 @@ int AdvancedADC::begin(uint32_t resolution, uint32_t sample_rate, size_t n_sampl
184
192
descr->dmabuf [1 ] = descr->pool ->allocate ();
185
193
186
194
// Init and config DMA.
187
- if (hal_dma_config (&descr->dma , descr->dma_irqn , DMA_PERIPH_TO_MEMORY) < 0 ) return 0 ;
195
+ if (hal_dma_config (&descr->dma , descr->dma_irqn , DMA_PERIPH_TO_MEMORY) < 0 ) {
196
+ return 0 ;
197
+ }
188
198
189
199
// Init and config ADC.
190
- if (hal_adc_config (&descr->adc , ADC_RES_LUT[resolution], descr->tim_trig , adc_pins, n_channels) < 0 ) return 0 ;
200
+ if (hal_adc_config (&descr->adc , ADC_RES_LUT[resolution], descr->tim_trig , adc_pins, n_channels) < 0 ) {
201
+ return 0 ;
202
+ }
191
203
192
204
// Link DMA handle to ADC handle, and start the ADC.
193
205
__HAL_LINKDMA (&descr->adc , DMA_Handle, descr->dma );
194
- if (HAL_ADC_Start_DMA (&descr->adc , (uint32_t *) descr->dmabuf [0 ]->data (), descr->dmabuf [0 ]->size ()) != HAL_OK) return 0 ;
206
+ if (HAL_ADC_Start_DMA (&descr->adc , (uint32_t *) descr->dmabuf [0 ]->data (), descr->dmabuf [0 ]->size ()) != HAL_OK) {
207
+ return 0 ;
208
+ }
195
209
196
210
// Re/enable DMA double buffer mode.
197
211
hal_dma_enable_dbm (&descr->dma , descr->dmabuf [0 ]->data (), descr->dmabuf [1 ]->data ());
198
212
199
213
// Init, config and start the ADC timer.
200
214
hal_tim_config (&descr->tim , sample_rate);
201
- if (HAL_TIM_Base_Start (&descr->tim ) != HAL_OK) return 0 ;
215
+ if (HAL_TIM_Base_Start (&descr->tim ) != HAL_OK) {
216
+ return 0 ;
217
+ }
202
218
203
219
return 1 ;
204
220
}
0 commit comments