7
7
// here I've assumed the maximum number of ADCs is 5
8
8
#define ADC_COUNT 5
9
9
10
+
11
+
12
+ int _adcToIndex (ADC_TypeDef *AdcHandle){
13
+ if (AdcHandle == ADC1) return 0 ;
14
+ #ifdef ADC2 // if ADC2 exists
15
+ else if (AdcHandle == ADC2) return 1 ;
16
+ #endif
17
+ #ifdef ADC3 // if ADC3 exists
18
+ else if (AdcHandle == ADC3) return 2 ;
19
+ #endif
20
+ #ifdef ADC4 // if ADC4 exists
21
+ else if (AdcHandle == ADC4) return 3 ;
22
+ #endif
23
+ #ifdef ADC5 // if ADC5 exists
24
+ else if (AdcHandle == ADC5) return 4 ;
25
+ #endif
26
+ return 0 ;
27
+ }
28
+ int _adcToIndex (ADC_HandleTypeDef *AdcHandle){
29
+ return _adcToIndex (AdcHandle->Instance );
30
+ }
31
+
32
+
33
+ ADC_TypeDef* _indexToADC (uint8_t index){
34
+ switch (index) {
35
+ case 0 :
36
+ return ADC1;
37
+ break ;
38
+ #ifdef ADC2 // if ADC2 exists
39
+ case 1 :
40
+ return ADC2;
41
+ break ;
42
+ #endif
43
+ #ifdef ADC3 // if ADC3 exists
44
+ case 2 :
45
+ return ADC3;
46
+ break ;
47
+ #endif
48
+ #ifdef ADC4 // if ADC4 exists
49
+ case 3 :
50
+ return ADC4;
51
+ break ;
52
+ #endif
53
+ #ifdef ADC5 // if ADC5 exists
54
+ case 4 :
55
+ return ADC5;
56
+ break ;
57
+ #endif
58
+ }
59
+ return nullptr ;
60
+ }
61
+
62
+ int _findIndexOfEntry (PinName pin) {
63
+ // remove the ALT if it is there
64
+ PinName pinName = (PinName)(pinName & ~ALTX_MASK);
65
+ int i = 0 ;
66
+ SIMPLEFOC_DEBUG (" STM32-CS: Looking for pin " );
67
+ while (PinMap_ADC[i].pin !=NC) {
68
+ if (pinName == PinMap_ADC[i].pin )
69
+ return i;
70
+ i++;
71
+ SIMPLEFOC_DEBUG (" STM32-CS: Looking for pin " , i);
72
+ }
73
+ return -1 ;
74
+ }
75
+
76
+ int _findIndexOfLastEntry (PinName pin) {
77
+ // remove the ALT if it is there
78
+ PinName pinName = (PinName)(pin & ~ALTX_MASK);
79
+
80
+ int i = 0 ;
81
+ while (PinMap_ADC[i].pin !=NC) {
82
+ if ( pinName == (PinMap_ADC[i].pin & ~ALTX_MASK)
83
+ && pinName != (PinMap_ADC[i+1 ].pin & ~ALTX_MASK))
84
+ return i;
85
+ i++;
86
+ }
87
+ return -1 ;
88
+ }
89
+ int _findIndexOfFirstEntry (PinName pin) {
90
+ // remove the ALT if it is there
91
+ PinName pinName = (PinName)(pin & ~ALTX_MASK);
92
+ int i = 0 ;
93
+ while (PinMap_ADC[i].pin !=NC) {
94
+ if (pinName == PinMap_ADC[i].pin )
95
+ return i;
96
+ i++;
97
+ }
98
+ return -1 ;
99
+ }
100
+
101
+ // functions finding the index of the first pin entry in the PinMap_ADC
102
+ // returns -1 if not found
103
+ int _findIndexOfFirstPinMapADCEntry (int pin) {
104
+ PinName pinName = digitalPinToPinName (pin);
105
+ // remove the ALT if it is there
106
+ return _findIndexOfFirstEntry (pinName);
107
+ }
108
+
109
+ // functions finding the index of the last pin entry in the PinMap_ADC
110
+ // returns -1 if not found
111
+ int _findIndexOfLastPinMapADCEntry (int pin) {
112
+ PinName pinName = digitalPinToPinName (pin);
113
+ // remove the ALT if it is there
114
+ return _findIndexOfLastEntry (pinName);
115
+ }
116
+
117
+ // find the best ADC combination for the given pins
118
+ // returns the index of the best ADC
119
+ // each pin can be connected to multiple ADCs
120
+ // the function will try to find a single ADC that can be used for all pins
121
+ // if not possible it will return nullptr
122
+ ADC_TypeDef* _findBestADCForPins (int numPins, int pins[]) {
123
+
124
+ // assuning that there is less than 8 ADCs
125
+ uint8_t pins_at_adc[ADC_COUNT] = {0 };
126
+
127
+ // check how many pins are there and are not set
128
+ int no_pins = 0 ;
129
+ for (int i = 0 ; i < numPins; i++) {
130
+ if (_isset (pins[i])) no_pins++;
131
+ }
132
+
133
+ // loop over all elements and count the pins connected to each ADC
134
+ for (int i = 0 ; i < numPins; i++) {
135
+ int pin = pins[i];
136
+ if (!_isset (pin)) continue ;
137
+
138
+ int index = _findIndexOfFirstPinMapADCEntry (pin);
139
+ int last_index = _findIndexOfLastPinMapADCEntry (pin);
140
+ if (index == -1 ) {
141
+ return nullptr ;
142
+ }
143
+ for (int j = index; j <= last_index; j++) {
144
+ if (PinMap_ADC[j].pin == NC) {
145
+ break ;
146
+ }
147
+ int adcIndex = _adcToIndex ((ADC_TypeDef*)PinMap_ADC[j].peripheral );
148
+ pins_at_adc[adcIndex]++;
149
+ }
150
+ }
151
+
152
+ for (int i = 0 ; i < ADC_COUNT; i++) {
153
+ if (!pins_at_adc[i]) continue ;
154
+ SimpleFOCDebug::print (" STM32-CS: ADC" );
155
+ SimpleFOCDebug::print (i+1 );
156
+ SimpleFOCDebug::print (" pins: " );
157
+ SimpleFOCDebug::println (pins_at_adc[i]);
158
+ }
159
+
160
+ // now take the first ADC that has all pins connected
161
+ for (int i = 0 ; i < ADC_COUNT; i++) {
162
+ if (pins_at_adc[i] == no_pins) {
163
+ return _indexToADC (i);
164
+ }
165
+ }
166
+ return nullptr ;
167
+ }
168
+
169
+
170
+
10
171
/* *
11
172
* @brief Return ADC HAL channel linked to a PinName
12
173
* @param pin: PinName
13
174
* @retval Valid HAL channel
14
175
*/
15
- uint32_t _getADCChannel (PinName pin)
176
+ uint32_t _getADCChannelFromPinMap (PinName pin)
16
177
{
17
178
uint32_t function = pinmap_function (pin, PinMap_ADC);
18
179
uint32_t channel = 0 ;
@@ -134,135 +295,60 @@ uint32_t _getADCChannel(PinName pin)
134
295
return channel;
135
296
}
136
297
298
+ /* *
299
+ * @brief Return ADC HAL channel linked to a PinName and the ADC handle
300
+ * @param pin: PinName
301
+ * @param AdcHandle: ADC_HandleTypeDef a pointer to the ADC handle
302
+ * @retval Valid HAL channel
303
+ */
304
+ uint32_t _getADCChannel (PinName pin, ADC_TypeDef *AdcHandle )
305
+ {
306
+ if (AdcHandle == NP) {
307
+ return _getADCChannelFromPinMap (pin);
308
+ }
309
+ // find the PinName that corresponds to the ADC
310
+ int first_ind = _findIndexOfFirstEntry (pin);
311
+ int last_ind = _findIndexOfLastEntry (pin);
312
+ if (first_ind == -1 || last_ind == -1 ) {
313
+ _Error_Handler (" ADC: Pin not found in PinMap_ADC" , (int )pin);
314
+ }
315
+ // find the channel
316
+ uint32_t channel = 0 ;
317
+ for (int i = first_ind; i <= last_ind; i++) {
318
+ if (PinMap_ADC[i].peripheral == AdcHandle) {
319
+ channel =_getADCChannelFromPinMap (PinMap_ADC[i].pin );
137
320
138
- int _adcToIndex (ADC_TypeDef *AdcHandle){
139
- if (AdcHandle == ADC1) return 0 ;
140
- #ifdef ADC2 // if ADC2 exists
141
- else if (AdcHandle == ADC2) return 1 ;
142
- #endif
143
- #ifdef ADC3 // if ADC3 exists
144
- else if (AdcHandle == ADC3) return 2 ;
145
- #endif
146
- #ifdef ADC4 // if ADC4 exists
147
- else if (AdcHandle == ADC4) return 3 ;
148
- #endif
149
- #ifdef ADC5 // if ADC5 exists
150
- else if (AdcHandle == ADC5) return 4 ;
151
- #endif
152
- return 0 ;
153
- }
154
- int _adcToIndex (ADC_HandleTypeDef *AdcHandle){
155
- return _adcToIndex (AdcHandle->Instance );
156
- }
321
+ // #ifdef SIMPLEFOC_STM32_DEBUG
322
+ SimpleFOCDebug::print (" STM32-CS: Configuring ADC" );
323
+ SimpleFOCDebug::print (_adcToIndex (AdcHandle)+1 );
324
+ SimpleFOCDebug::print (" channel: " );
325
+ SimpleFOCDebug::println ((int )STM_PIN_CHANNEL (pinmap_function (PinMap_ADC[i].pin , PinMap_ADC)));
326
+ // #endif
157
327
328
+ break ;
329
+ }
330
+ }
331
+ return channel;
332
+ }
158
333
159
- ADC_TypeDef* _indexToADC (uint8_t index ){
160
- switch (index ) {
334
+ uint32_t _getADCInjectedRank (uint8_t ind ){
335
+ switch (ind ) {
161
336
case 0 :
162
- return ADC1 ;
337
+ return ADC_INJECTED_RANK_1 ;
163
338
break ;
164
- #ifdef ADC2 // if ADC2 exists
165
339
case 1 :
166
- return ADC2 ;
340
+ return ADC_INJECTED_RANK_2 ;
167
341
break ;
168
- #endif
169
- #ifdef ADC3 // if ADC3 exists
170
342
case 2 :
171
- return ADC3 ;
343
+ return ADC_INJECTED_RANK_3 ;
172
344
break ;
173
- #endif
174
- #ifdef ADC4 // if ADC4 exists
175
345
case 3 :
176
- return ADC4 ;
346
+ return ADC_INJECTED_RANK_4 ;
177
347
break ;
178
- #endif
179
- #ifdef ADC5 // if ADC5 exists
180
- case 4 :
181
- return ADC5;
348
+ default :
349
+ return 0 ;
182
350
break ;
183
- #endif
184
- }
185
- return nullptr ;
186
- }
187
-
188
-
189
- // functions finding the index of the first pin entry in the PinMap_ADC
190
- // returns -1 if not found
191
- int _findIndexOfFirstPinMapADCEntry (int pin) {
192
- PinName pinName = digitalPinToPinName (pin);
193
- int i = 0 ;
194
- while ((PinMap_ADC[i].pin & ~ALTX_MASK) !=NC) {
195
- if (pinName == (PinMap_ADC[i].pin & ~ALTX_MASK))
196
- return i;
197
- i++;
198
351
}
199
- return -1 ;
200
- }
201
-
202
- // functions finding the index of the last pin entry in the PinMap_ADC
203
- // returns -1 if not found
204
- int _findIndexOfLastPinMapADCEntry (int pin) {
205
- PinName pinName = digitalPinToPinName (pin);
206
- int i = 0 ;
207
- while (PinMap_ADC[i].pin !=NC) {
208
- if ( pinName == (PinMap_ADC[i].pin & ~ALTX_MASK)
209
- && pinName != (PinMap_ADC[i+1 ].pin & ~ALTX_MASK))
210
- return i;
211
- i++;
212
- }
213
- return -1 ;
214
- }
215
-
216
- // find the best ADC combination for the given pins
217
- // returns the index of the best ADC
218
- // each pin can be connected to multiple ADCs
219
- // the function will try to find a single ADC that can be used for all pins
220
- // if not possible it will return nullptr
221
- ADC_TypeDef* _findBestADCForPins (int numPins, int pins[]) {
222
-
223
- // assuning that there is less than 8 ADCs
224
- uint8_t pins_at_adc[ADC_COUNT] = {0 };
225
-
226
- // check how many pins are there and are not set
227
- int no_pins = 0 ;
228
- for (int i = 0 ; i < numPins; i++) {
229
- if (_isset (pins[i])) no_pins++;
230
- }
231
-
232
- // loop over all elements and count the pins connected to each ADC
233
- for (int i = 0 ; i < numPins; i++) {
234
- int pin = pins[i];
235
- if (!_isset (pin)) continue ;
236
-
237
- int index = _findIndexOfFirstPinMapADCEntry (pin);
238
- int last_index = _findIndexOfLastPinMapADCEntry (pin);
239
- if (index == -1 ) {
240
- return nullptr ;
241
- }
242
- for (int j = index; j <= last_index; j++) {
243
- if (PinMap_ADC[j].pin == NC) {
244
- break ;
245
- }
246
- int adcIndex = _adcToIndex ((ADC_TypeDef*)PinMap_ADC[j].peripheral );
247
- pins_at_adc[adcIndex]++;
248
- }
249
- }
250
-
251
- for (int i = 0 ; i < ADC_COUNT; i++) {
252
- if (!pins_at_adc[i]) continue ;
253
- SimpleFOCDebug::print (" STM32-CS: ADC" );
254
- SimpleFOCDebug::print (i+1 );
255
- SimpleFOCDebug::print (" pins: " );
256
- SimpleFOCDebug::println (pins_at_adc[i]);
257
- }
258
-
259
- // now take the first ADC that has all pins connected
260
- for (int i = 0 ; i < ADC_COUNT; i++) {
261
- if (pins_at_adc[i] == no_pins) {
262
- return _indexToADC (i);
263
- }
264
- }
265
- return nullptr ;
266
352
}
267
353
268
354
#endif
0 commit comments