В этой статье рассмотрю возможность установки Marlin на blue pill stm32f103cbt6. Это позволяет сделать очень дешевые и компактные платы управления 3D принтером. Стоимость голубой таблетки 120-150р. и при желании драйвера шаговых двигателей можно припаять к ней даже проводами, а нагрев стола и хотенда выполнять при помощи модуля для ардуино, состоящего их мосфета с обвязкой.
Я же для принтера QUBOID делал плату расширения QUBOID SHIELD, которую я описывал здесь Самые дешевые 32 бита для 3D принтера. Схема и печатная плата. Изготовление платы я заказывал в Китае, так как было лень заниматься этим дома, да и подходящего куска текстолита у меня не было.
А схему подключения периферии мною описана здесь: Как подключить принтер к плате QUBOID SHIELD.
Сам marlin на голубой таблетке запускается при помощи проекта Morpheus-STM32.
Теперь о настройке прошивки. Я использовал последнюю версию Marlin 2.0 на GitHub . В принципе можете скачать уже настроенную версию марлина со всеми правками, ссылка в конце статьи.
Сам проект собирается в VC Code с установленным Platformio. Как это сделать читайте здесь Установка platformio в Visual Studio Code., там ничего сложного нет. После прошивки потребуется залить прошивку в плату, как это сделать я описывал здесь Как и чем прошить STM32 STM32F103C8T6 на примере blue pill.
Ну а теперь сами настройки Marlin.
Вначале я расскажу как настроить прошивку с нуля. Если не хотите возиться с этим, можете скачать архив вконце статьи с внесенными правками, и останется только настроить ваш тип кинематики, ускорения и т.д. Не нужно будет возитья с настройками, для запуска платы. Ну а для любителей покопаться текст ниже.
После распаковки исходников, в них нужно подменить несколько файлов. Все файлы в конце статьи.
Первое, это файл с настройками под плату pins_MORPHEUS.h. В этом файле прописаны пины blue pill, какой для чего используется на плате. Если у вас своя разводка платы, отличная от моей, то пропустите этот шаг и настраивайте файл по своему.
Второе, это файл platformio.ini, в Marlin е этот файл есть, но его стоит заменить, для правильной компиляции.
Дальше настраивается сама прошивка для работы с голубой таблеткой.
Configuration.h
Включаем Morpheus (blue pill) #define MOTHERBOARD 1806 — MOTHERBOARD 1806 это название платы Morpheus.
135 #ifndef MOTHERBOARD
136 #define MOTHERBOARD 1806
137 #endif
А дальше настраиваете железо, которое собираетесь подключать к плате. Для использования дисплея раскомментировать указанные строки в Configuration.h и в pins_MORPHEUS.h
Для дисплея MKS MINI 12864
Configuration.h:
1500 #define SDSUPPORT
1816 #define MKS_MINI_12864
pins_MORPHEUS.h:
106 #define DOGLCD_CS PA3
107 #define DOGLCD_A0 PB10
Для дисплея RepRapDiscount Smart Controller
Configuration.h:
1500 #define SDSUPPORT
1603 #define REPRAP_DISCOUNT_SMART_CONTROLLER
pins_MORPHEUS.h:
97 #define LCD_PINS_RS PB12
98 #define LCD_PINS_ENABLE PB13
99 #define LCD_PINS_D4 PB14
100 #define LCD_PINS_D5 PA3
101 #define LCD_PINS_D6 PB10
102 #define LCD_PINS_D7 PB11
Для дисплея OLED SSD1306 (0.96)
По умолчанию в прошивке стоит использовать I2C номер один, необходимо перебросить на второй.
файле Wire.cpp <Системный диск>:\Users\<Пользователь>/.platformio/packages/framework-arduinoststm32/STM32F1/libraries/Wire
заменить TwoWire Wire(1); на TwoWire Wire(2);
Но если в вашей версии платы используется первый контроллер, то менять ничего не нужно. Для моей же платы это необходимо.
Configuration.h:
1500 #define SDSUPPORT
1619 #define ULTIPANEL
1790 #define U8GLIB_SSD1306
Для дисплея (платы управления) MKS TFT
Configuration.h
Это не дисплей, а плата управления, и она работает с голубой таблеткой, как работал бы компьютер (внешний контроллер с дисплеем, флешкой и т.д.). Общение происходит по протоколу UART , а плата использует контроллер USART3, его необходимо активировать, но при его активации обязательно отключать SD карту и поддержку дисплея OLED SSD1306, если он был включен ранее, иначе получите ошибку при компиляции:
116 #define SERIAL_PORT_2 3
117 #define NUM_SERIAL 2
Теперь нужно донастроить кое какую переферию.
Для того что бы заработал ШИМ на нагреватели и вентиллятор обдува детали, необходимо:
В файле HAL_timers_Stm32f1.h в папке \Marlin\src\HAL\HAL_STM32F1\
исправить
58 #define TEMP_TIMER_NUM 2 // index of timer to use for temperature
на
58 #define TEMP_TIMER_NUM 1 // index of timer to use for temperature
Пины PB3, PB4, PA15 в моей плате управляют драйверами, но по умолчанию в проекте заняты JTAGом, поэтому его нужно отключить, чтобы задействовать эти пины для управления драйвером ШД.
Для этого в файле
<Системный диск>:\Users\<Пользователь>/.platformio/packages/framework-arduinoststm32/STM32F1/variantsgeneric_stm32f103c/board.cpp
Заменить строку
#ifndef CONFIG_MAPLE_MINI_NO_DISABLE_DEBUG
на
#ifdef CONFIG_MAPLE_MINI_NO_DISABLE_DEBUG
а в файле
<Системный диск>:\Users\<Пользователь>/.platformio/packages/framework-arduinoststm32/STM32F1/system/libmaple/stm32f1/include/series/gpio.h
заменить строку:
AFIO_DEBUG_NONE = AFIO_MAPR_SWJ_CFG_NO_JTAG_NO_SW
на:
AFIO_DEBUG_NONE = AFIO_MAPR_SWJ_CFG_NO_JTAG_SW
На этом настройка прошивки закончена, и в зависимости от конфигурации и используемого дисплея, может не хватить памяти. Например при использовании MKS TFT с управлением по UART, ничего больше делать не нужно, если использовать OLED дисплей, то в памяти нужно будет еще хранить все графические отображения символов и букв, а это сильно кушает память. Если памяти не хватило, то можно отключить что то «не очень важное»
в файле Marlim/ Configuration_adv.h можно отключить поддержку G2/G3 Arc Support
Для этого всего лишь нужно закомментировав строку:
#define ARC_SUPPORT
Ну а теперь более легкий способ, если вы собираетесь использовать мою плату, либо RABPS, с которым я делал совместимую плату, и на который опирался при разработке 32-bit своими руками, шилд RABPS.
Можно скачать уже настроенный MARLIN. Это моя сборка под MKS TFT, но я проверял его на работоспособность с oled дисплеем, SD картой и энкодером. Просто переконфигурируйте под свой дисплей. Поддержку G2/G3 Arc Support уже отключена, потребуется только перенастроить свой дисплей, ну и под свою кинематику и под свои ускорения. Но эта статья эти настройки не рассматривает, так как в интернете по этому поводу полно информации, это штатные настройки Marlin.
Скачать настроенный марлин можно здесь r13-project.ru/files/3D_PRT/Marlin-bugfix-2.0_(CUBOID_1.0).zip
И что бы не ковырять настройки Platformio, замените папку <Системный диск>:\Users\<Пользователь>\.platformio\packages\framework-arduinoststm32\STM32F1
На папку из вот этого архива r13-project.ru/files/3D_PRT/STM32F1.zip
Предварительно сохраните свою папку STM32F1, на случай, если , что то пойдет не так, иначе придется переустанавливать Platformio.
В обновленном платформио есть проблема с компиляцией, но она касается только фреймворка под STM32F1, в остальных файлах проблем я не замечал. Поэтому замена папки STM32F1 должна решить проблему компиляции, я там правил с десяток файлов, что бы их обновленный платформио начал нормально пережевывать.
Вопросы можно задать на форуме https://r13-project.ru/chat_room/index.php?topic=4.0
Или в группе в ВК Как сделать
Залил готовую прошивку, а usb штатный не работает
Драйвера на виртуальный ком порт стоят? СТМ-ка прикидывается виртуальным ком портом. Я проверял, у меня работает, так же подписчик одни настраивал — у него другая проблема была, но именно через юэсби работало все.
Спасибо за проделанную работу! Нашел максимальную версию марлина, которая собирается по данной инструкции — это 2.0.4.4
У меня мат плата RABPS и экран RepRapDiscount Smart Controller, вот с ним проблемы, если питать плату от usb, то все хорошо, если питание с БП, то кракозябры на экране. Как побороть пока не нашел.
Хотел написать на форуме, но ваша регистрация какая то жесть, либо я тупой )
Смотреть помехи по питанию, смотреть откуда контроллер получает это питание. Возможно с инициальзацией дисплея проблема. Это порверить можно так — подать питание на контроллер отдельно а потом подключить голубую таблетку, получится задержка. Проблема скорее всего не программная.
Я тоже сначала подумал на питание, может да, а возможно и нет )
Проделал эксперимент, подключил RepRapDiscount Smart Controller напрямую к BluePill, чтобы исключить возможное влияние мат платы.
Сделал простенький проект Hello world!
Если компилить в platform.io со стандартным ядром, то все ок, если с maple, то результат непредсказуемый: крякозябры и текст не там где надо.
Пробовал разные библиотеки LiquidCrystal, один и тот же результат.
Кстати, последний Марлин легко компилится с актуальной версией платформы ststm32 и через repeater-host видно, что работает.
Но с моим экраном абсолютно такая же проблема .
Может кто компилировал проект под RepRapDiscount Smart Controller? Поделитесь пожалуйста а то у меня не получается? Собрал а не работает!?
Спасибо всем кто откликнется!
Только экран светится, а при нажатии на энкодер на дисплее, моргает лампочка на контроллере???
https://r13-project.ru/chat_room/index.php?action=dlattach;topic=4.0;attach=74;image
Я не могу правильно скомпилировать прошивку, несмотря на то, что сделал все по буквам, у меня возникают ошибки … если бы кто-то был так добр, чтобы мне помочь, я был бы признателен заранее …
Processing bluepill (platform: ststm32@4.4.0; framework: arduino; board: genericSTM32F103CB)
————————————————————————————————————————-Tool Manager: Installing tool-stlink @ ~1.10400.0
Unpacking [####################################] 100%
Tool Manager: tool-stlink @ 1.10400.0 has been installed!
Tool Manager: Installing tool-stm32duino @ ~1.0.0
Unpacking [####################################] 100%
Tool Manager: tool-stm32duino @ 1.0.2 has been installed!
Tool Manager: Installing tool-openocd @ ~1.1000.0
Unpacking [####################################] 100%
Tool Manager: tool-openocd @ 1.1000.6 has been installed!
Verbose mode can be enabled via `-v, —verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/ststm32/genericSTM32F103CB.html
PLATFORM: ST STM32 (4.4.0) > STM32F103CB (20k RAM. 128k Flash)
HARDWARE: STM32F103CBT6 72MHz, 20KB RAM, 128KB Flash
DEBUG: Current (blackmagic) External (blackmagic, jlink, stlink)
PACKAGES:
— framework-arduinoststm32 2.2.180809
— tool-openocd 1.1000.6 (10.0)
— tool-stlink 1.10400.0 (1.4.0)
— tool-stm32duino 1.0.2
— toolchain-gccarmnoneeabi 1.90301.200702 (9.3.1)
Converting Marlin.ino
LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 33 compatible libraries
Scanning dependencies…
Dependency Graph
|— 1.3.4
| |— 1.0
|— 0.4.0
| |— 1.0
| |— 1.0
|— 2.3.5
|— 1.0
|— 1.0
|—
|— 1.0
Building in release mode
Compiling .pioenvs\bluepill\src\src\HAL\HAL_STM32F1\HAL.cpp.o
Compiling .pioenvs\bluepill\src\src\HAL\HAL_STM32F1\HAL_Servo_Stm32f1.cpp.o
Compiling .pioenvs\bluepill\src\src\HAL\HAL_STM32F1\HAL_spi_Stm32f1.cpp.o
Compiling .pioenvs\bluepill\src\src\HAL\HAL_STM32F1\HAL_timers_Stm32f1.cpp.o
In file included from c:\users\alf\.platformio\packages\toolchain-gccarmnoneeabi\arm-none-eabi\include\stdlib.h:19,
from c:\users\alf\.platformio\packages\toolchain-gccarmnoneeabi\arm-none-eabi\include\c++\9.3.1\cstdlib:75,
from c:\users\alf\.platformio\packages\toolchain-gccarmnoneeabi\arm-none-eabi\include\c++\9.3.1\stdlib.h:36,
from C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\cores\maple/wirish.h:41,
from C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\cores\maple/Arduino.h:30,
from Marlin\src\HAL\HAL_STM32F1\HAL.h:41,
from Marlin\src\HAL\HAL_STM32F1\HAL_spi_Stm32f1.cpp:39:
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\system\libmaple/stm32f1/include/series/gpio.h:489:15:
error: duplicate ‘inline’
489 | static inline __always_inline void afio_exti_select(exti_num exti, exti_cfg port) {
| ^~~~~~~~~~~~~~~
In file included from c:\users\alf\.platformio\packages\toolchain-gccarmnoneeabi\arm-none-eabi\include\stdlib.h:19,
from c:\users\alf\.platformio\packages\toolchain-gccarmnoneeabi\arm-none-eabi\include\c++\9.3.1\cstdlib:75,
from c:\users\alf\.platformio\packages\toolchain-gccarmnoneeabi\arm-none-eabi\include\c++\9.3.1\stdlib.h:36,
from C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\cores\maple/wirish.h:41,
from C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\cores\maple/Arduino.h:30,
from Marlin\src\HAL\HAL_STM32F1\HAL.h:41,
from Marlin\src\HAL\HAL_STM32F1\HAL.cpp:34:
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\system\libmaple/stm32f1/include/series/gpio.h:489:15:
error: duplicate ‘inline’
489 | static inline __always_inline void afio_exti_select(exti_num exti, exti_cfg port) {
| ^~~~~~~~~~~~~~~
In file included from c:\users\alf\.platformio\packages\toolchain-gccarmnoneeabi\arm-none-eabi\include\stdlib.h:19,
from c:\users\alf\.platformio\packages\toolchain-gccarmnoneeabi\arm-none-eabi\include\c++\9.3.1\cstdlib:75,
from c:\users\alf\.platformio\packages\toolchain-gccarmnoneeabi\arm-none-eabi\include\c++\9.3.1\stdlib.h:36,
from C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\cores\maple/wirish.h:41,
from C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\cores\maple/Arduino.h:30,
from Marlin\src\HAL\HAL_STM32F1\HAL.h:41,
from Marlin\src\HAL\HAL_STM32F1\HAL_timers_Stm32f1.cpp:33:
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\system\libmaple/stm32f1/include/series/gpio.h:489:15:
error: duplicate ‘inline’
489 | static inline __always_inline void afio_exti_select(exti_num exti, exti_cfg port) {
| ^~~~~~~~~~~~~~~
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\system\libmaple\include/libmaple/nvic.h:112:15: error: duplicate ‘inline’
112 | static inline __always_inline void nvic_globalirq_enable() {
| ^~~~~~~~~~~~~~~
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\system\libmaple\include/libmaple/nvic.h:119:15: error: duplicate ‘inline’
119 | static inline __always_inline void nvic_globalirq_disable() {
| ^~~~~~~~~~~~~~~
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\system\libmaple\include/libmaple/nvic.h:112:15: error: duplicate ‘inline’
112 | static inline __always_inline void nvic_globalirq_enable() {
| ^~~~~~~~~~~~~~~
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\system\libmaple\include/libmaple/nvic.h:119:15: error: duplicate ‘inline’
119 | static inline __always_inline void nvic_globalirq_disable() {
| ^~~~~~~~~~~~~~~
In file included from c:\users\alf\.platformio\packages\toolchain-gccarmnoneeabi\arm-none-eabi\include\stdlib.h:19,
from c:\users\alf\.platformio\packages\toolchain-gccarmnoneeabi\arm-none-eabi\include\c++\9.3.1\cstdlib:75,
from c:\users\alf\.platformio\packages\toolchain-gccarmnoneeabi\arm-none-eabi\include\c++\9.3.1\stdlib.h:36,
from C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\cores\maple/wirish.h:41,
from C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\cores\maple/Arduino.h:30,
from Marlin\src\HAL\HAL_STM32F1\../../inc/../HAL/HAL_STM32F1/HAL.h:41,
from Marlin\src\HAL\HAL_STM32F1\../../inc/MarlinConfig.h:30,
from Marlin\src\HAL\HAL_STM32F1\HAL_Servo_Stm32f1.cpp:26:
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\system\libmaple/stm32f1/include/series/gpio.h:489:15:
error: duplicate ‘inline’
489 | static inline __always_inline void afio_exti_select(exti_num exti, exti_cfg port) {
| ^~~~~~~~~~~~~~~
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\cores\maple/ext_interrupts.h:109:15: error: duplicate
‘inline’
109 | static inline __always_inline void interrupts() {
| ^~~~~~~~~~~~~~~
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\cores\maple/ext_interrupts.h:123:15: error: duplicate
‘inline’
123 | static inline __always_inline void noInterrupts() {
| ^~~~~~~~~~~~~~~
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\cores\maple/ext_interrupts.h:109:15: error: duplicate
‘inline’
109 | static inline __always_inline void interrupts() {
| ^~~~~~~~~~~~~~~
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\cores\maple/ext_interrupts.h:123:15: error: duplicate
‘inline’
123 | static inline __always_inline void noInterrupts() {
| ^~~~~~~~~~~~~~~
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\system\libmaple\include/libmaple/nvic.h:112:15: error: duplicate ‘inline’
112 | static inline __always_inline void nvic_globalirq_enable() {
| ^~~~~~~~~~~~~~~
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\system\libmaple\include/libmaple/nvic.h:119:15: error: duplicate ‘inline’
119 | static inline __always_inline void nvic_globalirq_disable() {
| ^~~~~~~~~~~~~~~
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\system\libmaple\include/libmaple/nvic.h:112:15: error: duplicate ‘inline’
112 | static inline __always_inline void nvic_globalirq_enable() {
| ^~~~~~~~~~~~~~~
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\system\libmaple\include/libmaple/nvic.h:119:15: error: duplicate ‘inline’
119 | static inline __always_inline void nvic_globalirq_disable() {
| ^~~~~~~~~~~~~~~
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\cores\maple/ext_interrupts.h:109:15: error: duplicate
‘inline’
109 | static inline __always_inline void interrupts() {
| ^~~~~~~~~~~~~~~
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\cores\maple/ext_interrupts.h:123:15: error: duplicate
‘inline’
123 | static inline __always_inline void noInterrupts() {
| ^~~~~~~~~~~~~~~
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\cores\maple/ext_interrupts.h:109:15: error: duplicate
‘inline’
109 | static inline __always_inline void interrupts() {
| ^~~~~~~~~~~~~~~
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\cores\maple/ext_interrupts.h:123:15: error: duplicate
‘inline’
123 | static inline __always_inline void noInterrupts() {
| ^~~~~~~~~~~~~~~
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\system\libmaple/stm32f1/include/series/spi.h:78:15: error: duplicate ‘inline’
78 | static inline __always_inline void spi_gpio_cfg(uint8 as_master,
| ^~~~~~~~~~~~~~~
In file included from Marlin\src\HAL\HAL_STM32F1\HAL_spi_Stm32f1.cpp:44:
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\libraries\SPI\src/SPI.h:164:13: warning: unnecessary parentheses in declaration of ‘_spi1_this’ [-Wparentheses]
164 | static void (*_spi1_this);
| ^
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\libraries\SPI\src/SPI.h:165:13: warning: unnecessary parentheses in declaration of ‘_spi2_this’ [-Wparentheses]
165 | static void (*_spi2_this);
| ^
In file included from Marlin\src\HAL\HAL_STM32F1\../../inc/MarlinConfig.h:30,
from Marlin\src\HAL\HAL_STM32F1\HAL_Servo_Stm32f1.cpp:26:
Marlin\src\HAL\HAL_STM32F1\../../inc/../HAL/HAL_STM32F1/HAL.h:183:12: warning: ‘int freeMemory()’ defined but not used [-Wunused-function]
183 | static int freeMemory() {
| ^~~~~~~~~~
In file included from Marlin\src\HAL\HAL_STM32F1\../shared/../../core/macros.h:24,
from Marlin\src\HAL\HAL_STM32F1\../shared/math_32bit.h:24,
from Marlin\src\HAL\HAL_STM32F1\HAL.h:47,
from Marlin\src\HAL\HAL_STM32F1\HAL_timers_Stm32f1.cpp:33:
Marlin\src\HAL\HAL_STM32F1\../shared/../../core/minmax.h: In instantiation of ‘constexpr decltype ((lhs + rhs)) MIN(L, R) [with L = int; R = long unsigned int; decltype ((lhs + rhs)) = long unsigned int]’:
Marlin\src\HAL\HAL_STM32F1\HAL_timers_Stm32f1.cpp:124:61: required from here
Marlin\src\HAL\HAL_STM32F1\../shared/../../core/minmax.h:35:20: warning: comparison of integer expressions of different signedness: ‘const int’ and ‘const long unsigned int’ [-Wsign-compare]
35 | return lhs < rhs ? lhs : rhs;
| ~~~~^~~~~
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\libraries\SPI\src/SPI.h:165:15: warning: '_spi2_this'
defined but not used [-Wunused-variable]
165 | static void (*_spi2_this);
| ^~~~~~~~~~
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\libraries\SPI\src/SPI.h:164:15: warning: '_spi1_this'
defined but not used [-Wunused-variable]
164 | static void (*_spi1_this);
| ^~~~~~~~~~
C:\Users\ALF\.platformio\packages\framework-arduinoststm32\STM32F1\libraries\SPI\src/SPI.h:163:16: warning: 'ff' defined
but not used [-Wunused-variable]
163 | static uint8_t ff = 0XFF;
| ^~
In file included from Marlin\src\HAL\HAL_STM32F1\HAL_spi_Stm32f1.cpp:39:
Marlin\src\HAL\HAL_STM32F1\HAL.h:183:12: warning: 'int freeMemory()' defined but not used [-Wunused-function]
183 | static int freeMemory() {
| ^~~~~~~~~~
In file included from Marlin\src\HAL\HAL_STM32F1\HAL.cpp:34:
Marlin\src\HAL\HAL_STM32F1\HAL.h:183:12: warning: 'int freeMemory()' defined but not used [-Wunused-function]
183 | static int freeMemory() {
| ^~~~~~~~~~
Marlin\src\HAL\HAL_STM32F1\HAL_timers_Stm32f1.cpp: In function 'timer_dev* get_timer_dev(int)':
Marlin\src\HAL\HAL_STM32F1\HAL_timers_Stm32f1.cpp:217:1: warning: control reaches end of non-void function [-Wreturn-type]
217 | }
| ^
In file included from Marlin\src\HAL\HAL_STM32F1\HAL_timers_Stm32f1.cpp:33:
Marlin\src\HAL\HAL_STM32F1\HAL.h: At global scope:
Marlin\src\HAL\HAL_STM32F1\HAL.h:183:12: warning: 'int freeMemory()' defined but not used [-Wunused-function]
183 | static int freeMemory() {
| ^~~~~~~~~~
*** [.pioenvs\bluepill\src\src\HAL\HAL_STM32F1\HAL_Servo_Stm32f1.cpp.o] Error 1
*** [.pioenvs\bluepill\src\src\HAL\HAL_STM32F1\HAL_spi_Stm32f1.cpp.o] Error 1
*** [.pioenvs\bluepill\src\src\HAL\HAL_STM32F1\HAL.cpp.o] Error 1
*** [.pioenvs\bluepill\src\src\HAL\HAL_STM32F1\HAL_timers_Stm32f1.cpp.o] Error 1
Все это обсуждается на форуме. Там и готовые решения есть, и есть те, кто может помочь.
https://r13-project.ru/chat_room/index.php?topic=4.0
https://r13-project.ru/chat_room/index.php?topic=3.0
лучше там задавайте вопросы.