Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π²ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΡ ΡΠΈΡΡΠ΅ΠΌ Π½Π° Π±Π°Π·Π΅ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ² STM32 ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ², ΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΡΡΠ΅Π΄ΠΈ Π½ΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ARM None EABI GCC. ΠΡΠΎΡ Π½Π°Π±ΠΎΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΠ°Π½ΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π½Π° C/C++ Π² ΠΌΠ°ΡΠΈΠ½Π½ΡΠΉ ΠΊΠΎΠ΄ Π΄Π»Ρ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ ARM Cortex-M, Π»Π΅ΠΆΠ°ΡΠ΅ΠΉ Π² ΠΎΡΠ½ΠΎΠ²Π΅ Π²ΡΠ΅Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ² STM32. ΠΠ΄Π½Π°ΠΊΠΎ Π΅Π³ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΡΠ°ΡΡΠΎ Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π²ΠΎΠΏΡΠΎΡΡ Ρ Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΡ β ΠΎΡ Π²ΡΠ±ΠΎΡΠ° ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ Π΄ΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Ρ IDE ΡΠΈΠΏΠ° STM32CubeIDE ΠΈΠ»ΠΈ VS Code.
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ°Π·Π±Π΅ΡΡΠΌ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π±Π°Π·ΠΎΠ²ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ, Π½ΠΎ ΠΈ Π½ΡΠ°Π½ΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ STM32 (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, STM32F103 ΠΈΠ»ΠΈ STM32H743), ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠΈΠΏΠΈΡΠ½ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ Π»ΠΈΠ½ΠΊΠΎΠ²ΡΠΈΠΊΠ°, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ HardFault ΠΈΠ·-Π·Π° Π½Π΅Π²Π΅ΡΠ½ΡΡ
ΡΠ»Π°Π³ΠΎΠ² ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ. ΠΡΠ»ΠΈ Π²Ρ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΠΈΡΡ Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ Π²ΡΠΎΠ΄Π΅ undefined reference to `_sbrk' ΠΈΠ»ΠΈ region `RAM' overflowed β Π·Π΄Π΅ΡΡ Π²Ρ Π½Π°ΠΉΠ΄ΡΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ.
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ARM None EABI GCC ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΎΠ½ Π½ΡΠΆΠ΅Π½ Π΄Π»Ρ STM32
ARM None EABI GCC β ΡΡΠΎ Π²Π΅ΡΡΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° GCC, Π°Π΄Π°ΠΏΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ Π΄Π»Ρ Π²ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΡ ΡΠΈΡΡΠ΅ΠΌ Π½Π° Π±Π°Π·Π΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠ² ARM Π±Π΅Π· ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ (ΠΎΡΡΡΠ΄Π° None Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ). ΠΠ±Π±ΡΠ΅Π²ΠΈΠ°ΡΡΡΠ° EABI (Embedded Application Binary Interface) ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΡΡΠ°Π½Π΄Π°ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΠΎΠΉ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠΎΠΉ. ΠΠ»Ρ STM32 ΡΡΠΎΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΊΡΠΈΡΠΈΡΠ΅Π½, ΡΠ°ΠΊ ΠΊΠ°ΠΊ:
- πΉ ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠΎΠ΄ Π΄Π»Ρ ΡΠ΄Π΅Ρ Cortex-M0/M3/M4/M7, ΡΡΠΈΡΡΠ²Π°Ρ ΠΈΡ
ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ
FPUΠ² Cortex-M4/M7). - πΉ ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΡΠ΅ Π΄Π»Ρ STM32 ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ
DSP-ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΈΠ»ΠΈ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΠ΅ ΡΡΠΊΠΎΡΠΈΡΠ΅Π»ΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,CRCΠ² STM32F4). - πΉ ΠΠΊΠ»ΡΡΠ°Π΅Ρ Π»ΠΈΠ½ΠΊΠΎΠ²ΡΠΈΠΊ (
ld) Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠ΅ΠΉ Π΄Π»Ρ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ², Π³Π΄Π΅ ΠΏΠ°ΠΌΡΡΡ ΡΠ°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π°FLASHΠΈRAMΡ ΠΆΡΡΡΠΊΠΈΠΌΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΠΌΠΈ. - πΉ Π‘ΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌ Ρ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΡΠΌΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ (OpenOCD, ST-Link) ΠΈ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΌΠΈ IDE.
ΠΠ΅Π· ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° Π²Ρ Π½Π΅ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΠΈΠ²ΠΊΡ Π΄Π»Ρ STM32 ΠΈΠ· ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΎΠ² β Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ STM32CubeMX Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ΄Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΎΠ΅ΠΊΡ Π΄Π»Ρ STM32F103C8T6 ("Blue Pill") ΠΏΠΎΡΡΠ΅Π±ΡΠ΅Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΡΠ»ΡΠ΅ΠΉΠ½Π° (arm-none-eabi-gcc) Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ
ΡΠ±ΠΎΡΠΊΠΈ.
- STM32F1 (Cortex-M3)
- STM32F4 (Cortex-M4)
- STM32H7 (Cortex-M7)
- STM32L (Π½ΠΈΠ·ΠΊΠΎΠΏΠΎΡΡΠ΅Π±Π»ΡΡΡΠΈΠ΅)
- ΠΡΡΠ³ΠΎΠΉ
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ARM None EABI GCC: ΠΏΠΎΡΠ°Π³ΠΎΠ²Π°Ρ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ
ΠΡΠΎΡΠ΅ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ, Π½ΠΎ ΠΎΠ±ΡΠ°Ρ ΡΡ
Π΅ΠΌΠ° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Π°: ΡΠΊΠ°ΡΠ°ΡΡ ΠΏΡΠ΅Π΄ΡΠ±ΠΎΡΠ΅Π½Π½ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ, Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π΅Π³ΠΎ Π² PATH, ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ. ΠΠΈΠΆΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π΄Π»Ρ Windows, Linux ΠΈ macOS.
ΠΠ»Ρ Windows
Π‘Π°ΠΌΡΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± β ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ² ΠΎΡ ARM ΠΈΠ»ΠΈ ΡΠ±ΠΎΡΠΊΡ ΠΎΡ xPacks:
- Π‘ΠΊΠ°ΡΠ°ΠΉΡΠ΅ Π°ΡΡ
ΠΈΠ² Ρ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,
gcc-arm-none-eabi-10.3-2021.10-win32.zip). - Π Π°ΡΠΏΠ°ΠΊΡΠΉΡΠ΅ Π² ΠΏΠ°ΠΏΠΊΡ Π±Π΅Π· ΠΏΡΠΎΠ±Π΅Π»ΠΎΠ² (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,
C:\arm-gcc\). - ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΠΏΡΡΡ ΠΊ
binΠ² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡPATH:
C:\arm-gcc\bin
ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
arm-none-eabi-gcc --version
ΠΠ»Ρ Linux (Ubuntu/Debian)
ΠΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠ΅ΡΠ΅Π· ΠΏΠ°ΠΊΠ΅ΡΠ½ΡΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ, Π½ΠΎ Π²Π΅ΡΡΠΈΠΈ ΡΠ°ΠΌ ΡΠ°ΡΡΠΎ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠ΅. ΠΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠΊΡΠΈΠΏΡ:
wget https://developer.arm.com/-/media/Files/downloads/gnu/10.3-2021.10/binrel/gcc-arm-10.3-2021.10-x86_64-arm-none-eabi.tar.xz
tar -xf gcc-arm-10.3-2021.10-x86_64-arm-none-eabi.tar.xz -C /opt/
export PATH="/opt/gcc-arm-10.3-2021.10-x86_64-arm-none-eabi/bin:$PATH"
ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡΡ ΡΡΡΠΎΠΊΡ|ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ arm-none-eabi-gcc --version|Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²Π΅ΡΡΠΈΡ Π½Π΅ Π½ΠΈΠΆΠ΅ 9.3|ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ Π½Π°Π»ΠΈΡΠΈΠ΅ arm-none-eabi-ld ΠΈ arm-none-eabi-objcopy
-->
β οΈ ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ STM32CubeIDE, Π½Π΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΠΉΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π² ΠΏΡΡΡ Ρ ΠΏΡΠΎΠ±Π΅Π»Π°ΠΌΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Program Files). ΠΡΠΎ ΠΏΡΠΈΠ²Π΅Π΄ΡΡ ΠΊ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌ ΡΠ±ΠΎΡΠΊΠΈ ΡΠΈΠΏΠ° cannot find -lgcc.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° Π΄Π»Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² STM32
ΠΠ°ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ARM None EABI GCC ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½Π°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΡΠ»Π°Π³ΠΎΠ² ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΈ Π»ΠΈΠ½ΠΊΠΎΠ²ΡΠΈΠΊΠ°. ΠΡΠΈΠ±ΠΊΠΈ Π·Π΄Π΅ΡΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΡ ΠΊ Π½Π΅ΡΠ°Π±ΠΎΡΠ°ΡΡΠ΅ΠΉ ΠΏΡΠΎΡΠΈΠ²ΠΊΠ΅ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ.
Π€Π»Π°Π³ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ (-mcpu, -mthumb, -O)
ΠΠ»Ρ STM32 ΠΊΡΠΈΡΠΈΡΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ:
- π§
-mcpu=cortex-m4β ΡΠ΅Π»Π΅Π²ΠΎΠ΅ ΡΠ΄ΡΠΎ (Π·Π°ΠΌΠ΅Π½ΠΈΡΠ΅ Π½Π°cortex-m0,cortex-m7ΠΈ Ρ.Π΄.). - π§
-mthumbβ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π°Π±ΠΎΡΠ° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ Thumb (ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ ΠΏΠ°ΠΌΡΡΡ). - π§
-O2ΠΈΠ»ΠΈ-Osβ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎ ΡΠΊΠΎΡΠΎΡΡΠΈ ΠΈΠ»ΠΈ ΡΠ°Π·ΠΌΠ΅ΡΡ (Π΄Π»Ρ STM32F1 Ρ ΠΌΠ°Π»ΡΠΌFLASHΠ»ΡΡΡΠ΅-Os). - π§
-mfpu=fpv4-sp-d16β ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ°FPU(ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Cortex-M4/M7). - π§
-mfloat-abi=hardβ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Ρ ΠΏΠ»Π°Π²Π°ΡΡΠ΅ΠΉ ΡΠΎΡΠΊΠΎΠΉ.
Π€Π°ΠΉΠ» Π»ΠΈΠ½ΠΊΠΎΠ²ΡΠΈΠΊΠ° (.ld)
ΠΠΈΠ½ΠΊΠΎΠ²ΡΠΈΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°ΡΡ ΠΊΠ°ΡΡΡ ΠΏΠ°ΠΌΡΡΠΈ Π²Π°ΡΠ΅Π³ΠΎ STM32. ΠΡΠΈΠΌΠ΅Ρ Π΄Π»Ρ STM32F407VG (256KB FLASH, 128KB RAM):
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 256K
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128K
}
Π§ΡΠΎ Π±ΡΠ΄Π΅Ρ Π΅ΡΠ»ΠΈ Π½Π΅Π²Π΅ΡΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΠ°ΠΌΡΡΡ Π² .ld ΡΠ°ΠΉΠ»Π΅?
ΠΡΠ»ΠΈ ΡΠΊΠ°Π·Π°ΡΡ ΠΌΠ΅Π½ΡΡΠΈΠΉ ΡΠ°Π·ΠΌΠ΅Ρ FLASH, ΡΠ΅ΠΌ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ, Π»ΠΈΠ½ΠΊΠΎΠ²ΡΠΈΠΊ Π²ΡΠ΄Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ memory region overflowed. ΠΡΠ»ΠΈ ΡΠΊΠ°Π·Π°ΡΡ Π±ΠΎΠ»ΡΡΠΈΠΉ β ΠΏΡΠΎΡΠΈΠ²ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ²ΡΠ΅Π΄ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ Π² ΡΠΎΡΠ΅Π΄Π½ΠΈΡ
ΡΠ΅ΠΊΡΠΎΡΠ°Ρ
(Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π°ΡΠ΅ΡΠ΅ΡΡ Option Bytes). ΠΠ»Ρ STM32H7 Ρ DTCM ΠΈ ITCM ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΡΠΈΡ
ΡΠ΅Π³ΠΈΠΎΠ½ΠΎΠ².
β οΈ ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ FreeRTOS ΠΈΠ»ΠΈ STM32 HAL ΡΠ±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π² .ld Π·Π°ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠΎΠ²Π°Π½ΠΎ ΠΌΠ΅ΡΡΠΎ ΠΏΠΎΠ΄ ΡΡΠ΅ΠΊ ΠΈ ΠΊΡΡΡ (_estack, _Min_Heap_Size). ΠΠ½Π°ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ HardFault ΠΏΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΌ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΠ°ΠΌΡΡΠΈ.
ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ STM32CubeIDE ΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΡΠ΅Π΄Π°ΠΌΠΈ
STM32CubeIDE ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ, Π½ΠΎ Π΅Π³ΠΎ Π²Π΅ΡΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΡΠ°ΡΠ΅Π²ΡΠ΅ΠΉ. Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ ΡΠ²ΠΎΠΉ ARM None EABI GCC:
- ΠΡΠΊΡΠΎΠΉΡΠ΅
Project Properties β C/C++ Build β Settings β Tool Settings. - Π ΠΏΠΎΠ»Π΅
Toolchain pathΡΠΊΠ°ΠΆΠΈΡΠ΅ ΠΏΡΡΡ ΠΊ Π²Π°ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,C:\arm-gcc\bin). - ΠΠ±Π½ΠΎΠ²ΠΈΡΠ΅
CommandΠ΄Π»ΡCompiler,AssemblerΠΈLinker, Π·Π°ΠΌΠ΅Π½ΠΈΠ² ΠΏΡΠ΅ΡΠΈΠΊΡ Π½Π°arm-none-eabi-.
ΠΠ»Ρ VS Code Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ Cortex-Debug Π½Π°ΡΡΡΠΎΠΉΡΠ΅ tasks.json:
{
"version": "2.0.0",
"tasks": [
{
"label": "Build STM32",
"type": "shell",
"command": "arm-none-eabi-gcc",
"args": [
"-mcpu=cortex-m4",
"-mthumb",
"-O2",
"-o", "output.elf",
"main.c"
]
}
]
}
ΠΡΠ»ΠΈ STM32CubeIDE Π½Π΅ Π²ΠΈΠ΄ΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ, ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ ΠΏΡΠ°Π²Π° Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΏΠ°ΠΏΠΊΠ΅ Ρ ΡΡΠ»ΡΠ΅ΠΉΠ½ΠΎΠΌ. ΠΠ° Linux ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ chmod +x Π΄Π»Ρ Π²ΡΠ΅Ρ
ΡΠ°ΠΉΠ»ΠΎΠ² Π² /opt/gcc-arm-....
Π’ΠΈΠΏΠΈΡΠ½ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈ ΠΈΡ ΡΠ΅ΡΠ΅Π½ΠΈΡ
ΠΠ°ΠΆΠ΅ ΠΎΠΏΡΡΠ½ΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡΡ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ARM None EABI GCC. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ°ΠΌΡΠ΅ ΡΠ°ΡΡΡΠ΅:
| ΠΡΠΈΠ±ΠΊΠ° | ΠΡΠΈΡΠΈΠ½Π° | Π Π΅ΡΠ΅Π½ΠΈΠ΅ |
|---|---|---|
undefined reference to `_sbrk' |
ΠΡΡΡΡΡΡΠ²ΡΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ | ΠΠΎΠ±Π°Π²ΡΡΠ΅ syscalls.c ΠΈΠ· STM32Cube ΠΈΠ»ΠΈ ΠΎΡΠΊΠ»ΡΡΠΈΡΠ΅ ΠΊΡΡΡ (-specs=nano.specs) |
region `RAM' overflowed |
Π‘ΡΠ΅ΠΊ ΠΈΠ»ΠΈ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΡΠ΅Π²ΡΡΠ°ΡΡ ΡΠ°Π·ΠΌΠ΅Ρ RAM |
Π£Π²Π΅Π»ΠΈΡΡΡΠ΅ Stack_Size Π² .ld ΠΈΠ»ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΡΠΉΡΠ΅ ΠΊΠΎΠ΄ |
HardFault ΠΏΡΠΈ ΡΡΠ°ΡΡΠ΅ |
ΠΠ΅Π²Π΅ΡΠ½ΡΠΉ Π²Π΅ΠΊΡΠΎΡ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠΉ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΠ΅ΠΊΠ° | ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ .ld ΠΈ startup_*.s, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ STM32CubeMonitor Π΄Π»Ρ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠΈ |
floating point ABI mismatch |
ΠΠ΅ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ ΡΠ»Π°Π³ΠΎΠ² -mfloat-abi ΠΌΠ΅ΠΆΠ΄Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ |
Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΡΡΡΡ Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌΠΈ ΡΠ»Π°Π³Π°ΠΌΠΈ hard/softfp |
ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΎΡΠΈΠ±ΠΊΠ°: Π΅ΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ STM32H7 Ρ D-Cache, Π½ΠΎ Π·Π°Π±ΡΠ»ΠΈ Π²ΠΊΠ»ΡΡΠΈΡΡ ΡΠ»Π°Π³ -mfpu=fpv5-d16, ΠΊΠΎΠ΄ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΠΏΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡ
Ρ ΠΏΠ»Π°Π²Π°ΡΡΠ΅ΠΉ ΡΠΎΡΠΊΠΎΠΉ, Ρ
ΠΎΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ ΠΏΡΠΎΠΉΠ΄ΡΡ Π±Π΅Π· ΠΎΡΠΈΠ±ΠΎΠΊ.
ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΊΠΎΠ΄Π° Π΄Π»Ρ STM32
ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠ΅ ΡΠ»Π°Π³ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° ΠΌΠΎΠ³ΡΡ ΡΠΎΠΊΡΠ°ΡΠΈΡΡ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ Π½Π° 20-30% ΠΈΠ»ΠΈ ΡΡΠΊΠΎΡΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΈΡΠΈΡΠ½ΡΡ ΡΡΠ°ΡΡΠΊΠΎΠ². ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΉ:
- β‘ ΠΠ»Ρ STM32F1 (ΠΌΠ°Π»ΠΎ
FLASH): ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅-Os -flto(ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎ ΡΠ°Π·ΠΌΠ΅ΡΡ + Link-Time Optimization). - β‘ ΠΠ»Ρ STM32H7 (Π²ΡΡΠΎΠΊΠ°Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ):
-O3 -funroll-loops -mfpu=fpv5-d16. - β‘ ΠΡΠΊΠ»ΡΡΠΈΡΠ΅ Π½Π΅Π½ΡΠΆΠ½ΡΠ΅ ΡΠ°ΡΡΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ:
-nostdlib -nostartfiles(Π΅ΡΠ»ΠΈ ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠ²ΠΎΠΉstartup). - β‘ ΠΠ»Ρ FreeRTOS: ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠΉΡΠ΅ Ρ
-fdata-sections -ffunction-sectionsΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅--gc-sectionsΠΏΡΠΈ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠ΅.
ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ:
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -O2 -flto -mfpu=fpv4-sp-d16 -mfloat-abi=hard \
-Tstm32f4xx.ld -Wl,--gc-sections -o firmware.elf main.c drivers/*.c
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ -flto ΠΌΠΎΠΆΠ΅Ρ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ, Π½ΠΎ ΡΠΎΠΊΡΠ°ΡΠ°Π΅Ρ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ Π½Π° 10-15%. ΠΠ΄Π½Π°ΠΊΠΎ Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ Π»ΡΡΡΠ΅ ΠΎΡΠΊΠ»ΡΡΠ°ΡΡ ΡΡΠΎΡ ΡΠ»Π°Π³ (-fno-lto), ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ ΡΡΠ»ΠΎΠΆΠ½ΡΠ΅Ρ ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΡ ΠΊΠΎΠ΄Π°.
ΠΡΠ»Π°Π΄ΠΊΠ° ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ GDB ΠΈ OpenOCD
ΠΠΎΡΠ»Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ Π΅Ρ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΡΠΈΡΡ ΠΈ ΠΎΡΠ»Π°Π΄ΠΈΡΡ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠ΅ΠΏΠΎΡΠΊΡ GDB + OpenOCD + ST-Link. ΠΠ°Π·ΠΎΠ²Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄:
- ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ OpenOCD Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠΌ Π΄Π»Ρ Π²Π°ΡΠ΅ΠΉ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΠΎΠΉ ΠΏΠ»Π°ΡΡ:
openocd -f interface/stlink.cfg -f target/stm32f4x.cfg - Π Π΄ΡΡΠ³ΠΎΠΌ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π΅ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ GDB:
arm-none-eabi-gdb firmware.elf(gdb) target remote :3333
(gdb) load
(gdb) continue
ΠΠ»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π° ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΡΠΉΡΠ΅ ΡΡΠΎ Π² VS Code ΡΠ΅ΡΠ΅Π· ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Cortex-Debug ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ STM32CubeIDE Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΌ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠΎΠΌ.
ΠΠ°ΠΊ ΠΎΡΠ»Π°Π΄ΠΈΡΡ HardFault?
ΠΡΠ»ΠΈ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ ΡΡ
ΠΎΠ΄ΠΈΡ Π² HardFault, Π² GDB Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅:
(gdb) break HardFault_Handler
(gdb) continue
(gdb) backtrace
ΠΡΠΎ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ ΡΡΠ΅ΠΊ Π²ΡΠ·ΠΎΠ²ΠΎΠ² Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠ±ΠΎΡ. Π’Π°ΠΊΠΆΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΡ HFSR, CFSR ΠΈ MMFAR Π΄Π»Ρ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠΈ ΠΏΡΠΈΡΠΈΠ½Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄ΠΎΡΡΡΠΏ ΠΊ Π½Π΅Π²ΡΡΠΎΠ²Π½Π΅Π½Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ ΠΈΠ»ΠΈ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½ΠΎΠ»Ρ).
FAQ: Π§Π°ΡΡΡΠ΅ Π²ΠΎΠΏΡΠΎΡΡ ΠΏΠΎ ARM None EABI GCC ΠΈ STM32
ΠΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ARM None EABI GCC Π΄Π»Ρ STM8?
ΠΠ΅Ρ, ARM None EABI GCC ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ ARM Cortex. ΠΠ»Ρ STM8 (8-Π±ΠΈΡΠ½ΠΎΠ΅ ΡΠ΄ΡΠΎ) Π½ΡΠΆΠ΅Π½ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ SDCC ΠΈΠ»ΠΈ IAR for STM8.
ΠΠ°ΠΊ ΡΠ·Π½Π°ΡΡ, ΠΊΠ°ΠΊΡΡ Π²Π΅ΡΡΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ STM32CubeIDE ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ?
ΠΡΠΊΡΠΎΠΉΡΠ΅ Project Properties β C/C++ Build β Settings β Toolchain. ΠΠ΅ΡΡΠΈΡ ΡΠΊΠ°Π·Π°Π½Π° Π² ΠΏΠΎΠ»Π΅ Toolchain version. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΏΡΡΡ ΠΊ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ Π² Toolchain path.
ΠΠΎΡΠ΅ΠΌΡ ΠΏΡΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ warning: implicit declaration of function 'HAL_Delay'?
ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π½Π΅ Π²ΠΈΠ΄ΠΈΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ρ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ. Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ:
- ΠΠΊΠ»ΡΡΡΠ½ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ
#include "stm32f4xx_hal.h"(ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΉ Π΄Π»Ρ Π²Π°ΡΠ΅ΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ). - ΠΡΡΡ ΠΊ STM32 HAL Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π²
Include Paths(-IΡΠ»Π°Π³).
ΠΠ°ΠΊ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ Π΄Π»Ρ STM32F103 (64KB FLASH)?
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΡΠ»Π°Π³ΠΎΠ²:
-Os -flto -ffunction-sections -fdata-sections -Wl,--gc-sections
Π’Π°ΠΊΠΆΠ΅ ΠΎΡΠΊΠ»ΡΡΠΈΡΠ΅ Π½Π΅Π½ΡΠΆΠ½ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ HAL (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, HAL_I2C, Π΅ΡΠ»ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ I2C).
Π§ΡΠΎ Π΄Π΅Π»Π°ΡΡ, Π΅ΡΠ»ΠΈ arm-none-eabi-gdb Π½Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΊ OpenOCD?
ΠΡΠΎΠ²Π΅ΡΡΡΠ΅:
- ΠΠ°ΠΏΡΡΠ΅Π½ Π»ΠΈ OpenOCD (
ps aux | grep openocd). - ΠΠΎΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ
:3333). - ΠΡΠ°Π²Π° Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ST-Link (Π½Π° Linux ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ
udev).