Π£ΡΠΈΠ»ΠΈΡΠ° STM32 Cube Programmer ΠΎΡ STMicroelectronics ΡΡΠ°Π»Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ Π΄Π»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ² ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π° STM32. ΠΠ½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π²ΡΠ΅ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ΅ΡΠΈΠΈ β ΠΎΡ Π±ΡΠ΄ΠΆΠ΅ΡΠ½ΡΡ
STM32F0 Π΄ΠΎ Π²ΡΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΡΡ
STM32H7, ΠΏΡΠ΅Π΄Π»Π°Π³Π°Ρ Π³ΠΈΠ±ΠΊΠΈΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ ΡΠ΅ΡΠ΅Π· ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ SWD, JTAG ΠΈ Π΄Π°ΠΆΠ΅ USB DFU. ΠΠΎ Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΈΡΠΎΠΊΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡΡ Ρ ΡΡΡΠ΄Π½ΠΎΡΡΡΠΌΠΈ: ΠΎΡ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ Ρ Π·Π°ΡΠΈΡΡΠ½Π½ΡΠΌΠΈ ΠΎΠ±Π»Π°ΡΡΡΠΌΠΈ ΠΏΠ°ΠΌΡΡΠΈ.
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ°Π·Π±Π΅ΡΡΠΌ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π±Π°Π·ΠΎΠ²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ (ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ°, ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, ΠΏΡΠΎΡΠΈΠ²ΠΊΠ°), Π½ΠΎ ΠΈ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΡΠΈΡΠΌΡ ΡΠ°Π±ΠΎΡΡ Ρ Π·Π°ΡΠΈΡΠΎΠΉ ΠΎΡ ΡΡΠ΅Π½ΠΈΡ (RDP), Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ "ΠΊΠΈΡΠΏΠΈΡΠ΅ΠΉ" ΡΠ΅ΡΠ΅Π· UART, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΡΠΊΠΎΡΠΎΡΡΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π΄Π»Ρ ΠΌΠ°ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π°. ΠΡΠΎΠ±ΠΎΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡΠ΄Π΅Π»ΠΈΠΌ ΡΠΈΠΏΠΈΡΠ½ΡΠΌ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌ β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠ³Π΄Π° STM32CubeProgrammer "Π½Π΅ Π²ΠΈΠ΄ΠΈΡ" ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ ΠΈΠ»ΠΈ Π²ΡΠ΄Π°ΡΡ Error: No STM32 target found, β ΠΈ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌ ΠΈΡ
ΡΡΡΡΠ°Π½Π΅Π½ΠΈΡ Π±Π΅Π· ΠΏΠΎΠΊΡΠΏΠΊΠΈ Π΄ΠΎΡΠΎΠ³ΠΎΡΡΠΎΡΡΠΈΡ
ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠΎΠ².
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ STM32 Cube Programmer ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΎΠ½ Π½ΡΠΆΠ΅Π½
Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ STM32CubeIDE (ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΠΎΠΉ ΡΡΠ΅Π΄Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ), STM32 Cube Programmer β ΡΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠΌ. ΠΠ³ΠΎ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ:
- πΉ ΠΡΠΎΡΠΈΠ²ΠΊΠ° ΡΠ΅ΡΠ΅Π·
SWD,JTAG,USB(DFU) ΠΈΠ»ΠΈUART(Π΄Π»Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ). - πΉ Π§ΡΠ΅Π½ΠΈΠ΅/Π·Π°ΠΏΠΈΡΡ ΠΏΠ°ΠΌΡΡΠΈ:
Flash,SRAM,OTP(ΠΎΠ΄Π½ΠΎΠΊΡΠ°ΡΠ½ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ΅ΠΌΠ°Ρ ΠΏΠ°ΠΌΡΡΡ). - πΉ Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π·Π°ΡΠΈΡΠΎΠΉ: ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΡΠΎΠ²Π½Π΅ΠΉ
RDP(Read Protection) ΠΈWRP(Write Protection). - πΉ ΠΡΠ»Π°Π΄ΠΊΠ°: ΡΠ±ΡΠΎΡ, Π·Π°ΠΏΡΡΠΊ/ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ΄ΡΠ°, ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΎΠ².
- πΉ ΠΠ°ΡΡΠΎΠ²ΠΎΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ: ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠΊΡΠΈΠΏΡΠΎΠ² Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ ΠΏΠ°ΡΡΠΈΠΉ ΡΡΡΡΠΎΠΉΡΡΠ².
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠ°ΡΠΏΠΎΠ·Π½Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ 1000 ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ STM32, Π²ΠΊΠ»ΡΡΠ°Ρ Π½ΠΎΠ²Π΅ΠΉΡΠΈΠ΅ STM32U5 ΠΈ STM32WBA (Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ Bluetooth 5.3). ΠΠ°ΠΆΠ½ΠΎ, ΡΡΠΎ ΠΎΠ½Π° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΊΠ°ΠΊ Ρ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΌΠΈ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ°ΠΌΠΈ (ST-Link, J-Link), ΡΠ°ΠΊ ΠΈ Ρ Π΄Π΅ΡΡΠ²ΡΠΌΠΈ ΠΊΠ»ΠΎΠ½Π°ΠΌΠΈ Π½Π° Π±Π°Π·Π΅ CH340 ΠΈΠ»ΠΈ FT232 β ΠΏΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠ².
ΠΠ»Π°Π²Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ ΠΏΠ΅ΡΠ΅Π΄ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π°ΠΌΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, OpenOCD ΠΈΠ»ΠΈ J-Flash) β Π²ΡΡΡΠΎΠ΅Π½Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π²ΡΠ΅Ρ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ STM32, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ:
- π§ ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
Option Bytes(Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π·Π°Π³ΡΡΠ·ΡΠΈΠΊΠ°, ΡΡΠΎΠ²Π½Ρ Π·Π°ΡΠΈΡΡ). - π§ Π Π°Π±ΠΎΡΠ° Ρ
Dual-Bank Flash(Π΄Π»Ρ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ² Ρ Π΄Π²ΡΠΌΡ Π±Π°Π½ΠΊΠ°ΠΌΠΈ ΠΏΠ°ΠΌΡΡΠΈ). - π§ ΠΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π·
UART Bootloader(Π΅ΡΠ»ΠΈ SWD Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½).
- SWD
- JTAG
- USB DFU
- UART
- ΠΡΡΠ³ΠΎΠΉ
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΈ ΠΏΠ΅ΡΠ²ΠΎΠ΅ Π·Π°ΠΏΡΡΠΊ: ΠΏΠΎΡΠ°Π³ΠΎΠ²Π°Ρ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄ΠΎΡΡΡΠΏΠ½Π° Π΄Π»Ρ Windows, Linux ΠΈ macOS, Π½ΠΎ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π»ΡΡΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΠΎΠ΄ Windows. Π‘ΠΊΠ°ΡΠ°ΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Π²Π΅ΡΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΡΠ° ST (ΡΠ°Π·Π΄Π΅Π» Tools & Software).
ΠΠ»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π½Π° Windows:
- Π‘ΠΊΠ°ΡΠ°ΠΉΡΠ΅ Π°ΡΡ
ΠΈΠ²
en.stm32cubeprg.zip(ΠΎΠΊΠΎΠ»ΠΎ 100 ΠΠ). - Π Π°ΡΠΏΠ°ΠΊΡΠΉΡΠ΅ Π΅Π³ΠΎ Π² ΠΏΠ°ΠΏΠΊΡ Π±Π΅Π· ΠΊΠΈΡΠΈΠ»Π»ΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,
C:\STM32\CubeProgrammer). - ΠΠ°ΠΏΡΡΡΠΈΡΠ΅
SetupSTM32CubeProgrammer-x.x.x.exeΠΎΡ ΠΈΠΌΠ΅Π½ΠΈ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ°. - Π ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΎΡΠΌΠ΅ΡΡΡΠ΅ Π³Π°Π»ΠΎΡΠΊΠΎΠΉ
Add to PATHβ ΡΡΠΎ ΡΠΏΡΠΎΡΡΠΈΡ Π·Π°ΠΏΡΡΠΊ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ.
ΠΠ»Ρ Linux/macOS:
- π§ Π Π°ΡΠΏΠ°ΠΊΡΠΉΡΠ΅ Π°ΡΡ
ΠΈΠ² ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΠ΅
STM32CubeProgrammerΠΈΠ· ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π° (ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡchmod +x). - π ΠΠ° macOS ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Π΄ΡΠ°ΠΉΠ²Π΅ΡΡ Π΄Π»Ρ ST-Link ΡΠ΅ΡΠ΅Π·
Homebrew:
brew install --cask stlink
ΠΠΎΡΠ»Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ² ΠΎΡΠ»Π°Π΄ΡΠΈΠΊ ST-Link ΠΊ ΠΠ ΠΈ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΡ. Π Π³Π»Π°Π²Π½ΠΎΠΌ ΠΎΠΊΠ½Π΅ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ Connection Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡΡΡ ΠΏΠΎΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ST-Link (SWD)).
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π΄ΡΠ°ΠΉΠ²Π΅ΡΡ Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ° (ST-Link/J-Link)
ΠΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊ ΠΊ ΠΠ ΠΈ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΡ
ΠΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΠ»Π°ΡΡ (3.3V ΠΈΠ»ΠΈ 5V)
ΠΠ°ΠΏΡΡΡΠΈΡΡ STM32CubeProgrammer ΠΎΡ ΠΈΠΌΠ΅Π½ΠΈ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ°
ΠΡΠ±ΡΠ°ΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ (SWD/JTAG) Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ -->
ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ: ΡΠ°Π·Π±ΠΎΡ ΠΊΠ»ΡΡΠ΅Π²ΡΡ Π²ΠΊΠ»Π°Π΄ΠΎΠΊ
ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ STM32 Cube Programmer ΡΠ°Π·Π΄Π΅Π»Π΅Π½ Π½Π° 5 ΠΎΡΠ½ΠΎΠ²Π½ΡΡ Π²ΠΊΠ»Π°Π΄ΠΎΠΊ, ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΈΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ:
| ΠΠΊΠ»Π°Π΄ΠΊΠ° | ΠΠ°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ | ΠΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ |
|---|---|---|
Erasing & Programming |
ΠΡΠΎΡΠΈΠ²ΠΊΠ° ΠΈ ΡΡΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ |
|
Option Bytes |
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π·Π°ΡΠΈΡΡΠ½Π½ΡΡ ΠΎΠ±Π»Π°ΡΡΠ΅ΠΉ |
|
OB (User Configuration) |
ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ |
|
ΠΠ° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Erasing & Programming ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Verify programming β ΠΎΠ½ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ²Π΅ΡΡΠ΅Ρ Π·Π°ΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Ρ ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠΌ. ΠΡΠΎ ΠΊΡΠΈΡΠΈΡΠ½ΠΎ Π΄Π»Ρ ΡΠ΅ΡΠΈΠΉΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π°, Π³Π΄Π΅ ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ Π΄Π°ΠΆΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ Π±ΡΠ°ΠΊΡ Π²ΡΠ΅ΠΉ ΠΏΠ°ΡΡΠΈΠΈ.
ΠΠΊΠ»Π°Π΄ΠΊΠ° Option Bytes ΡΡΠ΅Π±ΡΠ΅Ρ ΠΎΡΠΎΠ±ΠΎΠΉ ΠΎΡΡΠΎΡΠΎΠΆΠ½ΠΎΡΡΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° RDP Level 2 Π½Π΅ΠΎΠ±ΡΠ°ΡΠΈΠΌΠΎ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΏΠ°ΠΌΡΡΠΈ ΡΠ΅ΡΠ΅Π· SWD/JTAG, ΠΈ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ΅Π· UART Bootloader (Π΅ΡΠ»ΠΈ ΠΎΠ½ Π½Π΅ ΠΎΡΠΊΠ»ΡΡΡΠ½).
ΠΠ΅ΡΠ΅Π΄ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Option Bytes Π²ΡΠ΅Π³Π΄Π° Π΄Π΅Π»Π°ΠΉΡΠ΅ ΡΠ΅Π·Π΅ΡΠ²Π½ΡΡ ΠΊΠΎΠΏΠΈΡ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΡΠ΅ΡΠ΅Π· ΠΊΠ½ΠΎΠΏΠΊΡ Save Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ OB (User Configuration).
ΠΡΠΎΡΠΈΠ²ΠΊΠ° ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°: ΠΏΠΎΡΠ°Π³ΠΎΠ²ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° STM32F407G (ΠΏΠΎΠΏΡΠ»ΡΡΠ½Π°Ρ ΠΏΠ»Π°ΡΠ° STM32F4 Discovery). ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ, ΡΡΠΎ Ρ Π²Π°Ρ ΡΠΆΠ΅ Π΅ΡΡΡ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ .hex.
Π¨Π°Π³ 1. ΠΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ
- ΠΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΠ΅ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊ ST-Link ΠΊ ΠΏΠ»Π°ΡΠ΅ (ΡΠ°Π·ΡΡΠΌ
SWD:CLK,DIO,GND,3.3V). - Π STM32 Cube Programmer Π²ΡΠ±Π΅ΡΠΈΡΠ΅:
- ΠΠΎΡΡ:
ST-Link - ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ:
SWD - Π‘ΠΊΠΎΡΠΎΡΡΡ:
Normal(Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ) ΠΈΠ»ΠΈFast(ΠΏΠΎΡΠ»Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠ°).
- ΠΠΎΡΡ:
Connect. Π Π»ΠΎΠ³Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΡΠ²ΠΈΡΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Connected to target.Π¨Π°Π³ 2. ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ
- ΠΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΡ
Erasing & Programming. - Π ΠΏΠΎΠ»Π΅
File PathΡΠΊΠ°ΠΆΠΈΡΠ΅ ΠΏΡΡΡ ΠΊ ΡΠ°ΠΉΠ»Ρ.hex. - Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²ΡΠ±ΡΠ°Π½ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ Π°Π΄ΡΠ΅Ρ Π½Π°ΡΠ°Π»Π° ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ (ΠΎΠ±ΡΡΠ½ΠΎ
0x08000000Π΄Π»ΡFlash). - ΠΠ°ΠΆΠΌΠΈΡΠ΅
Start Programming.
ΠΡΠΎΡΠ΅ΡΡ Π·Π°ΠΉΠΌΡΡ ΠΎΡ 5 Π΄ΠΎ 30 ΡΠ΅ΠΊΡΠ½Π΄ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ ΠΈ ΡΠΊΠΎΡΠΎΡΡΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. ΠΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π² Π»ΠΎΠ³Π΅ ΠΏΠΎΡΠ²ΠΈΡΡΡ Verification OK.
Π§ΡΠΎ Π΄Π΅Π»Π°ΡΡ Π΅ΡΠ»ΠΈ ΠΏΡΠΎΡΠΈΠ²ΠΊΠ° "Π·Π°Π²ΠΈΡΠ°Π΅Ρ" Π½Π° 99%?
Π§Π°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠΎΠΉ Option Bytes ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠΌ Π·Π°ΡΠΈΡΡΠ½Π½ΡΡ
ΠΎΠ±Π»Π°ΡΡΠ΅ΠΉ. ΠΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅:
1. ΠΡΠΊΠ»ΡΡΠΈΡΡ ΠΎΠΏΡΠΈΡ Verify programming ΠΈ ΠΏΠΎΠ²ΡΠΎΡΠΈΡΡ ΠΏΡΠΎΡΠΈΠ²ΠΊΡ.
2. Π£ΠΌΠ΅Π½ΡΡΠΈΡΡ ΡΠΊΠΎΡΠΎΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π΄ΠΎ Low.
3. ΠΡΠΎΠ²Π΅ΡΠΈΡΡ, Π½Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Π»ΠΈ RDP Level 1/2 (ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΡΡΠΈΡΠ°Π½ΠΈΠ΅ ΡΠΈΠΏΠ°).
Π Π°Π±ΠΎΡΠ° Ρ Π·Π°ΡΠΈΡΠΎΠΉ: RDP ΠΈ WRP
Π‘ΠΈΡΡΠ΅ΠΌΠ° Π·Π°ΡΠΈΡΡ STM32 Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π΄Π²Π° ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ°:
- π
RDP (Read Protection)β Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ ΡΠ΅ΡΠ΅Π· ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ. - π
WRP (Write Protection)β Π·Π°ΡΠΈΡΠ°Π΅Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠ΅ΠΊΡΠΎΡΠ°FlashΠΎΡ Π·Π°ΠΏΠΈΡΠΈ.
Π£ΡΠΎΠ²Π½ΠΈ RDP:
Level 0β Π·Π°ΡΠΈΡΠ° ΠΎΡΠΊΠ»ΡΡΠ΅Π½Π° (Π΄ΠΎΡΡΡΠΏ ΠΊΠΎ Π²ΡΠ΅ΠΉ ΠΏΠ°ΠΌΡΡΠΈ).Level 1β ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΎ, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠ΅ΡΠ΅ΡΡ ΡΠΈΠΏ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΈ ΡΠ½ΡΡΡ Π·Π°ΡΠΈΡΡ.Level 2β Π½Π΅ΠΎΠ±ΡΠ°ΡΠΈΠΌΠ°Ρ Π·Π°ΡΠΈΡΠ°: ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΌΠ°ΡΡΠΎΠ²ΠΎΠ΅ ΡΡΠΈΡΠ°Π½ΠΈΠ΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Ρ. ΠΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ΅Π·UART Bootloader(Π΅ΡΠ»ΠΈ ΠΎΠ½ Π½Π΅ ΠΎΡΠΊΠ»ΡΡΡΠ½ Π²Option Bytes).
Π§ΡΠΎΠ±Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ RDP Level 1:
- ΠΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΠ΅ΡΡ ΠΊ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΡ.
- ΠΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΡ
Option Bytes. - Π ΡΠ°Π·Π΄Π΅Π»Π΅
Read ProtectionΠ²ΡΠ±Π΅ΡΠΈΡΠ΅Level 1. - ΠΠ°ΠΆΠΌΠΈΡΠ΅
Apply.
β οΈ ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠΡΠ»ΠΈ Π²Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅RDP Level 2ΠΈ Π·Π°Π±ΡΠ΄Π΅ΡΠ΅ ΠΏΠ°ΡΠΎΠ»Ρ (ΠΈΠ»ΠΈ ΠΎΡΠΊΠ»ΡΡΠΈΡΠ΅UART Bootloader), Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ Π±ΡΠ΄Π΅Ρ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π±Π΅Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ChipWhisperer Π΄Π»Ρ glitch-Π°ΡΠ°ΠΊ).
ΠΠ»Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ WRP (Π·Π°ΡΠΈΡΡ ΠΎΡ Π·Π°ΠΏΠΈΡΠΈ):
- ΠΠ° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅
Option BytesΠ½Π°ΠΉΠ΄ΠΈΡΠ΅ ΡΠ°Π·Π΄Π΅Π»Write Protection. - Π£ΠΊΠ°ΠΆΠΈΡΠ΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ ΡΠ΅ΠΊΡΠΎΡΠ°
Flash, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ Π·Π°ΡΠΈΡΠΈΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,Sector 0-3Π΄Π»Ρ Π·Π°Π³ΡΡΠ·ΡΠΈΠΊΠ°). - ΠΡΠΈΠΌΠ΅Π½ΠΈΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ
Apply.
ΠΡΠ΅Π³Π΄Π° ΡΠ΅ΡΡΠΈΡΡΠΉΡΠ΅ Π·Π°ΡΠΈΡΡ Π½Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄ ΠΌΠ°ΡΡΠΎΠ²ΡΠΌ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎΠΌ. ΠΡΠΈΠ±ΠΊΠ° Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ Option Bytes ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ Π±ΡΠ°ΠΊΡ Π²ΡΠ΅ΠΉ ΠΏΠ°ΡΡΠΈΠΈ ΡΡΡΡΠΎΠΉΡΡΠ².
ΠΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ "ΠΊΠΈΡΠΏΠΈΡΠ°": ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ Π΅ΡΠ»ΠΈ STM32 Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ
Π‘ΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° STM32 Cube Programmer Π²ΡΠ΄Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ No STM32 target found ΠΈΠ»ΠΈ Could not connect to target, Π·Π½Π°ΠΊΠΎΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΈΠΌ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ. ΠΡΠΈΡΠΈΠ½Ρ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ°Π·Π½ΡΠ΅:
- π ΠΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ: ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ Π½Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ
3.3VΠΈΠ»ΠΈ5V. - π ΠΠ΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ SWD: ΠΏΠ΅ΡΠ΅ΠΏΡΡΠ°Π½Ρ
CLKΠΈDIO, ΠΈΠ»ΠΈ ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ ΠΎΠ±ΡΠΈΠΉGND. - π ΠΠΏΠΏΠ°ΡΠ°ΡΠ½Π°Ρ Π·Π°ΡΠΈΡΠ°: ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½
RDP Level 2ΠΈΠ»ΠΈ ΠΎΡΠΊΠ»ΡΡΡΠ½Debug PortΠ²Option Bytes. - π ΠΠΎΠ²ΡΠ΅ΠΆΠ΄ΡΠ½ Π·Π°Π³ΡΡΠ·ΡΠΈΠΊ: Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΡΠ»Π΅ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠΉ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ ΡΠ΅ΡΠ΅Π·
USB DFU.
ΠΠ»Π³ΠΎΡΠΈΡΠΌ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ:
- ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ ΠΏΠΈΡΠ°Π½ΠΈΠ΅: ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΠ΅ ΠΎΡΡΠΈΠ»Π»ΠΎΠ³ΡΠ°Ρ ΠΊ Π²ΡΠ²ΠΎΠ΄Ρ
VCAP(Π΅ΡΠ»ΠΈ Π΅ΡΡΡ) ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅ΡΡΡΠ΅ Π½Π°ΠΏΡΡΠΆΠ΅Π½ΠΈΠ΅ Π½Π°VDDΠΌΡΠ»ΡΡΠΈΠΌΠ΅ΡΡΠΎΠΌ. - ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ SWD-ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅:
- Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ
NRSTΠ½Π΅ Π·Π°ΠΌΠΊΠ½ΡΡ Π½Π° Π·Π΅ΠΌΠ»Ρ. - ΠΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΡΠΊΠΎΡΠΎΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π΄ΠΎ
Low.
- Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ
- ΠΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· UART (Π΅ΡΠ»ΠΈ SWD Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½):
- ΠΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΠ΅
UART1(TX,RX,GND) ΠΊ ΠΠ. - ΠΠ°ΠΌΠΊΠ½ΠΈΡΠ΅ ΠΏΠΈΠ½
BOOT0Π½Π°3.3VΠΈ ΠΏΠΎΠ΄Π°ΠΉΡΠ΅ ΡΠ±ΡΠΎΡ. - Π STM32 Cube Programmer Π²ΡΠ±Π΅ΡΠΈΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ
UARTΠΈ ΠΏΠΎΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,COM3). - ΠΠ°Π³ΡΡΠ·ΠΈΡΠ΅ ΠΏΡΠΎΡΠΈΠ²ΠΊΡ ΡΠ΅ΡΠ΅Π·
UART Bootloader(ΡΠΊΠΎΡΠΎΡΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ β115200 Π±ΠΎΠ΄).
- ΠΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΠ΅
ΠΡΠ»ΠΈ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ Π²ΡΡ ΡΠ°Π²Π½ΠΎ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ, ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅:
- π§ ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΡΡΠ³ΠΎΠΉ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, J-Link Π²ΠΌΠ΅ΡΡΠΎ ST-Link).
- π§ ΠΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ Π²Π½Π΅ΡΠ½ΠΈΠΉ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ ΠΏΠΈΡΠ°Π½ΠΈΡ (ΠΈΠ½ΠΎΠ³Π΄Π° USB-ΠΏΠΎΡΡ ΠΠ Π½Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΡΠΉ ΡΠΎΠΊ).
- π§ ΠΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΠ΅ΠΏΠΈ
NRSTΠΈBOOT0Π½Π° ΠΊΠΎΡΠΎΡΠΊΠΎΠ΅ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΠ΅.
β οΈ ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠΡΠΈ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΡΠ΅ΡΠ΅Π·UART BootloaderΠ½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ STM32 (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, STM32L4) ΡΡΠ΅Π±ΡΡΡ ΠΏΠΎΠ΄Π°ΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ0x7FΠ΄Π»Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ. Π STM32 Cube Programmer ΡΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ, Π½ΠΎ ΠΏΡΠΈ ΡΡΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΠ΅ ΡΠ΅ΡΠ΅Π·PuTTYΠΈΠ»ΠΈTera TermΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ ΠΎΡΠΏΡΠ°Π²ΠΊΠ° ΡΡΠΎΠ³ΠΎ Π±Π°ΠΉΡΠ° Π²ΡΡΡΠ½ΡΡ.
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ Π΄Π»Ρ ΠΌΠ°ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π°
ΠΠ»Ρ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ ΠΏΠ°ΡΡΠΈΠΉ ΡΡΡΡΠΎΠΉΡΡΠ² (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, 100+ ΠΏΠ»Π°Ρ) Π²ΡΡΡΠ½ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ STM32 Cube Programmer Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ ΡΠΊΡΠΈΠΏΡΠΎΠ² ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ.
Π‘ΠΏΠΎΡΠΎΠ± 1: ΠΠΎΠΌΠ°Π½Π΄Π½Π°Ρ ΡΡΡΠΎΠΊΠ°
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π·Π°ΠΏΡΡΠΊ ΠΈΠ· CMD ΠΈΠ»ΠΈ Bash Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ. ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π΄Π»Ρ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ:
STM32_Programmer_CLI.exe -c port=SWD -w "firmware.hex" -v -rst
ΠΠ΄Π΅:
-c port=SWDβ Π²ΡΠ±ΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°.-w "firmware.hex"β ΡΠ°ΠΉΠ» ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ.-vβ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΠΎΡΠ»Π΅ Π·Π°ΠΏΠΈΡΠΈ.-rstβ ΡΠ±ΡΠΎΡ ΠΏΠΎΡΠ»Π΅ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ.
Π‘ΠΏΠΎΡΠΎΠ± 2: Π‘ΠΊΡΠΈΠΏΡΡ (TCL)
ΠΠ»Ρ ΡΠ»ΠΎΠΆΠ½ΡΡ
ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π² (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΎΡΠΈΠ²ΠΊΠ° + Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Option Bytes + ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° CRC) ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠΊΡΠΈΠΏΡ Π½Π° TCL. ΠΡΠΈΠΌΠ΅Ρ:
ST-Link_SWD.connect
ST-Link_SWD.write_memory 0x08000000 "firmware.bin"
ST-Link_SWD.verify_memory 0x08000000 "firmware.bin"
ST-Link_SWD.reset
Π‘ΠΊΡΠΈΠΏΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π·:
STM32_Programmer_CLI.exe -script "flash.tcl"
Π‘ΠΏΠΎΡΠΎΠ± 3: ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ Python
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ pystm32 (ΠΈΠ»ΠΈ Π²ΡΠ·ΠΎΠ²ΠΎΠ² subprocess) ΠΌΠΎΠΆΠ½ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΠΈΠ· Python-ΡΠΊΡΠΈΠΏΡΠ°. ΠΡΠΈΠΌΠ΅Ρ:
import subprocess
result = subprocess.run([
"STM32_Programmer_CLI.exe",
"-c", "port=SWD",
"-w", "app.bin",
"-ob", "RDP=1", # Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ RDP Level 1
"-v"
], capture_output=True, text=True)
print(result.stdout)
ΠΠ»Ρ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ Π² ΡΠ΅ΡΠΈΠΉΠ½ΠΎΠΌ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅:
- π ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅
FastΠΈΠ»ΠΈVery FastΡΠΊΠΎΡΠΎΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° (Π΅ΡΠ»ΠΈ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΡΡΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ). - π ΠΡΠΊΠ»ΡΡΠΈΡΠ΅ Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ (
-v) Π΄Π»Ρ ΡΠΆΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΡ ΠΏΡΠΎΡΠΈΠ²ΠΎΠΊ. - π ΠΠΎΠ΄ΠΊΠ»ΡΡΠ°ΠΉΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠΎΠ² ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΠ ΡΠ΅ΡΠ΅Π· USB-Ρ Π°Π± (Π½ΠΎ ΡΡΠΈΡΡΠ²Π°ΠΉΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠΎΠΊΡ).
FAQ: ΠΎΡΠ²Π΅ΡΡ Π½Π° ΡΠ°ΡΡΡΠ΅ Π²ΠΎΠΏΡΠΎΡΡ
ΠΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΏΡΠΎΡΠΈΡΡ STM32 Π±Π΅Π· ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ° (ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ΅Π· USB)?
ΠΠ°, Π΅ΡΠ»ΠΈ Π²Π°Ρ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ USB DFU (Device Firmware Update). ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ:
- ΠΠΊΡΠΈΠ²ΠΈΡΡΠΉΡΠ΅
USB DFUΠ² ΠΏΡΠΎΠ΅ΠΊΡΠ΅ (ΡΠ΅ΡΠ΅Π· STM32CubeMX ΠΈΠ»ΠΈ Π²ΡΡΡΠ½ΡΡ). - ΠΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΠ΅ ΠΏΠ»Π°ΡΡ ΠΊ ΠΠ ΠΏΠΎ USB (ΠΏΠΎΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡΡΡ ΠΊΠ°ΠΊ
STM32 BOOTLOADER). - Π STM32 Cube Programmer Π²ΡΠ±Π΅ΡΠΈΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ
USBΠΈ Π·Π°Π³ΡΡΠ·ΠΈΡΠ΅ ΠΏΡΠΎΡΠΈΠ²ΠΊΡ.
ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅: USB DFU ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ Π·Π°Π³ΡΡΠ·ΡΠΈΠΊ Π½Π΅ ΠΏΠΎΠ²ΡΠ΅ΠΆΠ΄ΡΠ½ ΠΈ Π½Π΅ ΠΎΡΠΊΠ»ΡΡΡΠ½ Π² Option Bytes.
ΠΠ°ΠΊ ΡΠ±ΡΠΎΡΠΈΡΡ RDP Level 2, Π΅ΡΠ»ΠΈ UART Bootloader ΠΎΡΠΊΠ»ΡΡΡΠ½?
ΠΡΠ»ΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ RDP Level 2 ΠΈ ΠΎΡΠΊΠ»ΡΡΡΠ½ UART Bootloader, ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠΠ°ΡΠΈΠ°Π½ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΡ:
- π§ ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ glitch-Π°ΡΠ°ΠΊΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅ΡΠ΅Π· ChipWhisperer ΠΈΠ»ΠΈ ΡΠ°ΠΌΠΎΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΡ Π΅ΠΌΡ Π½Π° FPGA).
- π§ ΠΠ±ΡΠ°ΡΠΈΡΡΡΡ Π² ΡΠ΅ΡΠ²ΠΈΡΠ½ΡΠΉ ΡΠ΅Π½ΡΡ STMicroelectronics (Π΄Π»Ρ ΡΠ΅ΡΠΈΠΉΠ½ΡΡ Π·Π°ΠΊΠ°Π·ΡΠΈΠΊΠΎΠ²).
- π§ ΠΠ°ΠΌΠ΅Π½ΠΈΡΡ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ (Π΅ΡΠ»ΠΈ ΡΡΠΎ Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎ ΠΏΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²Π°).
Π Π±ΡΠ΄ΡΡΠ΅ΠΌ ΠΈΠ·Π±Π΅Π³Π°ΠΉΡΠ΅ RDP Level 2 Π±Π΅Π· ΡΠ΅Π·Π΅ΡΠ²Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ!
ΠΠΎΡΠ΅ΠΌΡ STM32 Cube Programmer Π½Π΅ Π²ΠΈΠ΄ΠΈΡ ST-Link?
Π§Π°ΡΡΡΠ΅ ΠΏΡΠΈΡΠΈΠ½Ρ:
- π ΠΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Ρ Π΄ΡΠ°ΠΉΠ²Π΅ΡΡ (ΡΠΊΠ°ΡΠ°ΠΉΡΠ΅ STSW-LINK009 Ρ ΡΠ°ΠΉΡΠ° ST).
- π ΠΠΎΠ½ΡΠ»ΠΈΠΊΡ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°ΠΌΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, STM32CubeIDE ΠΈΠ»ΠΈ Keil Π·Π°Π½ΠΈΠΌΠ°ΡΡ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊ).
- π ΠΠ΅ΠΈΡΠΏΡΠ°Π²Π½ΡΠΉ ΠΊΠ°Π±Π΅Π»Ρ ΠΈΠ»ΠΈ ΠΏΠΎΡΡ USB (ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ Π΄ΡΡΠ³ΠΎΠΉ ΡΠ°Π·ΡΡΠΌ).
- π ΠΠ»ΠΎΠ½ ST-Link Π½Π° Π±Π°Π·Π΅ CH340 ΡΡΠ΅Π±ΡΠ΅Ρ ΡΡΡΠ½ΠΎΠΉ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠ².
Π Π΅ΡΠ΅Π½ΠΈΠ΅: ΠΏΠ΅ΡΠ΅ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Π΄ΡΠ°ΠΉΠ²Π΅ΡΡ, ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ ΠΠΈΡΠΏΠ΅ΡΡΠ΅Ρ ΡΡΡΡΠΎΠΉΡΡΠ² (Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ ST-Link Virtual COM Port).
ΠΠ°ΠΊ ΠΏΡΠΎΡΠΈΡΡ STM32 ΡΠ΅ΡΠ΅Π· JTAG Π²ΠΌΠ΅ΡΡΠΎ SWD?
ΠΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ JTAG:
- ΠΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΠ΅ 5 ΡΠΈΠ³Π½Π°Π»ΠΎΠ²:
TMS,TCK,TDI,TDO,GND. - Π STM32 Cube Programmer Π²ΡΠ±Π΅ΡΠΈΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ
JTAG. - Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²
Option BytesΠ½Π΅ ΠΎΡΠΊΠ»ΡΡΡΠ½JTAG-DP(ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΎΠ½ Π²ΠΊΠ»ΡΡΡΠ½).
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: JTAG ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ SWD, Π½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΡΠ»Π°ΠΆΠΈΠ²Π°ΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ.
ΠΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΏΡΠΎΡΠΈΡΡ STM32 ΡΠ΅ΡΠ΅Π· Arduino (ΠΊΠ°ΠΊ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊ)?
ΠΠ°, Π½ΠΎ Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΠΌΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠ»Π°ΡΠ° Arduino Uno Ρ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΎΠΉ STM32duino-bootloader ΠΌΠΎΠΆΠ΅Ρ ΡΠΌΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ ST-Link ΡΠ΅ΡΠ΅Π· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ ArduinoSTM32. ΠΠ΄Π½Π°ΠΊΠΎ:
- β οΈ Π‘ΠΊΠΎΡΠΎΡΡΡ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ Π±ΡΠ΄Π΅Ρ Π½ΠΈΠ·ΠΊΠΎΠΉ (ΠΈΠ·-Π·Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ ATmega328P).
- β οΈ ΠΠ΅ Π²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ STM32 Cube Programmer Π±ΡΠ΄ΡΡ Π΄ΠΎΡΡΡΠΏΠ½Ρ.
ΠΠ»Ρ Π½Π°Π΄ΡΠΆΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ Π»ΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ ST-Link ΠΈΠ»ΠΈ J-Link.