воскресенье, 16 ноября 2025 г.

Заново открываю для себя STM32

Так вышло что микроконтроллеры 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
 }

После этого отладка стала запускаться стабильно.

Комментариев нет:

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