홈으로 돌아가기

STM32F407용 CMake: Windows에서 GCC로 빌드

이 기사는 Windows에서 ARM GCC를 사용한 STM32F407VE의 크로스플랫폼 펌웨어 빌드를 위한 CMake 설정 방법을 설명합니다. GNU Make에서 상세 마이그레이션, HAL 모듈 구성 및 엄격한 컴파일러 플래그. 중/시니어 임베디드 개발자에게 적합.

STM32 펌웨어 빌드: Win10에서 CMake + GCC
Advertisement 728x90

CMake로 STM32F407 펌웨어 빌드 환경 구축하기: Windows에서 GCC 활용

CMake는 STM32 마이크로컨트롤러용 펌웨어를 크로스 플랫폼으로 빌드할 수 있게 해줍니다. 단일 스크립트 세트로 Windows와 Linux 모두에서 프로젝트를 빌드할 수 있습니다. 이는 GNU Make에서 발생하는 OS별 경로와 유틸리티 문제를 해결합니다. 단일 플랫폼 개발에서는 전환이 필요 없지만, 여러 OS를 지원할 때 CMake는 메타 빌드 시스템 중 표준이 됩니다.

이 시스템은 네이티브 빌드 파일을 생성합니다: Linux/Windows용 GNU Make, Ninja, 또는 IDE 프로젝트. 여기서는 ST의 HAL과 CMSIS를 사용한 STM32F407VE용 ARM GCC에 초점을 맞춥니다.

스크립트 기반 빌드의 장점

명령줄에서 빌드하면 수백 개의 펌웨어 프로젝트로 확장할 수 있습니다. GUI IDE는 프로젝트가 커질수록 자동화를 제한합니다. 스크립트를 사용하면 다음과 같은 작업이 가능합니다:

Google AdInline article slot
  • CI/CD 파이프라인 자동화
  • 모든 변형을 야간에 빌드
  • 단일 명령으로 저장소에 통합

150개 이상의 펌웨어 프로젝트의 경우 배치 파일만으로 충분합니다: 실행하면 몇 분 안에 .hex 파일이 준비됩니다.

작업 정의: STM32F407VE용 C 프로젝트. ARM GCC 크로스 컴파일러. CMake가 GNU Make를 생성. STM32 HAL + CMSIS. 대상: Windows 10.

컴파일러에 엄격한 플래그를 전달합니다:

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

링커에:

-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는 CMake를 직접 생성하지 않습니다—GNU Make만 생성합니다. 해결책: 수동 마이그레이션.

이론: Make에서 CMake로

환경 변수는 경로, 컴파일러 플래그 및 설정을 저장합니다. 모든 유틸리티에 표시됩니다.

Google AdInline article slot

빌드 시스템은 컴파일, 링크 및 종속성을 자동화합니다. 예: GNU Make, Ninja, IAR.

빌드 시스템 생성기 (CMake, Meson)는 네이티브 빌드 시스템용 파일을 생성합니다.

CMake + GNU Make 방식:

  • CMake가 CMakeLists.txt를 읽음
  • Makefile 생성
  • GNU Make가 아티팩트 빌드

CMake 확인: Windows에서 where cmake.

Make → CMake 마이그레이션

기계적 구문 교체. CMake는 더 장황하지만 더 강력합니다.

| GNU Make | CMake | 설명 |

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

| VAR += value | string(APPEND VAR " value") | 변수에 추가 |

| CRC=Y | set(CRC Y) | 정의 |

| $(VAR) | ${VAR} | 삽입 |

| ifeq($(IAR),Y) | if(IAR STREQUAL Y) | 조건 |

| SOURCES_C += src/main.c | target_sources(app PRIVATE src/main.c) | 소스 파일 |

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

변환 예시:

  • 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 (루트):

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)

컴포넌트 구성

config.cmake에서 모듈 활성화:

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)

code_base.cmake에서 조건부로 컴포넌트 추가:

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()

핵심 요약

  • CMake는 스크립트 재작성 없이 크로스 플랫폼 호환성을 제공합니다
  • Make→CMake 마이그레이션은 템플릿 기반 교체로, AI로 자동화 가능합니다
  • 엄격한 -Werror 플래그는 컴파일 시간에 오류를 잡습니다
  • config.cmake는 HAL 모듈 선택을 관리합니다
  • 스크립트 기반 빌드는 100개 이상의 펌웨어 프로젝트로 확장됩니다

— Editorial Team

Advertisement 728x90

다음 읽기