ΠΡΠΎΡΠΈΠ²ΠΊΠ° ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ² 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 (Π°ΠΊΡΡΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ "ΠΊΠΈΡΠΏΠΈΡΠ΅ΠΉ" Π±Π΅Π· ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ°).
- STM32CubeProgrammer
- OpenOCD
- st-flash
- ΠΡΡΠ³ΠΎΠΉ (Π½Π°ΠΏΠΈΡΠΈΡΠ΅ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ )
2. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ²
ΠΡΠΎΡΠ΅ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΠ‘ ΠΈ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠΉ ΡΡΠΈΠ»ΠΈΡΡ. ΠΠ° Windows ΠΏΡΠΎΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ STM32CubeProgrammer (Π΅ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΡΠΈΠΊ), Π° Π½Π° Linux ΠΏΡΠΈΠ΄ΡΡΡΡ ΡΠΎΠ±ΠΈΡΠ°ΡΡ OpenOCD ΠΈΠ»ΠΈ st-flash ΠΈΠ· ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠΎΠ².
2.1. STM32CubeProgrammer (Windows/Linux/macOS)
ΠΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΎΡ ST ΡΠ°ΡΡΠΎ ΡΡΡΠ°ΡΠ΅Π²Π°ΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΠΎΡ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠ°Π³ΠΈ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ:
- Π‘ΠΊΠ°ΡΠ°ΠΉΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Π²Π΅ΡΡΠΈΡ Ρ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΡΠ° (Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ β
v2.15.0). - ΠΠ° Windows Π·Π°ΠΏΡΡΡΠΈΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΡΠΈΠΊ Ρ ΠΏΡΠ°Π²Π°ΠΌΠΈ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ°. ΠΠ° Linux/macOS ΡΠ°ΡΠΏΠ°ΠΊΡΠΉΡΠ΅ Π°ΡΡ
ΠΈΠ² ΠΈ Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΠΏΡΡΡ ΠΊ
bin/Π²PATH:export PATH=$PATH:/ΠΏΡΡΡ/Π΄ΠΎ/STM32CubeProgrammer/bin - ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
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.rulessudo 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. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ:
- Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅
BOOT0=1ΠΈ ΡΠ±ΡΠΎΡΡΡΠ΅ ΠΏΠ»Π°ΡΡ. - ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ 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, Π½ΠΎ Π΅ΡΡΡ Π½ΡΠ°Π½ΡΡ:
- Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ STM32CubeProgrammer ΠΈΠ»ΠΈ OpenOCD ΡΠ΅ΡΠ΅Π·
Homebrew:brew install stm32flash openocd - ΠΠ»Ρ ST-Link ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ Π΄ΡΠ°ΠΉΠ²Π΅Ρ CP210x (Π΅ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠ»ΠΎΠ½).
- ΠΡΠ°Π²Π° Π΄ΠΎΡΡΡΠΏΠ° Π½Π°ΡΡΡΠ°ΠΈΠ²Π°ΡΡΡΡ ΡΠ΅ΡΠ΅Π·
udev-ΠΏΡΠ°Π²ΠΈΠ»Π° (ΠΊΠ°ΠΊ Π² Linux).
ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π΄Π»Ρ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ ΡΠ΅ΡΠ΅Π· st-flash:
st-flash --reset write firmware.bin 0x08000000
ΠΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΏΡΠΎΡΠΈΠ²Π°ΡΡ STM32 ΡΠ΅ΡΠ΅Π· CLI ΠΏΠΎ ΡΠ΅ΡΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎ SSH)?
ΠΠ°, ΡΡΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° Π΄Π»Ρ ΡΠ΄Π°Π»ΡΠ½Π½ΠΎΠ³ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ. ΠΡΠΈΠΌΠ΅Ρ:
- ΠΠ° ΡΠ΅Π»Π΅Π²ΠΎΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²Π΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Raspberry Pi Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΡΠ½Π½ΡΠΌ ST-Link) ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ STM32CubeProgrammer.
- ΠΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΠ΅ΡΡ ΠΏΠΎ SSH ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ ΠΏΡΠΎΡΠΈΠ²ΠΊΡ:
ssh user@raspberrypi "STM32_Programmer_CLI -c port=SWD -c connect -w firmware.hex 0x08000000" - ΠΠ»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅
sshpassΠΈΠ»ΠΈ ΠΊΠ»ΡΡΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ.