ΠŸΡ€ΠΎΡˆΠΈΠ²ΠΊΠ° ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² STM32 Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку (CLI) β€” это Π½Π΅ просто Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° графичСским интСрфСйсам Π²Ρ€ΠΎΠ΄Π΅ STM32CubeIDE ΠΈΠ»ΠΈ Keil, Π° часто СдинствСнный способ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ процСссы Π² производствС, CI/CD-ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π°Ρ… ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с headless-систСмами. CLI-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ Ρ‚ΠΈΠΏΠ° STM32CubeProgrammer, OpenOCD ΠΈΠ»ΠΈ st-flash ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΡ€ΠΎΡˆΠΈΠ²Π°Ρ‚ΡŒ STM32 с Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π΄ΠΎ Π±Π°ΠΉΡ‚Π°, ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ со скриптами Π½Π° Python/Bash, ΠΈ Π΄Π°ΠΆΠ΅ Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ "ΠΊΠΈΡ€ΠΏΠΈΡ‡ΠΈ" Ρ‡Π΅Ρ€Π΅Π· SWJ-DP ΠΈΠ»ΠΈ JTAG.

Однако ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° CLI сопряТён с ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ камнями: ΠΎΡ‚ Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Ρ… Ρ„Π»Π°Π³ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, --verify vs --verify=read Π² STM32CubeProgrammer) Π΄ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°ΠΌΠΈ ST-Link Π² Linux ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² вСрсий OpenOCD. Π’ этом руководствС ΠΌΡ‹ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ всС этапы β€” ΠΎΡ‚ установки инструмСнтов Π΄ΠΎ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Ρ… ошибок Ρ‚ΠΈΠΏΠ° Error: failed to read memory ΠΈΠ»ΠΈ Cannot connect to target, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π½Π° 30% Π·Π° счёт ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² CLI.

1. Π’Ρ‹Π±ΠΎΡ€ инструмСнта: STM32CubeProgrammer vs OpenOCD vs st-flash

Π’Ρ€ΠΈ основных CLI-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с STM32 Ρ€Π΅ΡˆΠ°ΡŽΡ‚ ΠΎΠ΄Π½ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ, Π½ΠΎ подходят для Ρ€Π°Π·Π½Ρ‹Ρ… сцСнариСв. Π’Ρ‹Π±ΠΎΡ€ зависит ΠΎΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° (SWD/JTAG), ОБ (Windows/Linux/macOS) ΠΈ Ρ†Π΅Π»Π΅ΠΉ (ΠΎΡ‚Π»Π°Π΄ΠΊΠ°, массовая ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠ°, восстановлСниС).

  • πŸ”§ STM32CubeProgrammer β€” ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ инструмСнт ΠΎΡ‚ STMicroelectronics с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ всСх сСмСйств STM32 (ΠΎΡ‚ STM32F0 Π΄ΠΎ STM32H7). ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ SWD, JTAG, UART ΠΈ Π΄Π°ΠΆΠ΅ I2C/SPI для bootloader-ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ. ΠœΠΈΠ½ΡƒΡ β€” Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ исходный ΠΊΠΎΠ΄ ΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π».
  • 🐧 OpenOCD β€” ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ STM32 Ρ‡Π΅Ρ€Π΅Π· SWD/JTAG. Π“ΠΈΠ±ΠΊΠΈΠΉ, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ€ΡƒΡ‡Π½ΠΎΠΉ настройки ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² (.cfg). ИдСалСн для Linux ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с GDB.
  • ⚑ st-flash β€” минималистичная ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° ΠΈΠ· ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° texane/stlink. Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ST-Link (v1/v2/v3), Π½ΠΎ ΠΏΡ€ΠΎΡˆΠΈΠ²Π°Π΅Ρ‚ быстрСС ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚ΠΎΠ² Π·Π° счёт ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°. НСт ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ.

Для производства Ρ‡Π°Ρ‰Π΅ Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ STM32CubeProgrammer ΠΈΠ·-Π·Π° ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ, для Linux-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ β€” OpenOCD, Π° для быстрой ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ тСстовых ΠΏΠ»Π°Ρ‚ β€” st-flash. НиТС сравнСниС ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ STM32CubeProgrammer OpenOCD st-flash
ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² SWD, JTAG, UART, I2C, SPI SWD, JTAG SWD (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ST-Link)
Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ (1 ΠœΠ‘) ~15 сСк ~20 сСк ~10 сСк
ΠšΡ€ΠΎΡΡ-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎΡΡ‚ΡŒ Windows, Linux, macOS Linux, Windows (WSL), macOS Linux, Windows (с сборкой)
ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π”Π° (Ρ‡Π΅Ρ€Π΅Π· GDB) Π”Π° НСт

ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅: Ρ‚ΠΎΠ»ΡŒΠΊΠΎ STM32CubeProgrammer ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Ρ‡Π΅Ρ€Π΅Π· UART с использованиСм встроСнного bootloader-Π° STM32 (Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ для восстановлСния "ΠΊΠΈΡ€ΠΏΠΈΡ‡Π΅ΠΉ" Π±Π΅Π· ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°).

πŸ“Š Какой инструмСнт Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ для ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ STM32?
  • STM32CubeProgrammer
  • OpenOCD
  • st-flash
  • Π”Ρ€ΡƒΠ³ΠΎΠΉ (Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π² коммСнтариях)

2. Установка ΠΈ настройка инструмСнтов

ΠŸΡ€ΠΎΡ†Π΅ΡΡ установки зависит ΠΎΡ‚ ОБ ΠΈ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹. На Windows ΠΏΡ€ΠΎΡ‰Π΅ всСго Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с STM32CubeProgrammer (Π΅ΡΡ‚ΡŒ установщик), Π° Π½Π° Linux придётся ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ OpenOCD ΠΈΠ»ΠΈ st-flash ΠΈΠ· исходников.

2.1. STM32CubeProgrammer (Windows/Linux/macOS)

ΠžΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ инструкции ΠΎΡ‚ ST часто ΡƒΡΡ‚Π°Ρ€Π΅Π²Π°ΡŽΡ‚, поэтому Π²ΠΎΡ‚ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ шаги для установки:

  1. Π‘ΠΊΠ°Ρ‡Π°ΠΉΡ‚Π΅ послСднюю Π²Π΅Ρ€ΡΠΈΡŽ с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ сайта (Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания β€” v2.15.0).
  2. На Windows запуститС установщик с ΠΏΡ€Π°Π²Π°ΠΌΠΈ администратора. На Linux/macOS распакуйтС Π°Ρ€Ρ…ΠΈΠ² ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΏΡƒΡ‚ΡŒ ΠΊ bin/ Π² PATH:
    export PATH=$PATH:/ΠΏΡƒΡ‚ΡŒ/Π΄ΠΎ/STM32CubeProgrammer/bin
  3. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ установку ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
    STM32_Programmer_CLI --version

2.2. OpenOCD (Linux/WSL)

Π’ рСпозиториях дистрибутивов часто Π»Π΅ΠΆΠ°Ρ‚ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ вСрсии. Для STM32 рСкомСндуСтся вСрсия 0.12.0+:

# Установка зависимостСй (Ubuntu/Debian)

sudo apt install autoconf libtool pkg-config libusb-1.0-0-dev

# ΠšΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ сборка

git clone https://git.code.sf.net/p/openocd/code openocd

cd openocd

./bootstrap

./configure --enable-stlink

make -j$(nproc)

sudo make install

Π’Π°ΠΆΠ½ΠΎ: для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ST-Link v3 Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ„Π»Π°Π³ --enable-stlink ΠΏΡ€ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

2.3. st-flash (Linux/Windows)

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° ΠΈΠ· ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° texane/stlink устанавливаСтся Ρ‡Π΅Ρ€Π΅Π· pip ΠΈΠ»ΠΈ ΠΈΠ· исходников:

# Π§Π΅Ρ€Π΅Π· pip (рСкомСндуСтся)

pip install stlink

# Или сборка ΠΈΠ· исходников

git clone https://github.com/texane/stlink.git

cd stlink

make release

sudo make install

ПослС установки ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°:

st-info --probe

# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π°:

Found 1 stlink programmers

version: V3J9M3

serial: 066EFF555051848687234512

flash: 2048 KiB

sram: 192 KiB

chipid: 0x0413 (STM32F103C8)

πŸ’‘

Если st-info Π½Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ST-Link, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΡ€Π°Π²Π° доступа ΠΊ USB-устройству Π² Linux: Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ sudo usermod -a -G plugdev $USER ΠΈ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ΡΡŒ.

3. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ

Π Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½ΡŽΠ°Π½ΡΡ‹ ΠΈΡ… использования. ВсС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ для ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° STM32F407G-DISC1 (отладочная ΠΏΠ»Π°Ρ‚Π° Discovery).

3.1. STM32CubeProgrammer

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Π²Π° Ρ€Π΅ΠΆΠΈΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹: CLI (командная строка) ΠΈ GUI. Для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ CLI:

  • πŸ“Œ ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ устройству:
    STM32_Programmer_CLI -c port=SWD -c connect
  • πŸ“€ ΠŸΡ€ΠΎΡˆΠΈΠ²ΠΊΠ° Ρ„Π°ΠΉΠ»Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, firmware.hex):
    STM32_Programmer_CLI -c port=SWD -c connect -w "firmware.hex" 0x08000000 -v -r
    Π€Π»Π°Π³ΠΈ:
    • -w β€” запись Ρ„Π°ΠΉΠ»Π° ΠΏΠΎ адрСсу 0x08000000 (Π½Π°Ρ‡Π°Π»ΠΎ Flash).
    • -v β€” вСрификация послС записи.
    • -r β€” сброс ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° послС ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ.
  • πŸ” Π§Ρ‚Π΅Π½ΠΈΠ΅ памяти (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠ΅Ρ€Π²Ρ‹Ρ… 256 Π±Π°ΠΉΡ‚ Flash):
    STM32_Programmer_CLI -c port=SWD -c connect -r32 0x08000000 0x100 -d "dump.bin"

3.2. OpenOCD

OpenOCD Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° (.cfg) для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с STM32. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ для ST-Link v2:

# stm32f4_discovery.cfg

source [find interface/stlink-v2.cfg]

source [find target/stm32f4x.cfg]

reset_config srst_only

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

  • πŸ”Œ Запуск сСрвСра:
    openocd -f stm32f4_discovery.cfg
  • πŸ“€ ΠŸΡ€ΠΎΡˆΠΈΠ²ΠΊΠ° Ρ‡Π΅Ρ€Π΅Π· Telnet (Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅):
    telnet localhost 4444
    

    > reset halt

    > flash write_image erase firmware.bin 0x08000000

    > reset run

    > exit

3.3. st-flash

Π‘Π°ΠΌΡ‹ΠΉ простой синтаксис срСди всСх ΡƒΡ‚ΠΈΠ»ΠΈΡ‚:

# ΠŸΡ€ΠΎΡˆΠΈΠ²ΠΊΠ° Ρ„Π°ΠΉΠ»Π° .bin

st-flash write firmware.bin 0x08000000

# Π§Ρ‚Π΅Π½ΠΈΠ΅ Flash Π² Ρ„Π°ΠΉΠ»

st-flash read dump.bin 0x08000000 0x10000

# Π‘Ρ‚ΠΈΡ€Π°Π½ΠΈΠ΅ всСго Ρ‡ΠΈΠΏΠ°

st-flash erase

Нюанс: st-flash Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ .hex β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ .bin. Для ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ objcopy:

arm-none-eabi-objcopy -O binary firmware.elf firmware.bin

Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ST-Link ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ (st-info --probe)|ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Ρ„Π°ΠΉΠ»Π° (для st-flash Ρ‚ΠΎΠ»ΡŒΠΊΠΎ .bin)|ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π·Π°Ρ‰ΠΈΡ‚Ρƒ Flash (Ссли Π΅ΡΡ‚ΡŒ) Ρ‡Π΅Ρ€Π΅Π· STM32_Programmer_CLI -c ob rdp=0|Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΡƒΡŽ копию Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ-->

4. Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ ошибки ΠΈ ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

Π”Π°ΠΆΠ΅ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ с ошибками ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠ΅ Ρ‡Π΅Ρ€Π΅Π· CLI. Π Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ самыС частыС ΠΈ Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Π΅ способы ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

4.1. "Cannot connect to target" / "No ST-Link detected"

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ:

  • πŸ”Œ ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΏΠΈΡ‚Π°Π½ΠΈΠ΅ Π½Π° ΠΏΠ»Π°Ρ‚Π΅. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ 3.3V ΠΈΠ»ΠΈ 5V Π½Π° ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Π°Ρ… STM32.
  • πŸ–₯️ ΠšΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² (Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ для Windows). Π£Π΄Π°Π»ΠΈΡ‚Π΅ старыС Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° ST-Link Ρ‡Π΅Ρ€Π΅Π· ДиспСтчСр устройств ΠΈ установитС послСдниС с сайта ST.
  • 🐧 ΠŸΡ€Π°Π²Π° доступа Π² Linux. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ для udev:
    echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", MODE="0666"' | sudo tee /etc/udev/rules.d/99-stlink.rules
    

    sudo udevadm control --reload-rules

4.2. "Error: failed to erase memory"

Ошибка Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΈ:

  • πŸ”’ Π’ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½ΠΎΠΉ Π·Π°Ρ‰ΠΈΡ‚Π΅ Flash. Π‘Π½ΠΈΠΌΠΈΡ‚Π΅ Π·Π°Ρ‰ΠΈΡ‚Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
    STM32_Programmer_CLI -c port=SWD -c connect -c ob rdp=0
  • ⚑ ΠΠ΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΌ ΠΏΠΈΡ‚Π°Π½ΠΈΠΈ. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ внСшний источник 5V/2A.
  • πŸ•³οΈ ΠŸΠΎΠ²Ρ€Π΅ΠΆΠ΄Ρ‘Π½Π½Ρ‹Ρ… сСкторах Flash. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΡˆΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ --force Π² st-flash.
⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Ссли послС снятия Π·Π°Ρ‰ΠΈΡ‚Ρ‹ (ob rdp=0) ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ пСрСстал ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ€Π°Π½Π΅Π΅ Π±Ρ‹Π» установлСн ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ RDP2 (Π½Π΅ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠΌΠΎΠ΅ стираниС Flash). Π’ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ β€” трСбуСтся полная ΠΏΠ΅Ρ€Π΅ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠ° Ρ‡Π΅Ρ€Π΅Π· bootloader.

4.3. "Verification failed" послС ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ‡Π°Ρ‰Π΅ всСго связана с:

  • πŸ“‘ ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ SWD. Π£ΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚Π΅ частоту:
    STM32_Programmer_CLI -c port=SWD -c freq=4000 -c connect -w firmware.hex 0x08000000
  • πŸ”„ ΠšΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠΌ вСрсий ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ адрСс Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ (0x08000000) совпадаСт с Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ сброса Π² .hex-Ρ„Π°ΠΉΠ»Π΅.
Ошибка ВСроятная ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° РСшСниС
Error: no device found ST-Link Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ ΠΈΠ»ΠΈ занято Π΄Ρ€ΡƒΠ³ΠΈΠΌ процСссом ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ lsusb (Linux) ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ
Flash download failed НСдостаточно мСста Π² Flash ΠΈΠ»ΠΈ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Ρ‘Π½Π½Ρ‹Π΅ сСктора ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ st-flash erase
Cannot halt target ΠœΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ "завис" Π² бСсконСчном Ρ†ΠΈΠΊΠ»Π΅ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ reset halt Π² OpenOCD ΠΈΠ»ΠΈ физичСски ΡΠ±Ρ€ΠΎΡΡŒΡ‚Π΅ ΠΏΠ»Π°Ρ‚Ρƒ

5. ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ скорости ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ

Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ Ρ‡Π΅Ρ€Π΅Π· CLI ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π² 2–3 Ρ€Π°Π·Π°, ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ настроив ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹. Π Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

5.1. Π’Ρ‹Π±ΠΎΡ€ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° ΠΈ частоты

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» SWD ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ быстрСС JTAG, Π½ΠΎ для STM32H7 ΠΈΠ»ΠΈ STM32F7 Ρ€Π°Π·Π½ΠΈΡ†Π° минимальна. ΠžΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ частоты:

  • πŸ“ˆ ST-Link v2: Π΄ΠΎ 4 MHz (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 1.8 MHz).
  • πŸ“ˆ ST-Link v3: Π΄ΠΎ 24 MHz (Π½ΠΎ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΄ΠΎ 12 MHz).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ для STM32CubeProgrammer:

STM32_Programmer_CLI -c port=SWD -c freq=12000 -c connect -w firmware.hex 0x08000000

5.2. ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ стираниС ΠΈ запись

STM32CubeProgrammer ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ„Π»Π°Π³ --multi для ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ стирания ΠΈ записи сСкторов. Π­Ρ‚ΠΎ ускоряСт процСсс Π½Π° 20–30%:

STM32_Programmer_CLI -c port=SWD -c connect --multi -w firmware.hex 0x08000000

5.3. ИспользованиС Π±ΡƒΡ„Π΅Ρ€Π°

OpenOCD позволяСт Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π° для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ (.cfg):

adapter driver stlink

stlink_usb_vid_pid 0x0483 0x3748

adapter speed 4000

adapter swd

transport select swd

stlink flash_bank stm32f4x 0x08000000 0x100000 0 0 0

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠ° 1 ΠœΠ‘ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ~10 сСкунд вмСсто ~25 ΠΏΡ€ΠΈ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹Ρ… настройках.

πŸ’‘

Для максимальной скорости ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ: SWD + частота 12 MHz + Ρ„Π»Π°Π³ --multi (STM32CubeProgrammer) ΠΈΠ»ΠΈ Π±ΡƒΡ„Π΅Ρ€ 8 ΠšΠ‘ (OpenOCD).

6. Автоматизация ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ: скрипты ΠΈ CI/CD

CLI-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ идСально подходят для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ β€” ΠΎΡ‚ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ ΠΏΠ°Ρ€Ρ‚ΠΈΠΈ устройств Π΄ΠΎ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ Π² GitHub Actions ΠΈΠ»ΠΈ Jenkins.

6.1. Bash-скрипт для массовой ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ скрипта для ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ 10 ΠΏΠ»Π°Ρ‚ подряд с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ:

#!/bin/bash

FIRMWARE="firmware.hex"

LOG_FILE="flash_log.txt"

for i in {1..10}; do

echo "ΠŸΡ€ΠΎΡˆΠΈΠ²ΠΊΠ° устройства #$i..." | tee -a $LOG_FILE

STM32_Programmer_CLI -c port=SWD -c connect -w $FIRMWARE 0x08000000 -v >> $LOG_FILE 2>&1

if [ $? -eq 0 ]; then

echo "УспСшно! Бброс..." | tee -a $LOG_FILE

STM32_Programmer_CLI -c port=SWD -c connect -c reset

else

echo "ΠžΠ¨Π˜Π‘ΠšΠ! ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅." | tee -a $LOG_FILE

exit 1

fi

done

6.2. Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с GitHub Actions

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ workflow для автоматичСской ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ ΠΏΡ€ΠΈ ΠΏΡƒΡˆΠ΅ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ:

name: STM32 Flash CI

on: [push]

jobs:

build-and-flash:

runs-on: ubuntu-latest

steps:

- uses: actions/checkout@v4

- name: Установка STM32CubeProgrammer

run: |

wget https://www.st.com/content/ccc/resource/technical/software/sw_development_suite/group0/5a/6a/9f/6d/55/1e/47/94/stm32cubeprog_v2-15-0_linux.zip/jcr:content/translations/en.stm32cubeprog_v2-15-0_linux.zip

unzip stm32cubeprog*.zip

sudo ./SetupSTM32CubeProgrammer-2.15.0.linux --headless

- name: Π‘Π±ΠΎΡ€ΠΊΠ° ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ

run: make

- name: ΠŸΡ€ΠΎΡˆΠΈΠ²ΠΊΠ°

run: STM32_Programmer_CLI -c port=SWD -c connect -w firmware.hex 0x08000000 -v

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ: ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ автоматичСски ΠΏΡ€ΠΎΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ Π½Π° Ρ‚Π΅ΡΡ‚ΠΎΠ²ΡƒΡŽ ΠΏΠ»Π°Ρ‚Ρƒ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ рСгрСссии.

Как ΠΎΠ±ΠΎΠΉΡ‚ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ GitHub Actions Π½Π° USB-устройства?

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ GitHub Actions Π½Π΅ прСдоставляСт доступ ΠΊ USB-ΠΏΠΎΡ€Ρ‚Π°ΠΌ. РСшСния:

1. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ self-hosted runner с ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹ΠΌ ST-Link.

2. Π­ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Ρ‡Π΅Ρ€Π΅Π· QEMU (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для тСстирования, Π±Π΅Π· Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΆΠ΅Π»Π΅Π·Π°).

3. Π—Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ скрипт Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ сСрвСрС ΠΏΠΎ SSH ΠΈΠ· workflow.

7. ВосстановлСниС "ΠΊΠΈΡ€ΠΏΠΈΡ‡Π΅ΠΉ" Ρ‡Π΅Ρ€Π΅Π· CLI

Если STM32 пСрСстал ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π½Π° SWD/JTAG (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ·-Π·Π° Π½Π΅Π²Π΅Ρ€Π½ΠΎΠΉ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ ΠΈΠ»ΠΈ Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½ΠΎΠ³ΠΎ RDP2), Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· встроСнный bootloader ΠΏΠΎ UART ΠΈΠ»ΠΈ USB DFU.

7.1. ВосстановлСниС Ρ‡Π΅Ρ€Π΅Π· UART

ΠŸΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ΡΡ: STM32CubeProgrammer, USB-UART Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, FT232) ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅:

  • πŸ”Œ ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ PA9 (TX) ΠΈ PA10 (RX) ΠΊ Π°Π΄Π°ΠΏΡ‚Π΅Ρ€Ρƒ.
  • πŸ”„ Π—Π°ΠΌΠΊΠ½ΠΈΡ‚Π΅ BOOT0 Π½Π° 3.3V ΠΈ ΡΠ±Ρ€ΠΎΡΡŒΡ‚Π΅ ΠΏΠ»Π°Ρ‚Ρƒ.
  • πŸ“€ ЗапуститС ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ:
    STM32_Programmer_CLI -c port=UART -c connect -w firmware.hex 0x08000000 -v

7.2. ВосстановлСниС Ρ‡Π΅Ρ€Π΅Π· USB DFU

Если ваш STM32 ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ USB DFU (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, STM32F103 ΠΈΠ»ΠΈ STM32F4), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅:

# ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π² Ρ€Π΅ΠΆΠΈΠΌ DFU (BOOT0=1, сброс)

dfu-util -a 0 -D firmware.bin --dfuse-address 0x08000000:leave

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Ссли Π±Ρ‹Π» Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ RDP2 (Π½Π΅ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠΌΠΎΠ΅ стираниС), восстановлСниС Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ЕдинствСнный Π²Ρ‹Ρ…ΠΎΠ΄ β€” полная ΠΏΠ΅Ρ€Π΅ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠ° Ρ‡Π΅Ρ€Π΅Π· bootloader с ΠΏΠΎΡ‚Π΅Ρ€Π΅ΠΉ всСх Π΄Π°Π½Π½Ρ‹Ρ… Π²ΠΎ Flash.

8. ΠŸΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Π΅ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ: ΠΎΡ‚Π»Π°Π΄ΠΊΠ° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ

CLI-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΡˆΠΈΠ²Π°Ρ‚ΡŒ, Π½ΠΎ ΠΈ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ STM32 Π½Π° Π½ΠΈΠ·ΠΊΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ β€” ΠΎΡ‚ чтСния рСгистров Π΄ΠΎ Π΄Π°ΠΌΠΏΠ° памяти.

8.1. Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись памяти Ρ‡Π΅Ρ€Π΅Π· OpenOCD

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ:

# Π§Ρ‚Π΅Π½ΠΈΠ΅ рСгистра PC (Program Counter)

telnet localhost 4444

> reg pc

pc (/32): 0x08001A4C

# Π—Π°ΠΏΠΈΡΡŒ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎ адрСсу 0x20000000)

> mww 0x20000000 0xDEADBEEF

# Π”Π°ΠΌΠΏ памяти

> dump_image dump.bin 0x08000000 0x1000

8.2. Π Π°Π±ΠΎΡ‚Π° с Option Bytes

Option Bytes Π² STM32 ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ Π·Π°Ρ‰ΠΈΡ‚ΠΎΠΉ, Ρ‚Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ чтСния ΠΈ записи Ρ‡Π΅Ρ€Π΅Π· STM32CubeProgrammer:

# Π§Ρ‚Π΅Π½ΠΈΠ΅ Option Bytes

STM32_Programmer_CLI -c port=SWD -c connect -ob read

# Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π·Π°Ρ‰ΠΈΡ‚Ρ‹ (RDP=0)

STM32_Programmer_CLI -c port=SWD -c connect -ob rdp=0

# Настройка уровня Π·Π°Ρ‰ΠΈΡ‚Ρ‹ (RDP=1)

STM32_Programmer_CLI -c port=SWD -c connect -ob rdp=1

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅: установка RDP=2 (полная Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°) Π½Π΅ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠΌΠΎ стираСт Flash ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ восстановлСниС Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ.

FAQ: ЧастыС вопросы ΠΏΠΎ STM32 Programmer CLI

МоТно Π»ΠΈ ΠΏΡ€ΠΎΡˆΠΈΠ²Π°Ρ‚ΡŒ STM32 Ρ‡Π΅Ρ€Π΅Π· CLI Π±Π΅Π· ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ UART)?

Π”Π°, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Π² ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π΅ Π½Π΅ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Ρ‘Π½ встроСнный bootloader. Для этого:

  1. УстановитС BOOT0=1 ΠΈ ΡΠ±Ρ€ΠΎΡΡŒΡ‚Π΅ ΠΏΠ»Π°Ρ‚Ρƒ.
  2. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ STM32CubeProgrammer с Ρ„Π»Π°Π³ΠΎΠΌ -c port=UART.

Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ ΠΏΠΎ UART Π½ΠΈΠΆΠ΅ (~5–10 ΠšΠ‘/с), Π½ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΄Π°ΠΆΠ΅ Ссли SWD/JTAG нСдоступны.

Как ΠΏΡ€ΠΎΡˆΠΈΡ‚ΡŒ STM32H7, Ссли STM32CubeProgrammer Π²Ρ‹Π΄Π°Ρ‘Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ "Unknown device"?

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ε…Έεž‹Ρ‡Π½Π° для Π½ΠΎΠ²Ρ‹Ρ… сСмСйств (STM32H7, STM32G4). РСшСния:

  • ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ STM32CubeProgrammer Π΄ΠΎ послСднСй вСрсии (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, v2.15.0+).
  • Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ сСмСйство Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ:
    STM32_Programmer_CLI -c port=SWD -c connect -c device=STM32H743xx
  • Если ошибка остаётся, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ OpenOCD с Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠΌ для STM32H7.
ΠŸΠΎΡ‡Π΅ΠΌΡƒ st-flash ΠΏΡ€ΠΎΡˆΠΈΠ²Π°Π΅Ρ‚ быстрСС STM32CubeProgrammer?

st-flash ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΎΠ±ΠΌΠ΅Π½Π° с ST-Link, минимизируя Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ. STM32CubeProgrammer Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ врСмя Π½Π°:

  • Π’Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сСктора.
  • Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (Π΄Π°ΠΆΠ΅ Π² Ρ‚ΠΈΡ…ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅).
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² (UART, I2C).

Для максимальной скорости Π² st-flash ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„Π»Π°Π³ --reset вмСсто ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ сброса.

Как ΠΏΡ€ΠΎΡˆΠΈΡ‚ΡŒ STM32 Ρ‡Π΅Ρ€Π΅Π· CLI Π½Π° macOS?

На macOS процСсс Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ Linux, Π½ΠΎ Π΅ΡΡ‚ΡŒ Π½ΡŽΠ°Π½ΡΡ‹:

  1. УстановитС STM32CubeProgrammer ΠΈΠ»ΠΈ OpenOCD Ρ‡Π΅Ρ€Π΅Π· Homebrew:
    brew install stm32flash openocd
  2. Для ST-Link ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ CP210x (Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ»ΠΎΠ½).
  3. ΠŸΡ€Π°Π²Π° доступа Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· udev-ΠΏΡ€Π°Π²ΠΈΠ»Π° (ΠΊΠ°ΠΊ Π² Linux).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ Ρ‡Π΅Ρ€Π΅Π· st-flash:

st-flash --reset write firmware.bin 0x08000000

МоТно Π»ΠΈ ΠΏΡ€ΠΎΡˆΠΈΠ²Π°Ρ‚ΡŒ STM32 Ρ‡Π΅Ρ€Π΅Π· CLI ΠΏΠΎ сСти (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎ SSH)?

Π”Π°, это стандартная ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° для ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ управлСния. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

  1. На Ρ†Π΅Π»Π΅Π²ΠΎΠΌ устройствС (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Raspberry Pi с ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹ΠΌ ST-Link) установитС STM32CubeProgrammer.
  2. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ΡΡŒ ΠΏΠΎ SSH ΠΈ запуститС ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ:
    ssh user@raspberrypi "STM32_Programmer_CLI -c port=SWD -c connect -w firmware.hex 0x08000000"
  3. Для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ sshpass ΠΈΠ»ΠΈ ΠΊΠ»ΡŽΡ‡ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ.