# STM32 Minimal CMake project for C/C++ projects cmake_minimum_required(VERSION 3.5) ############################################################################### include(./gcc-arm-none-eabi.cmake) # Set project name and some defaults if ("${PROJECT_NAME}" STREQUAL "") set(PROJECT_NAME Probe) endif() project(${PROJECT_NAME}) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # Set debug mode as default if ("${CMAKE_BUILD_TYPE}" STREQUAL "") set(CMAKE_BUILD_TYPE Debug) endif() message("Build type: ${CMAKE_BUILD_TYPE}") # Set microcontroller information set(MCU_FAMILY STM32L4xx) set(MCU_MODEL STM32L432xx) set(CPU_PARAMETERS -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard) set(STARTUP_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/startup_stm32l432xx.s) set(MCU_LINKER_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/STM32L432KCUx_FLASH.ld) ############################################################################### set(EXECUTABLE ${CMAKE_PROJECT_NAME}) enable_language(C CXX ASM) set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_EXTENSIONS ON) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}) set(CMAKE_CXX_EXTENSIONS ON) ############################################################################### set(STM32CUBEMX_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/Core/Inc ${CMAKE_CURRENT_SOURCE_DIR}/Drivers/${MCU_FAMILY}_HAL_Driver/Inc ${CMAKE_CURRENT_SOURCE_DIR}/Drivers/${MCU_FAMILY}_HAL_Driver/Inc/Legacy ${CMAKE_CURRENT_SOURCE_DIR}/Drivers/CMSIS/Device/ST/${MCU_FAMILY}/Include ${CMAKE_CURRENT_SOURCE_DIR}/Drivers/CMSIS/Include) set(PROJECT_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/Core/Cam ) set (TINY_USB_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/Core/tinyusb/src ${CMAKE_CURRENT_SOURCE_DIR}/Core/tinyusb/src/class/cdc ${CMAKE_CURRENT_SOURCE_DIR}/Core/tinyusb/src/class/msc ${CMAKE_CURRENT_SOURCE_DIR}/Core/tinyusb/src/device ${CMAKE_CURRENT_SOURCE_DIR}/Core/tinyusb/hw ) file(GLOB_RECURSE STM32CUBEMX_SOURCES CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/Core/Cam/*.c ${CMAKE_CURRENT_SOURCE_DIR}/Core/Inc/*.c ${CMAKE_CURRENT_SOURCE_DIR}/Core/Src/*.c ${CMAKE_CURRENT_SOURCE_DIR}/Drivers/*.c) #set(PROJECT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Project) #file(GLOB_RECURSE PROJECT_SOURCES CONFIGURE_DEPENDS # ${PROJECT_DIR}/*.cpp # ${PROJECT_DIR}/*.c) set(PROJECT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Core/Src) file(GLOB_RECURSE PROJECT_SOURCES CONFIGURE_DEPENDS ${PROJECT_DIR}/*.cpp ${PROJECT_DIR}/*.c) set(TINY_USB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Core/tinyusb/src) file(GLOB_RECURSE TINY_USB_SOURCES CONFIGURE_DEPENDS ${TINY_USB_DIR}/*.cpp ${TINY_USB_DIR}/*.c ${TINY_USB_DIR}/class/cdc/*.c ${TINY_USB_DIR}/class/msc/*.c ${TINY_USB_DIR}/device/*.c) add_executable(${EXECUTABLE} ${STM32CUBEMX_SOURCES} ${PROJECT_SOURCES} ${TINY_USB_SOURCES} ${STARTUP_SCRIPT}) target_compile_definitions(${EXECUTABLE} PRIVATE #$<$:DEBUG> ${MCU_MODEL} USE_HAL_DRIVER) target_include_directories(${EXECUTABLE} SYSTEM PRIVATE ${STM32CUBEMX_INCLUDE_DIRECTORIES}) target_include_directories(${EXECUTABLE} PRIVATE ${PROJECT_INCLUDE_DIRECTORIES}) target_include_directories(${EXECUTABLE} PRIVATE ${TINY_USB_INCLUDE_DIRECTORIES}) ############################################################################### target_compile_options(${EXECUTABLE} PRIVATE ${CPU_PARAMETERS} -Wall -Wextra -Wpedantic -Wshadow -Wdouble-promotion -Wformat=2 -Wformat-truncation -Wundef -fno-common -Wno-unused-parameter $<$: -Wconversion -Wno-volatile -Wold-style-cast -Wuseless-cast -Wsuggest-override> $<$:-Og -g3 -ggdb> $<$:-Og -g0>) target_link_options(${EXECUTABLE} PRIVATE -T${MCU_LINKER_SCRIPT} ${CPU_PARAMETERS} -Wl,-Map=${CMAKE_PROJECT_NAME}.map $<$,10.3.1>:-Wl,--no-warn-rwx-segments> -Wl,--start-group -lc -lm -lstdc++ -Wl,--end-group -Wl,--print-memory-usage) ############################################################################### # The last command can take a couple of seconds on larger project, usefull for debugging add_custom_command(TARGET ${EXECUTABLE} POST_BUILD COMMAND ${CMAKE_SIZE} $ COMMAND ${CMAKE_OBJCOPY} -O ihex $ ${EXECUTABLE}.hex COMMAND ${CMAKE_OBJCOPY} -O binary $ ${EXECUTABLE}.bin) option(DUMP_ASM "Create full assembly of final executable" OFF) if (${DUMP_ASM}) add_custom_command(TARGET ${EXECUTABLE} POST_BUILD COMMAND ${CMAKE_OBJDUMP} -D -C $ > ${EXECUTABLE}.s) endif()