Skip to content

Commit ccb3b48

Browse files
committed
allow stm32 to have any current sense pin as _NC
1 parent 9b1de23 commit ccb3b48

File tree

5 files changed

+60
-110
lines changed

5 files changed

+60
-110
lines changed

src/current_sense/hardware_specific/stm32/stm32f1/stm32f1_hal.cpp

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -122,24 +122,22 @@ int _adc_init(Stm32CurrentSenseParams* cs_params, const STM32DriverParams* drive
122122
#endif
123123
}
124124

125-
// first channel
126-
sConfigInjected.InjectedRank = ADC_REGULAR_RANK_1;
127-
sConfigInjected.InjectedChannel = STM_PIN_CHANNEL(pinmap_function(analogInputToPinName(cs_params->pins[0]), PinMap_ADC));
128-
HAL_ADCEx_InjectedConfigChannel(&hadc, &sConfigInjected);
129-
// second channel
130-
sConfigInjected.InjectedRank = ADC_REGULAR_RANK_2;
131-
sConfigInjected.InjectedChannel = STM_PIN_CHANNEL(pinmap_function(analogInputToPinName(cs_params->pins[1]), PinMap_ADC));
132-
HAL_ADCEx_InjectedConfigChannel(&hadc, &sConfigInjected);
133-
134-
// third channel - if exists
135-
if(_isset(cs_params->pins[2])){
136-
sConfigInjected.InjectedRank = ADC_REGULAR_RANK_3;
137-
sConfigInjected.InjectedChannel = STM_PIN_CHANNEL(pinmap_function(analogInputToPinName(cs_params->pins[2]), PinMap_ADC));
138-
HAL_ADCEx_InjectedConfigChannel(&hadc, &sConfigInjected);
125+
126+
127+
for(int i=0; i<3; i++){
128+
// skip if not set
129+
if (!_isset(cs_params->pins[i])) continue;
130+
131+
sConfigInjected.InjectedRank = ADC_REGULAR_RANK_1 + i;
132+
sConfigInjected.InjectedChannel = STM_PIN_CHANNEL(pinmap_function(analogInputToPinName(cs_params->pins[0]), PinMap_ADC));
133+
if (HAL_ADCEx_InjectedConfigChannel(&hadc, &sConfigInjected) != HAL_OK){
134+
#ifdef SIMPLEFOC_STM32_DEBUG
135+
SIMPLEFOC_DEBUG("STM32-CS: ERR: cannot init injected channel: ", (int)_getADCChannel(analogInputToPinName(cs_params->pins[0])) );
136+
#endif
137+
return -1;
138+
}
139139
}
140-
141140
cs_params->adc_handle = &hadc;
142-
143141
return 0;
144142
}
145143

src/current_sense/hardware_specific/stm32/stm32f4/stm32f4_hal.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ int _adc_init(Stm32CurrentSenseParams* cs_params, const STM32DriverParams* drive
127127
sConfigInjected.InjectedChannel = _getADCChannel(analogInputToPinName(cs_params->pins[i]));
128128
if (HAL_ADCEx_InjectedConfigChannel(&hadc, &sConfigInjected) != HAL_OK){
129129
#ifdef SIMPLEFOC_STM32_DEBUG
130-
SIMPLEFOC_DEBUG("STM32-CS: ERR: cannot init injected channel: ", (int)_getADCChannel(analogInputToPinName(cs_params->pins[0])) );
130+
SIMPLEFOC_DEBUG("STM32-CS: ERR: cannot init injected channel: ", (int)_getADCChannel(analogInputToPinName(cs_params->pins[i])) );
131131
#endif
132132
return -1;
133133
}

src/current_sense/hardware_specific/stm32/stm32f7/stm32f7_hal.cpp

Lines changed: 15 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,13 @@ int _adc_init(Stm32CurrentSenseParams* cs_params, const STM32DriverParams* drive
2222
ADC_InjectionConfTypeDef sConfigInjected;
2323

2424
// check if all pins belong to the same ADC
25-
ADC_TypeDef* adc_pin1 = (ADC_TypeDef*)pinmap_peripheral(analogInputToPinName(cs_params->pins[0]), PinMap_ADC);
26-
ADC_TypeDef* adc_pin2 = (ADC_TypeDef*)pinmap_peripheral(analogInputToPinName(cs_params->pins[1]), PinMap_ADC);
25+
ADC_TypeDef* adc_pin1 = _isset(cs_params->pins[0]) ? (ADC_TypeDef*)pinmap_peripheral(analogInputToPinName(cs_params->pins[0]), PinMap_ADC) : nullptr;
26+
ADC_TypeDef* adc_pin2 = _isset(cs_params->pins[1]) ? (ADC_TypeDef*)pinmap_peripheral(analogInputToPinName(cs_params->pins[1]), PinMap_ADC) : nullptr;
2727
ADC_TypeDef* adc_pin3 = _isset(cs_params->pins[2]) ? (ADC_TypeDef*)pinmap_peripheral(analogInputToPinName(cs_params->pins[2]), PinMap_ADC) : nullptr;
28-
if ( (adc_pin1 != adc_pin2) || ( (adc_pin3) && (adc_pin1 != adc_pin3) )){
28+
if ( ((adc_pin1 != adc_pin2) && (adc_pin1 && adc_pin2)) ||
29+
((adc_pin2 != adc_pin3) && (adc_pin2 && adc_pin3)) ||
30+
((adc_pin1 != adc_pin3) && (adc_pin1 && adc_pin3))
31+
){
2932
#ifdef SIMPLEFOC_STM32_DEBUG
3033
SIMPLEFOC_DEBUG("STM32-CS: ERR: Analog pins dont belong to the same ADC!");
3134
#endif
@@ -125,34 +128,16 @@ int _adc_init(Stm32CurrentSenseParams* cs_params, const STM32DriverParams* drive
125128
}
126129

127130

128-
// first channel
129-
sConfigInjected.InjectedRank = ADC_INJECTED_RANK_1;
130-
sConfigInjected.InjectedChannel = _getADCChannel(analogInputToPinName(cs_params->pins[0]));
131-
if (HAL_ADCEx_InjectedConfigChannel(&hadc, &sConfigInjected) != HAL_OK){
132-
#ifdef SIMPLEFOC_STM32_DEBUG
133-
SIMPLEFOC_DEBUG("STM32-CS: ERR: cannot init injected channel: ", (int)_getADCChannel(analogInputToPinName(cs_params->pins[0])) );
134-
#endif
135-
return -1;
136-
}
137-
138-
// second channel
139-
sConfigInjected.InjectedRank = ADC_INJECTED_RANK_2;
140-
sConfigInjected.InjectedChannel = _getADCChannel(analogInputToPinName(cs_params->pins[1]));
141-
if (HAL_ADCEx_InjectedConfigChannel(&hadc, &sConfigInjected) != HAL_OK){
142-
#ifdef SIMPLEFOC_STM32_DEBUG
143-
SIMPLEFOC_DEBUG("STM32-CS: ERR: cannot init injected channel: ", (int)_getADCChannel(analogInputToPinName(cs_params->pins[1]))) ;
144-
#endif
145-
return -1;
146-
}
147-
148-
// third channel - if exists
149-
if(_isset(cs_params->pins[2])){
150-
sConfigInjected.InjectedRank = ADC_INJECTED_RANK_3;
151-
sConfigInjected.InjectedChannel = _getADCChannel(analogInputToPinName(cs_params->pins[2]));
131+
for(int i=0; i<3; i++){
132+
// skip if not set
133+
if (!_isset(cs_params->pins[i])) continue;
134+
135+
sConfigInjected.InjectedRank = ADC_INJECTED_RANK_1 + i;
136+
sConfigInjected.InjectedChannel = _getADCChannel(analogInputToPinName(cs_params->pins[i]));
152137
if (HAL_ADCEx_InjectedConfigChannel(&hadc, &sConfigInjected) != HAL_OK){
153-
#ifdef SIMPLEFOC_STM32_DEBUG
154-
SIMPLEFOC_DEBUG("STM32-CS: ERR: cannot init injected channel: ", (int)_getADCChannel(analogInputToPinName(cs_params->pins[2]))) ;
155-
#endif
138+
#ifdef SIMPLEFOC_STM32_DEBUG
139+
SIMPLEFOC_DEBUG("STM32-CS: ERR: cannot init injected channel: ", (int)_getADCChannel(analogInputToPinName(cs_params->pins[i])) );
140+
#endif
156141
return -1;
157142
}
158143
}

src/current_sense/hardware_specific/stm32/stm32g4/stm32g4_hal.cpp

Lines changed: 15 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,13 @@ int _adc_init(Stm32CurrentSenseParams* cs_params, const STM32DriverParams* drive
2121
ADC_InjectionConfTypeDef sConfigInjected;
2222

2323
// check if all pins belong to the same ADC
24-
ADC_TypeDef* adc_pin1 = (ADC_TypeDef*)pinmap_peripheral(analogInputToPinName(cs_params->pins[0]), PinMap_ADC);
25-
ADC_TypeDef* adc_pin2 = (ADC_TypeDef*)pinmap_peripheral(analogInputToPinName(cs_params->pins[1]), PinMap_ADC);
24+
ADC_TypeDef* adc_pin1 = _isset(cs_params->pins[0]) ? (ADC_TypeDef*)pinmap_peripheral(analogInputToPinName(cs_params->pins[0]), PinMap_ADC) : nullptr;
25+
ADC_TypeDef* adc_pin2 = _isset(cs_params->pins[1]) ? (ADC_TypeDef*)pinmap_peripheral(analogInputToPinName(cs_params->pins[1]), PinMap_ADC) : nullptr;
2626
ADC_TypeDef* adc_pin3 = _isset(cs_params->pins[2]) ? (ADC_TypeDef*)pinmap_peripheral(analogInputToPinName(cs_params->pins[2]), PinMap_ADC) : nullptr;
27-
if ( (adc_pin1 != adc_pin2) || ( (adc_pin3) && (adc_pin1 != adc_pin3) )){
27+
if ( ((adc_pin1 != adc_pin2) && (adc_pin1 && adc_pin2)) ||
28+
((adc_pin2 != adc_pin3) && (adc_pin2 && adc_pin3)) ||
29+
((adc_pin1 != adc_pin3) && (adc_pin1 && adc_pin3))
30+
){
2831
#ifdef SIMPLEFOC_STM32_DEBUG
2932
SIMPLEFOC_DEBUG("STM32-CS: ERR: Analog pins dont belong to the same ADC!");
3033
#endif
@@ -167,38 +170,19 @@ int _adc_init(Stm32CurrentSenseParams* cs_params, const STM32DriverParams* drive
167170
}
168171

169172

170-
// first channel
171-
sConfigInjected.InjectedRank = ADC_INJECTED_RANK_1;
172-
sConfigInjected.InjectedChannel = _getADCChannel(analogInputToPinName(cs_params->pins[0]));
173-
if (HAL_ADCEx_InjectedConfigChannel(&hadc, &sConfigInjected) != HAL_OK){
174-
#ifdef SIMPLEFOC_STM32_DEBUG
175-
SIMPLEFOC_DEBUG("STM32-CS: ERR: cannot init injected channel: ", (int)_getADCChannel(analogInputToPinName(cs_params->pins[0])) );
176-
#endif
177-
return -1;
178-
}
179-
180-
// second channel
181-
sConfigInjected.InjectedRank = ADC_INJECTED_RANK_2;
182-
sConfigInjected.InjectedChannel = _getADCChannel(analogInputToPinName(cs_params->pins[1]));
183-
if (HAL_ADCEx_InjectedConfigChannel(&hadc, &sConfigInjected) != HAL_OK){
184-
#ifdef SIMPLEFOC_STM32_DEBUG
185-
SIMPLEFOC_DEBUG("STM32-CS: ERR: cannot init injected channel: ", (int)_getADCChannel(analogInputToPinName(cs_params->pins[1]))) ;
186-
#endif
187-
return -1;
188-
}
189-
190-
// third channel - if exists
191-
if(_isset(cs_params->pins[2])){
192-
sConfigInjected.InjectedRank = ADC_INJECTED_RANK_3;
193-
sConfigInjected.InjectedChannel = _getADCChannel(analogInputToPinName(cs_params->pins[2]));
173+
for(int i=0; i<3; i++){
174+
// skip if not set
175+
if (!_isset(cs_params->pins[i])) continue;
176+
177+
sConfigInjected.InjectedRank = ADC_INJECTED_RANK_1 + i;
178+
sConfigInjected.InjectedChannel = _getADCChannel(analogInputToPinName(cs_params->pins[i]));
194179
if (HAL_ADCEx_InjectedConfigChannel(&hadc, &sConfigInjected) != HAL_OK){
195-
#ifdef SIMPLEFOC_STM32_DEBUG
196-
SIMPLEFOC_DEBUG("STM32-CS: ERR: cannot init injected channel: ", (int)_getADCChannel(analogInputToPinName(cs_params->pins[2]))) ;
197-
#endif
180+
#ifdef SIMPLEFOC_STM32_DEBUG
181+
SIMPLEFOC_DEBUG("STM32-CS: ERR: cannot init injected channel: ", (int)_getADCChannel(analogInputToPinName(cs_params->pins[i])) );
182+
#endif
198183
return -1;
199184
}
200185
}
201-
202186
cs_params->adc_handle = &hadc;
203187
return 0;
204188
}

src/current_sense/hardware_specific/stm32/stm32l4/stm32l4_hal.cpp

Lines changed: 15 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,19 @@ int _adc_init(Stm32CurrentSenseParams* cs_params, const STM32DriverParams* drive
2121
ADC_InjectionConfTypeDef sConfigInjected;
2222

2323
// check if all pins belong to the same ADC
24-
ADC_TypeDef* adc_pin1 = (ADC_TypeDef*)pinmap_peripheral(analogInputToPinName(cs_params->pins[0]), PinMap_ADC);
25-
ADC_TypeDef* adc_pin2 = (ADC_TypeDef*)pinmap_peripheral(analogInputToPinName(cs_params->pins[1]), PinMap_ADC);
24+
ADC_TypeDef* adc_pin1 = _isset(cs_params->pins[0]) ? (ADC_TypeDef*)pinmap_peripheral(analogInputToPinName(cs_params->pins[0]), PinMap_ADC) : nullptr;
25+
ADC_TypeDef* adc_pin2 = _isset(cs_params->pins[1]) ? (ADC_TypeDef*)pinmap_peripheral(analogInputToPinName(cs_params->pins[1]), PinMap_ADC) : nullptr;
2626
ADC_TypeDef* adc_pin3 = _isset(cs_params->pins[2]) ? (ADC_TypeDef*)pinmap_peripheral(analogInputToPinName(cs_params->pins[2]), PinMap_ADC) : nullptr;
27-
if ( (adc_pin1 != adc_pin2) || ( (adc_pin3) && (adc_pin1 != adc_pin3) )){
27+
if ( ((adc_pin1 != adc_pin2) && (adc_pin1 && adc_pin2)) ||
28+
((adc_pin2 != adc_pin3) && (adc_pin2 && adc_pin3)) ||
29+
((adc_pin1 != adc_pin3) && (adc_pin1 && adc_pin3))
30+
){
2831
#ifdef SIMPLEFOC_STM32_DEBUG
2932
SIMPLEFOC_DEBUG("STM32-CS: ERR: Analog pins dont belong to the same ADC!");
3033
#endif
3134
return -1;
3235
}
3336

34-
3537
/**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
3638
*/
3739
hadc.Instance = (ADC_TypeDef *)pinmap_peripheral(analogInputToPinName(cs_params->pins[0]), PinMap_ADC);
@@ -166,38 +168,19 @@ int _adc_init(Stm32CurrentSenseParams* cs_params, const STM32DriverParams* drive
166168
}
167169

168170

169-
// first channel
170-
sConfigInjected.InjectedRank = ADC_INJECTED_RANK_1;
171-
sConfigInjected.InjectedChannel = _getADCChannel(analogInputToPinName(cs_params->pins[0]));
172-
if (HAL_ADCEx_InjectedConfigChannel(&hadc, &sConfigInjected) != HAL_OK){
173-
#ifdef SIMPLEFOC_STM32_DEBUG
174-
SIMPLEFOC_DEBUG("STM32-CS: ERR: cannot init injected channel: ", (int)_getADCChannel(analogInputToPinName(cs_params->pins[0])) );
175-
#endif
176-
return -1;
177-
}
178-
179-
// second channel
180-
sConfigInjected.InjectedRank = ADC_INJECTED_RANK_2;
181-
sConfigInjected.InjectedChannel = _getADCChannel(analogInputToPinName(cs_params->pins[1]));
182-
if (HAL_ADCEx_InjectedConfigChannel(&hadc, &sConfigInjected) != HAL_OK){
183-
#ifdef SIMPLEFOC_STM32_DEBUG
184-
SIMPLEFOC_DEBUG("STM32-CS: ERR: cannot init injected channel: ", (int)_getADCChannel(analogInputToPinName(cs_params->pins[1]))) ;
185-
#endif
186-
return -1;
187-
}
188-
189-
// third channel - if exists
190-
if(_isset(cs_params->pins[2])){
191-
sConfigInjected.InjectedRank = ADC_INJECTED_RANK_3;
192-
sConfigInjected.InjectedChannel = _getADCChannel(analogInputToPinName(cs_params->pins[2]));
171+
for(int i=0; i<3; i++){
172+
// skip if not set
173+
if (!_isset(cs_params->pins[i])) continue;
174+
175+
sConfigInjected.InjectedRank = ADC_INJECTED_RANK_1 + i;
176+
sConfigInjected.InjectedChannel = _getADCChannel(analogInputToPinName(cs_params->pins[i]));
193177
if (HAL_ADCEx_InjectedConfigChannel(&hadc, &sConfigInjected) != HAL_OK){
194-
#ifdef SIMPLEFOC_STM32_DEBUG
195-
SIMPLEFOC_DEBUG("STM32-CS: ERR: cannot init injected channel: ", (int)_getADCChannel(analogInputToPinName(cs_params->pins[2]))) ;
196-
#endif
178+
#ifdef SIMPLEFOC_STM32_DEBUG
179+
SIMPLEFOC_DEBUG("STM32-CS: ERR: cannot init injected channel: ", (int)_getADCChannel(analogInputToPinName(cs_params->pins[i])) );
180+
#endif
197181
return -1;
198182
}
199183
}
200-
201184
cs_params->adc_handle = &hadc;
202185
return 0;
203186
}

0 commit comments

Comments
 (0)