Так вышло что микроконтроллеры STM32 я обошёл стороной и в основном использовал ATMEGA8/ATMEGA328 и ESP8266. Заказывал на пробу платы Blue pill с STM32F103C8T6, помигал светодиодом и отложил в ящик до лучших времён. Тогда интерес был в районе IoT и ESP8266 давал больше возможностей в сравнении с ATMEGA и STM32 у которого не было встроенного WiFi.
Недавно собирал частотомер на ESP32-S3 и мне не хватало 32-битного таймера чтобы считать импульсы без переполнения. Полистал спецификацию на популярные сейчас Black pill и заказал две платы с STM32F411CEU6 на борту чтобы сделать ещё один подход к STM32.
Обе платы приехали ко мне меньше чем за месяц. На фотографии одна из плат с уже с припаянными контактами. Одна из них после включения плавно мигает синим светодиодом, а во вторую залита обычная мигалка.
Для поддержки этой платы потребуется Arduino IDE 2.х (я установил актуальную версию 2.3.6) в которой нужно добавить ссылку https://raw.githubusercontent.com/stm32duino/BoardManagerFiles/refs/heads/main/package_stmicroelectronics_index.json в поле "Дополнительные ссылки для Менеджера плат" в меню Файл / Параметры.
После зайти в "Менеджер плат", ввести в строку поиска SMT32 и установить "SMT32 MCU based boards". После этого в списке плат выбрать "Generic SMT32F4 series" и "Black pill F411CE".
Для прошивки подключил китайский клон ST-Link V2 и попробовал прошить пример Blink, но Arduino IDE пожаловалась что не установлен STM32CubeProgrammer. Странно, т.к. в прошлый раз никаких дополнительных инструментов устанавливать не пришлось.
Установил STM32CubeProgrammer, но он отказался общаться с моим ST-Link V2, т.к. его прошивка устарела. Обновить прошивку получилось не с первого раза, но операция в итоге прошла успешно и получилось соединиться с микроконтроллером.
Возвращаюсь в Arduino IDE и пробую прошить плату снова, но при заливке прошивки падает ошибка
STM32CubeProgrammer not found (STM32_Programmer.sh). Please install it or add '<STM32CubeProgrammer path>/bin' to your PATH environment: https://www.st.com/en/development-tools/stm32cubeprog.html Aborting! Не удалась загрузка: ошибка при загрузке: exit status 1
Поискал где упоминается сообщение "STM32CubeProgrammer not found" и нашёл скрипт, который вызывает программатор
$ grep -rl 'STM32CubeProgrammer not found' ~/.arduino15 /home/andrey/.arduino15/packages/STMicroelectronics/tools/STM32Tools/2.3.1/stm32CubeProg.sh
Этот скрипт пробует найти STM32_Programmer.sh в PATH и если это не удалось, то в ~/STMicroelectronics/STM32Cube/STM32CubeProgrammer/bin и /opt/stm32cubeprog/bin. У меня STM32CubeProgrammer установлен в ~/.local/STM32CubeProgrammer/ и чтобы вызов сработал я добавил дополнительный путь в скрипт stm32CubeProg.sh. Вторая попытка прошивки закончилась новой ошибкой
Selected interface: swd
-------------------------------------------------------------------
STM32CubeProgrammer v2.21.0
-------------------------------------------------------------------
ST-LINK SN : 48FF6F066580515321402467
ST-LINK FW : V2J46S7
Board : --
Voltage : 3.25V
SWD freq : 4000 KHz
Connect mode: Under Reset
Reset mode : Hardware reset
Device ID : 0x431
Revision ID : Rev A
Device name : STM32F411xC/E
Flash size : 512 KBytes
Device type : MCU
Device CPU : Cortex-M4
BL Version : 0xD0
Opening and parsing file: Blink.ino.bin
Memory Programming ...
File : Blink.ino.bin
Size : 11.54 KB
Address : 0x08000000
Erasing memory corresponding to segment 0:
Erasing internal memory sector 0
Error: failed to erase memory
Error: failed to erase memory
Из сообщения видно что микроконтроллер правильно определился, но не удалось стереть память перед прошивкой. Вернулся обратно в STM32CubeProgrammer и попробовал стирать память в нём. Из четырёх попыток две были удачными и две закончились ошибкой
Поэкспериментировал с настройками подключения и выяснил что ошибки возникают если использовать частоту 4000 кГц (возможно китайский клон не умеет работать на такой частоте), уменьшил её до 950 кГц и стирание стало работать постоянно. Добавил аналогичную настройку в скрипт stm32CubeProg.sh и теперь Arduino IDE тоже может прошивать плату
Selected interface: swd
-------------------------------------------------------------------
STM32CubeProgrammer v2.21.0
-------------------------------------------------------------------
ST-LINK SN : 48FF6F066580515321402467
ST-LINK FW : V2J46S7
Board : --
Voltage : 3.25V
SWD freq : 950 KHz
Connect mode: Under Reset
Reset mode : Hardware reset
Device ID : 0x431
Revision ID : Rev A
Device name : STM32F411xC/E
Flash size : 512 KBytes
Device type : MCU
Device CPU : Cortex-M4
BL Version : 0xD0
Opening and parsing file: Blink.ino.bin
Memory Programming ...
File : Blink.ino.bin
Size : 11.54 KB
Address : 0x08000000
Erasing memory corresponding to segment 0:
Erasing internal memory sector 0
Download in Progress:
File download complete
Time elapsed during download operation: 00:00:00.697
RUNNING Program ...
Address: : 0x8000000
Application is running, Please Hold on...
Start operation achieved successfully
Изменения в скрипте ~/.arduino15/packages/STMicroelectronics/tools/STM32Tools/2.3.1/stm32CubeProg.sh
--- .arduino15/packages/STMicroelectronics/tools/STM32Tools/2.3.1/stm32CubeProg.orig.sh 2025-11-16 11:03:41.120241811 +0300
+++ .arduino15/packages/STMicroelectronics/tools/STM32Tools/2.3.1/stm32CubeProg.sh 2025-11-16 11:28:45.271649634 +0300
@@ -13,6 +13,7 @@
ADDRESS=0x8000000
START=0x8000000
MODE=UR
+FREQ=950
ERASE=
# Optional for Serial
RTS=
@@ -65,6 +66,9 @@
Linux*)
STM32CP_CLI=STM32_Programmer.sh
if ! command -v $STM32CP_CLI >/dev/null 2>&1; then
+ export PATH="$HOME/.local/STM32CubeProgrammer/bin":"$PATH"
+ fi
+ if ! command -v $STM32CP_CLI >/dev/null 2>&1; then
export PATH="$HOME/STMicroelectronics/STM32Cube/STM32CubeProgrammer/bin":"$PATH"
fi
if ! command -v $STM32CP_CLI >/dev/null 2>&1; then
@@ -214,7 +218,7 @@
case "${INTERFACE}" in
swd)
- ${STM32CP_CLI} --connect port=SWD mode="${MODE}" "${ERASE}" --quietMode --download "${FILEPATH}" "${ADDRESS}" --start "${START}"
+ ${STM32CP_CLI} --connect port=SWD mode="${MODE}" freq="${FREQ}" "${ERASE}" --quietMode --download "${FILEPATH}" "${ADDRESS}" --start "${START}"
;;
dfu)
if [ -z "${VID}" ] || [ -z "${PID}" ]; then
Отладка тоже работает, для этого нужно включить отладочные символы в "Скетч / Оптимизировать для отладки" и нажать кнопку "Начать отладку"
Поставил точку остановки и вывел переменную counter в окно наблюдения. Отладка стартует не каждый раз из-за высоких настроек частоты с которыми у моего клона ST-Link V2 проблемы
Info : Listening on port 50001 for tcl connections Info : Listening on port 50002 for telnet connections Info : STLINK V2J46S7 (API v2) VID:PID 0483:3748 Info : Target voltage: 3.237541 Info : Unable to match requested speed 2000 kHz, using 1800 kHz Info : Unable to match requested speed 2000 kHz, using 1800 kHz Info : clock speed 1800 kHz Info : stlink_dap_op_connect(connect) Info : SWD DPIDR 0x2ba01477 Info : [stm32f4x.cpu] Cortex-M4 r0p1 processor detected Info : [stm32f4x.cpu] target has 6 breakpoints, 4 watchpoints Info : [stm32f4x.cpu] Examination succeed Info : [stm32f4x.cpu] starting gdb server on 50000 Info : Listening on port 50000 for gdb connections Info : accepting 'gdb' connection on tcp/50000 Info : device id = 0x10006431 Info : flash size = 512 KiB Info : flash size = 512 bytes undefined debug reason 8 (UNDEFINED) - target needs reset Info : Unable to match requested speed 2000 kHz, using 1800 kHz Info : Unable to match requested speed 2000 kHz, using 1800 kHz [stm32f4x.cpu] halted due to breakpoint, current mode: Thread xPSR: 0x01000000 pc: 0x08002518 msp: 0x20020000 Info : Unable to match requested speed 2000 kHz, using 1800 kHz Info : Unable to match requested speed 2000 kHz, using 1800 kHz [stm32f4x.cpu] halted due to breakpoint, current mode: Thread xPSR: 0x01000000 pc: 0x08002518 msp: 0x20020000 Info : Unable to match requested speed 8000 kHz, using 4000 kHz Info : Unable to match requested speed 8000 kHz, using 4000 kHz Info : Padding image section 0 at 0x08000198 with 8 bytes Info : Unable to match requested speed 2000 kHz, using 1800 kHz Info : Unable to match requested speed 2000 kHz, using 1800 kHz [stm32f4x.cpu] halted due to breakpoint, current mode: Thread xPSR: 0x01000000 pc: 0x08002518 msp: 0x20020000 Info : Unable to match requested speed 2000 kHz, using 1800 kHz Info : Unable to match requested speed 2000 kHz, using 1800 kHz [stm32f4x.cpu] halted due to breakpoint, current mode: Thread xPSR: 0x01000000 pc: 0x08002518 msp: 0x20020000 Info : dropped 'gdb' connection shutdown command invoked
Посмотрел в настройках отладки какие конфигурационные файлы используются и снизил частоту до 950 кГц в файле ~/.arduino15/packages/STMicroelectronics/tools/xpack-openocd/0.12.0-6/openocd/scripts/target/stm32f4x.cfg
--- .arduino15/packages/STMicroelectronics/tools/xpack-openocd/0.12.0-6/openocd/scripts/target/stm32f4x.orig.cfg 2025-11-16 12:37:11.268564210 +0300
+++ .arduino15/packages/STMicroelectronics/tools/xpack-openocd/0.12.0-6/openocd/scripts/target/stm32f4x.cfg 2025-11-16 12:38:42.374698154 +0300
@@ -66,7 +66,7 @@
# bit more to be on the safe side. Perhaps superstition, but if are
# running off a crystal, we can run closer to the limit. Note
# that there can be a pretty wide band where things are more or less stable.
-adapter speed 2000
+adapter speed 950
adapter srst delay 100
if {[using_jtag]} {
@@ -139,10 +139,10 @@
mmw 0x40023808 0x00000002 0 ;# RCC_CFGR |= RCC_CFGR_SW_PLL
# Boost JTAG frequency
- adapter speed 8000
+ adapter speed 950
}
$_TARGETNAME configure -event reset-start {
# Reduce speed since CPU speed will slow down to 16MHz with the reset
- adapter speed 2000
+ adapter speed 950
}
После этого отладка стала запускаться стабильно.




Комментариев нет:
Отправить комментарий