Skip to content

Commit 26215fb

Browse files
committed
stm32 define guards to avoid unecessary crashing
1 parent e8f777e commit 26215fb

File tree

1 file changed

+92
-27
lines changed

1 file changed

+92
-27
lines changed

src/current_sense/hardware_specific/stm32/stm32_adc_utils.cpp

Lines changed: 92 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -179,48 +179,77 @@ uint32_t _getADCChannelFromPinMap(PinName pin)
179179
channel = ADC_CHANNEL_0;
180180
break;
181181
#endif
182+
#ifdef ADC_CHANNEL_1
182183
case 1:
183184
channel = ADC_CHANNEL_1;
184185
break;
186+
#endif
187+
#ifdef ADC_CHANNEL_2
185188
case 2:
186189
channel = ADC_CHANNEL_2;
187190
break;
191+
#endif
192+
#ifdef ADC_CHANNEL_3
188193
case 3:
189194
channel = ADC_CHANNEL_3;
190195
break;
196+
#endif
197+
#ifdef ADC_CHANNEL_4
191198
case 4:
192199
channel = ADC_CHANNEL_4;
193200
break;
201+
#endif
202+
#ifdef ADC_CHANNEL_5
194203
case 5:
195204
channel = ADC_CHANNEL_5;
196205
break;
206+
#endif
207+
#ifdef ADC_CHANNEL_6
197208
case 6:
198209
channel = ADC_CHANNEL_6;
199210
break;
211+
#endif
212+
#ifdef ADC_CHANNEL_7
200213
case 7:
201214
channel = ADC_CHANNEL_7;
202215
break;
216+
#endif
217+
#ifdef ADC_CHANNEL_8
203218
case 8:
204219
channel = ADC_CHANNEL_8;
205220
break;
221+
#endif
222+
#ifdef ADC_CHANNEL_9
206223
case 9:
207224
channel = ADC_CHANNEL_9;
208225
break;
226+
#endif
227+
#ifdef ADC_CHANNEL_10
209228
case 10:
210229
channel = ADC_CHANNEL_10;
211230
break;
231+
#endif
232+
#ifdef ADC_CHANNEL_11
212233
case 11:
213234
channel = ADC_CHANNEL_11;
214235
break;
236+
#endif
237+
#ifdef ADC_CHANNEL_12
215238
case 12:
216239
channel = ADC_CHANNEL_12;
217240
break;
241+
#endif
242+
#ifdef ADC_CHANNEL_13
218243
case 13:
219244
channel = ADC_CHANNEL_13;
220245
break;
246+
#endif
247+
#ifdef ADC_CHANNEL_14
221248
case 14:
222249
channel = ADC_CHANNEL_14;
223250
break;
251+
#endif
252+
#ifdef ADC_CHANNEL_15
224253
case 15:
225254
channel = ADC_CHANNEL_15;
226255
break;
@@ -246,43 +275,62 @@ uint32_t _getADCChannelFromPinMap(PinName pin)
246275
case 20:
247276
channel = ADC_CHANNEL_20;
248277
break;
278+
#endif
279+
#ifdef ADC_CHANNEL_21
249280
case 21:
250281
channel = ADC_CHANNEL_21;
251282
break;
283+
#endif
284+
#ifdef ADC_CHANNEL_22
252285
case 22:
253286
channel = ADC_CHANNEL_22;
254287
break;
288+
#endif
289+
#ifdef ADC_CHANNEL_23
255290
case 23:
256291
channel = ADC_CHANNEL_23;
257292
break;
258293
#ifdef ADC_CHANNEL_24
259294
case 24:
260295
channel = ADC_CHANNEL_24;
261296
break;
297+
#endif
298+
#ifdef ADC_CHANNEL_25
262299
case 25:
263300
channel = ADC_CHANNEL_25;
264301
break;
302+
#endif
303+
#ifdef ADC_CHANNEL_26
265304
case 26:
266305
channel = ADC_CHANNEL_26;
267306
break;
268307
#ifdef ADC_CHANNEL_27
269308
case 27:
270309
channel = ADC_CHANNEL_27;
271310
break;
311+
#endif
312+
#ifdef ADC_CHANNEL_28
272313
case 28:
273314
channel = ADC_CHANNEL_28;
274315
break;
316+
#endif
317+
#ifdef ADC_CHANNEL_29
275318
case 29:
276319
channel = ADC_CHANNEL_29;
277320
break;
321+
#endif
322+
#ifdef ADC_CHANNEL_30
278323
case 30:
279324
channel = ADC_CHANNEL_30;
280325
break;
326+
#endif
327+
#ifdef ADC_CHANNEL_31
281328
case 31:
282329
channel = ADC_CHANNEL_31;
283330
break;
284331
#endif
285332
#endif
333+
#endif
286334
#endif
287335
default:
288336
_Error_Handler("ADC: Unknown adc channel", (int)(STM_PIN_CHANNEL(function)));
@@ -322,18 +370,26 @@ uint32_t _getADCChannel(PinName pin, ADC_TypeDef *AdcHandle )
322370

323371
uint32_t _getADCInjectedRank(uint8_t ind){
324372
switch (ind) {
373+
#ifdef ADC_INJECTED_RANK_1
325374
case 0:
326375
return ADC_INJECTED_RANK_1;
327376
break;
377+
#endif
378+
#ifdef ADC_INJECTED_RANK_2
328379
case 1:
329380
return ADC_INJECTED_RANK_2;
330381
break;
382+
#endif
383+
#ifdef ADC_INJECTED_RANK_3
331384
case 2:
332385
return ADC_INJECTED_RANK_3;
333386
break;
387+
#endif
388+
#ifdef ADC_INJECTED_RANK_4
334389
case 3:
335390
return ADC_INJECTED_RANK_4;
336391
break;
392+
#endif
337393
default:
338394
return 0;
339395
break;
@@ -390,41 +446,50 @@ uint32_t _initTimerInterruptDownsampling(Stm32CurrentSenseParams* cs_params, STM
390446

391447
// returns 0 if no downsampling is needed, 1 if downsampling is needed, 2 if error
392448
uint8_t _handleInjectedConvCpltCallback(ADC_HandleTypeDef *AdcHandle, Stm32AdcInterruptConfig& adc_interrupt_config, uint32_t adc_val[4]) {
449+
#ifndef HAL_ADCEx_InjectedGetValue
450+
return 0; // error: function not available
451+
#else
393452

394-
// if the timer han't repetition counter - downsample two times
395-
if( adc_interrupt_config.needs_downsample && adc_interrupt_config.tim_downsample++ > 0) {
396-
adc_interrupt_config.tim_downsample = 0;
397-
return 1;
398-
}
399-
400-
adc_val[0]=HAL_ADCEx_InjectedGetValue(AdcHandle, ADC_INJECTED_RANK_1);
401-
adc_val[1]=HAL_ADCEx_InjectedGetValue(AdcHandle, ADC_INJECTED_RANK_2);
402-
adc_val[2]=HAL_ADCEx_InjectedGetValue(AdcHandle, ADC_INJECTED_RANK_3);
403-
adc_val[3]=HAL_ADCEx_InjectedGetValue(AdcHandle, ADC_INJECTED_RANK_4);
404-
405-
return 0; // no downsampling needed
453+
// if the timer han't repetition counter - downsample two times
454+
if( adc_interrupt_config.needs_downsample && adc_interrupt_config.tim_downsample++ > 0) {
455+
adc_interrupt_config.tim_downsample = 0;
456+
return 1;
457+
}
458+
459+
adc_val[0]=HAL_ADCEx_InjectedGetValue(AdcHandle, ADC_INJECTED_RANK_1);
460+
adc_val[1]=HAL_ADCEx_InjectedGetValue(AdcHandle, ADC_INJECTED_RANK_2);
461+
adc_val[2]=HAL_ADCEx_InjectedGetValue(AdcHandle, ADC_INJECTED_RANK_3);
462+
adc_val[3]=HAL_ADCEx_InjectedGetValue(AdcHandle, ADC_INJECTED_RANK_4);
463+
464+
return 0; // no downsampling needed
465+
#endif
406466
}
407467

408468
// reads the ADC injected voltage for the given pin
409469
// returns the voltage
410470
// if the pin is not found in the current sense parameters, returns 0
411471
float _readADCInjectedChannelVoltage(int pin, void* cs_params, Stm32AdcInterruptConfig& adc_interrupt_config, uint32_t adc_val[4]) {
412-
Stm32CurrentSenseParams* cs_p = (Stm32CurrentSenseParams*)cs_params;
413-
uint8_t channel_no = 0;
414-
uint8_t adc_index = (uint8_t)_adcToIndex(cs_p->adc_handle);
415-
for(int i=0; i < 3; i++){
416-
if( pin == cs_p->pins[i]){ // found in the buffer
417-
if (adc_interrupt_config.use_adc_interrupt){
418-
return adc_val[channel_no] * cs_p->adc_voltage_conv;
419-
}else{
420-
// an optimized way to go from i to the channel i=0 -> channel 1, i=1 -> channel 2, i=2 -> channel 3
421-
uint32_t channel = _getADCInjectedRank(channel_no);
422-
return HAL_ADCEx_InjectedGetValue(cs_p->adc_handle, channel) * cs_p->adc_voltage_conv;
472+
#ifndef HAL_ADCEx_InjectedGetValue
473+
return 0; // error: function not available
474+
#else
475+
476+
Stm32CurrentSenseParams* cs_p = (Stm32CurrentSenseParams*)cs_params;
477+
uint8_t channel_no = 0;
478+
uint8_t adc_index = (uint8_t)_adcToIndex(cs_p->adc_handle);
479+
for(int i=0; i < 3; i++){
480+
if( pin == cs_p->pins[i]){ // found in the buffer
481+
if (adc_interrupt_config.use_adc_interrupt){
482+
return adc_val[channel_no] * cs_p->adc_voltage_conv;
483+
}else{
484+
// an optimized way to go from i to the channel i=0 -> channel 1, i=1 -> channel 2, i=2 -> channel 3
485+
uint32_t channel = _getADCInjectedRank(channel_no);
486+
return HAL_ADCEx_InjectedGetValue(cs_p->adc_handle, channel) * cs_p->adc_voltage_conv;
487+
}
423488
}
424-
}
425-
if(_isset(cs_p->pins[i])) channel_no++;
426-
}
427-
return 0; // pin not found
489+
if(_isset(cs_p->pins[i])) channel_no++;
490+
}
491+
return 0; // pin not found
492+
#endif
428493
}
429494

430495
#endif

0 commit comments

Comments
 (0)