Zpět na domů

CMake pro STM32F407: sestavení s GCC na Windows

Článek popisuje nastavení CMake pro krosplatformové sestavení firmware STM32F407VE s ARM GCC na Windows. Detailně je popsána migrace z GNU Make, konfigurace HAL modulů a přísné příznaky kompilátoru. Vhodné pro middle/senior embedded vývojáře.

Sestavení firmware STM32: CMake + GCC na Win10
Advertisement 728x90

Nastavení CMake pro sestavování firmware STM32F407 na Windows s GCC

CMake zajišťuje multiplatformní sestavování firmware pro mikrokontroléry STM32. Jedinými skripty můžete sestavovat projekty jak ve Windows, tak v Linuxu. Tím se řeší problém s cestami a nástroji specifickými pro operační systém v GNU Make. Pro vývoj na jedné platformě není přechod nutný, ale při potřebě podpory více operačních systémů se CMake stává standardem mezi meta build systémy.

Systém generuje nativní soubory pro sestavení: GNU Make pro Linux/Windows, Ninja nebo projekty pro IDE. Zaměřujeme se na ARM GCC pro STM32F407VE s HAL od ST a CMSIS.

Výhody skriptového sestavování

Sestavování z konzole se škáluje na stovky firmware. GUI-IDE omezují automatizaci při růstu projektů. Skripty umožňují:

Google AdInline article slot
  • Automatizovat CI/CD pipeline
  • Sestavit všechny varianty přes noc
  • Integrovat do repozitářů jednou příkazem

Pro 150+ firmware stačí dávkový soubor: spuštění – a během minut jsou připraveny .hex soubory.

Zadání úlohy: Projekt v C pro STM32F407VE. Křížový kompilátor ARM GCC. CMake generuje GNU Make. HAL STM32 + CMSIS. Cíl – Windows 10.

Kompilátoru předáváme přísné příznaky:

Google AdInline article slot
-MMD -MP -O0 -std=c11 -Wall -Werror -mcpu=cortex-m4 -march=armv7e-m -Werror=address -Werror=address-of-packed-member -Werror=array-bounds=1 -Werror=bool-compare -Werror=bool-operation -Werror=char-subscripts -Werror=clobbered -Werror=div-by-zero -Werror=duplicate-decl-specifier -Werror=empty-body -Werror=enum-compare -Werror=float-equal -Werror=ignored-qualifiers -Werror=implicit -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=init-self -Werror=int-in-bool-context -Werror=int-to-pointer-cast -Werror=logical-not-parentheses -Werror=logical-op -Werror=maybe-uninitialized -Werror=memset-elt-size -Werror=misleading-indentation -Werror=missing-braces -Werror=multistatement-macros -Werror=old-style-declaration -Werror=overflow -Werror=pointer-arith -Werror=pointer-sign -Werror=return-local-addr -Werror=return-type -Werror=shadow -Werror=shift-count-overflow -Werror=sign-compare -Werror=sizeof-pointer-div -Werror=strict-aliasing -Werror=switch -Werror=tautological-compare -Werror=type-limits -Werror=uninitialized -Werror=unused-variable -g3 -Wextra -Wno-conversion -Wno-cpp -Wno-discarded-qualifiers -Wno-implicit -Wno-int-conversion -Wno-nonnull-compare -Wno-redundant-decls -Wno-restrict -Wno-sign-compare -Wno-stringop-truncation -Wno-switch-bool -Wno-unused-parameter -fallthrough -fdata-sections -ffreestanding -ffunction-sections -finline-small -fmax-errors=70 -fno-common -fno-move-loop-invariants -fno-printf-return-value -fomit-frame-pointer -fshort-enums -fsigned-char -fstack-usage -fzero-initialized-in-bss -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mthumb

Linkeru:

-specs=nosys.specs -Xlinker --gc-sections -Xlinker --nmagic -Wl,--gc-sections -Xlinker --print-memory-usage -t -Wl,--cref -Wl,--gc-sections --verbose -mcpu=cortex-m4 -march=armv7e-m -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -lm

STM32CubeMX negeneruje CMake přímo – pouze GNU Make. Řešení: ruční migrace.

Teorie: od Make k CMake

Proměnné prostředí ukládají cesty, příznaky kompilátoru, nastavení. Jsou viditelné všem nástrojům.

Google AdInline article slot

Build systém automatizuje kompilaci, linkování, závislosti. Příklady: GNU Make, Ninja, IAR.

Generátor build systému (CMake, Meson) vytváří soubory pro nativní systémy sestavení.

Schéma CMake + GNU Make:

  • CMake čte CMakeLists.txt
  • Generuje Makefile
  • GNU Make sestavuje artefakty

Zkontrolujte CMake: where cmake ve Windows.

Migrace Make → CMake

Mechanická náhrada syntaxe. CMake je více slov, ale výkonnější.

| GNU Make | CMake | Vysvětlení |

|----------|--------|-----------|

| VAR += value | string(APPEND VAR " value") | Rozšíření proměnné |

| CRC=Y | set(CRC Y) | Definice |

| $(VAR) | ${VAR} | Vložení |

| ifeq($(IAR),Y) | if(IAR STREQUAL Y) | Podmínka |

| SOURCES_C += src/main.c | target_sources(app PRIVATE src/main.c) | Zdrojové soubory |

| OPT += -Ipath | target_include_directories(app PUBLIC path) | Cesty |

Příklady transformace:

  • LINKER_FLAGS += -u _printf_floattarget_link_options(app PRIVATE -u _printf_float)
  • include file.mkinclude(${file}.cmake)
  • SOURCES += file.cstring(APPEND SOURCES " ${file}.c")
  • ifneq($(FLAG),Y)if(NOT (FLAG STREQUAL Y))

CMakeLists.txt (kořenový):

cmake_minimum_required(VERSION 3.16)
project(jz_f407vet6_mbr_gcc_cmake)
set(PROJECT_NAME jz_f407vet6_mbr_gcc_cmake)
enable_language(C ASM)

set(CURRENT_CMAKELISTS_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(PROJECT_LOC ${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${PROJECT_LOC})

set(BUILD_DIR ${PROJECT_LOC}/build)
set(TARGET ${PROJECT_NAME})
set(EXECUTABLE ${TARGET})

get_filename_component(WORKSPACE_LOC "${PROJECT_LOC}/../.." ABSOLUTE)
include_directories(${WORKSPACE_LOC})

include(${PROJECT_LOC}/config.cmake)
include(${WORKSPACE_LOC}/cmake_scripts/code_base.cmake)
include(${WORKSPACE_LOC}/cmake_scripts/rules.cmake)

Konfigurace komponent

V config.cmake aktivujte moduly:

set(CONTROL Y)
set(DWT Y)
set(ARM_GCC Y)
set(CORTEX_M4 Y)
set(FLASH Y)
set(FPU Y)
set(GPIO Y)
set(INTERRUPT Y)
set(JZ_F407VET6 Y)
set(LED_MONO Y)
set(MBR Y)
set(MCAL_STM32 Y)
set(MICROCONTROLLER Y)
set(NVIC Y)
set(RCC Y)
set(SCHEDULER Y)
set(STM32F407VE Y)
set(STM32F4X_HAL_DRIVER Y)
set(SUPER_CYCLE Y)
set(SYSTEM Y)
set(SYSTICK Y)
set(SYS_INIT Y)
set(TIME Y)

V code_base.cmake přidávejte komponenty podmíněně:

if(GPIO STREQUAL Y)
  target_sources(app PRIVATE gpio/src/gpio.c)
  target_include_directories(app PUBLIC gpio/inc)
  add_compile_definitions(GPIO_ENABLED)
endif()

Co je důležité

  • CMake zajišťuje multiplatformnost bez přepisování skriptů
  • Migrace Make→CMake – šablonová náhrada, automatizovatelná AI
  • Přísné příznaky -Werror odhalují chyby ve fázi kompilace
  • config.cmake řídí sadu HAL modulů
  • Sestavování ze skriptů se škáluje na 100+ firmware

— Editorial Team

Advertisement 728x90

Číst dál