Ошибки компиляции в ядре STM32 при создании нового проекта

Всем доброго времени суток. Для начала скажу, что я довольно плохо разбираюсь во всём, что связано с микропроцессорами и встраиваемыми системами, так что я надеюсь, что моё энциклопедическое невежество не слишком вас разочаровывает.

Я работаю над созданием своего первого сервопривода на основе BLDC и ресурсов проекта SimpleFOC. Моя первоначальная конфигурация была следующей:

  • двигатель: 12T14P на основе статора 401012P и ротора выполненного по сборке Halbach
  • датчик: AS5600
  • плата драйвера: SimpleFOCPowerShield
  • процессор: STM32F411CEU6, STM32F401CCU6

До этого были пробные эксперименты управления двигателем типа 5010 на 600W на процессоре ESP32, но там были проблемы с определением тока.

Для прошивки процессора STM32 решил перейти на PIO и с ходу же возникли проблемы с компилированием “голого” проекта. При компиляции в файле “stm32_mcu.cpp” не определены “PinMap_TIM” и “~ALTX_MASK”.

Вот код ошибки:

.pio\libdeps\genericSTM32F411CE\Arduino-FOC\src\drivers\hardware_specific\stm32\stm32_mcu.cpp:9:49: note: #pragma message: SimpleFOC: compiling for STM32
9 | #pragma message(“SimpleFOC: compiling for STM32”)
| ^
.pio\libdeps\genericSTM32F411CE\Arduino-FOC\src\drivers\hardware_specific\stm32\stm32_mcu.cpp: In function ‘int findIndexOfFirstPinMapEntry(int)’:
.pio\libdeps\genericSTM32F411CE\Arduino-FOC\src\drivers\hardware_specific\stm32\stm32_mcu.cpp:673:10: error: ‘PinMap_TIM’ was not declared in this scope; did you mean ‘PinMap_PWM’?
673 | while (PinMap_TIM[i].pin!=NC) {
| ^~~~~~~~~~
| PinMap_PWM
.pio\libdeps\genericSTM32F411CE\Arduino-FOC\src\drivers\hardware_specific\stm32\stm32_mcu.cpp: In function ‘int findIndexOfLastPinMapEntry(int)’:
.pio\libdeps\genericSTM32F411CE\Arduino-FOC\src\drivers\hardware_specific\stm32\stm32_mcu.cpp:685:10: error: ‘PinMap_TIM’ was not declared in this scope; did you mean ‘PinMap_PWM’?
685 | while (PinMap_TIM[i].pin!=NC) {
| ^~~~~~~~~~
| PinMap_PWM
Compiling .pio\build\genericSTM32F411CE\libb09\Arduino-FOC\sensors\MagneticSensorAnalog.cpp.o
.pio\libdeps\genericSTM32F411CE\Arduino-FOC\src\drivers\hardware_specific\stm32\stm32_mcu.cpp:686:45: error: ‘ALTX_MASK’ was not declared in this scope
686 | if ( pinName == (PinMap_TIM[i].pin & ~ALTX_MASK)
| ^~~~~~~~~
.pio\libdeps\genericSTM32F411CE\Arduino-FOC\src\drivers\hardware_specific\stm32\stm32_mcu.cpp: In function ‘int findBestTimerCombination(int, int, int*, PinMap**)’:
.pio\libdeps\genericSTM32F411CE\Arduino-FOC\src\drivers\hardware_specific\stm32\stm32_mcu.cpp:713:36: error: ‘PinMap_TIM’ was not declared in this scope; did you mean ‘PinMap_PWM’?
713 | searchArray[index] = (PinMap*)&PinMap_TIM[i];
| ^~~~~~~~~~
| PinMap_PWM
*** [.pio\build\genericSTM32F411CE\libb09\Arduino-FOC\drivers\hardware_specific\stm32\stm32_mcu.cpp.o] Error 1

Код из файла:

int findIndexOfFirstPinMapEntry(int pin) {
PinName pinName = digitalPinToPinName(pin);
int i = 0;
while (PinMap_TIM[i].pin!=NC) {
if (pinName == PinMap_TIM[i].pin)
return i;
i++;
}
return -1;
}

int findIndexOfLastPinMapEntry(int pin) {
PinName pinName = digitalPinToPinName(pin);
int i = 0;
while (PinMap_TIM[i].pin!=NC) {
if ( pinName == (PinMap_TIM[i].pin & ~ALTX_MASK)
&& pinName != (PinMap_TIM[i+1].pin & ~ALTX_MASK))
return i;
i++;
}
return -1;
}

#define NOT_FOUND 1000

int findBestTimerCombination(int numPins, int index, int pins, PinMap* pinTimers) {
PinMap* searchArray[numPins];
for (int j=0;j<numPins;j++)
searchArray[j] = pinTimers[j];
int bestScore = NOT_FOUND;
int startIndex = findIndexOfFirstPinMapEntry(pins[index]);
int endIndex = findIndexOfLastPinMapEntry(pins[index]);
if (startIndex == -1 || endIndex == -1) {
SIMPLEFOC_DEBUG("STM32-DRV: ERR: no timer on pin ", pins[index]);
return -1; // pin is not connected to any timer
}
for (int i=startIndex;i<=endIndex;i++) {
searchArray[index] = (PinMap*)&PinMap_TIM[i];
int score = NOT_FOUND;
if (index<numPins-1)
score = findBestTimerCombination(numPins, index+1, pins, searchArray);
else {
score = scoreCombination(numPins, searchArray);
#ifdef SIMPLEFOC_STM32_DEBUG
printTimerCombination(numPins, searchArray, score);
#endif
}
if (score==-1)
return -1; // pin not connected to any timer, propagate driectly
if (score>=0 && score<bestScore) {
bestScore = score;
for (int j=index;j<numPins;j++)
pinTimers[j] = searchArray[j];
}
}
return bestScore;
}

Знает ли кто-то как это исправить?

Вам больше повезет, если вы попросите объяснить гравицап Кин-Дза-Дза.

Я не говорю по-русски, поэтому все, что я набираю, проходит через онлайн-переводчик.

Не могли бы вы опубликовать скриншот вкладки «Инструменты» или того, что является русским эквивалентом в вашей Arduino IDE.
Единственное, что я могу предположить, это то, что вы допустили там ошибку. Я уже компилировал для blackpill, и у него те же процессоры, что и у вас.

Также было бы полезно опубликовать минимальный код, вызывающий эту ошибку.

В принципе переводчик на 90-95% справляется со своей задачей корректно и текс вполне себе понятен, поэтому можете писать сразу на удобном вам языке.

I thought you were using the Arduino IDE. My bad.

I found a person with a similar error on a different project but they were using the arduino IDE. They had the wrong version of STM32duino.
I’m not terribly familiar with platformio unfortunately so I can’t help much more than that. The most I can tell you is to make sure you are using the right core for it and up to date.

You’re missing the option lib_archive = false in platformio.ini

And it looks like either your stm32duino platform is very old or you’re using the wrong platform - SimpleFOC only works with stm32duino and not maple core.

PinMap_PWM has been replaced with PinMap_TIM in stm32duino platform. Make sure your platform is up to date…