# CMakeLists.txt — STM32F103 标准库 (SPL V1.4) + Ninja 云端极速编译 # 用法: # cmake -B build -G Ninja . # 配置 # ninja -C build # 编译 # ninja -C build cppcheck # 静态分析 # ninja -C build clean # 清理 cmake_minimum_required(VERSION 3.20) project(SolarTrackerF103 C ASM) # ─── 目标芯片 ─── set(MCU cortex-m3) set(FLOAT_ABI soft) # ─── 编译标志 ─── set(CMAKE_C_STANDARD 99) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcpu=${MCU} -mthumb -mfloat-abi=${FLOAT_ABI}") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Os -ffunction-sections -fdata-sections") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wno-unused-parameter") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections -Wl,-Map=${PROJECT_NAME}.map") # ─── 头文件路径(根据实际工程结构调整) ─── include_directories( Inc Libraries/STM32F10x_StdPeriph_Driver/inc Libraries/CMSIS/Device/ST/STM32F10x Libraries/CMSIS/Include ) # ─── 自动收集源文件 ─── file(GLOB_RECURSE SOURCES_C Src/*.c Libraries/STM32F10x_StdPeriph_Driver/src/*.c ) # ─── 启动文件(选择正确的启动文件) ─── # F103C8/CB (64KB): startup_stm32f10x_md.s # F103VE (512KB): startup_stm32f10x_hd.s # F103ZG (1MB): startup_stm32f10x_xl.s set(STARTUP_FILE Libraries/CMSIS/Device/ST/STM32F10x/startup_stm32f10x_md.s ) # ─── 链接脚本 ─── set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/STM32F103C8Tx_FLASH.ld) if(NOT EXISTS ${LINKER_SCRIPT}) message(WARNING "链接脚本 ${LINKER_SCRIPT} 未找到,请确认路径") endif() # ─── 可执行目标 ─── add_executable(${PROJECT_NAME}.elf ${SOURCES_C} ${STARTUP_FILE}) target_link_options(${PROJECT_NAME}.elf PRIVATE -T ${LINKER_SCRIPT} -Wl,--gc-sections -Wl,-Map=${PROJECT_NAME}.map ) # ─── 后处理:生成 .bin 和 .hex ─── add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD COMMAND arm-none-eabi-objcopy -O binary ${PROJECT_NAME}.elf ${PROJECT_NAME}.bin COMMAND arm-none-eabi-objcopy -O ihex ${PROJECT_NAME}.elf ${PROJECT_NAME}.hex COMMAND ${CMAKE_SIZE} ${PROJECT_NAME}.elf COMMENT "生成 .bin / .hex 固件" ) # ─── 自定义目标:cppcheck 静态分析 ─── find_program(CPPCHECK cppcheck) if(CPPCHECK) add_custom_target(cppcheck COMMAND ${CPPCHECK} --enable=all --suppress=missingIncludeSystem --suppress=unmatchedSuppression ${CMAKE_C_FLAGS} ${SOURCES_C} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMENT "运行 cppcheck 静态代码分析" ) endif() # ─── 清理 ─── set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY ADDITIONAL_CLEAN_FILES "${PROJECT_NAME}.bin;${PROJECT_NAME}.hex;${PROJECT_NAME}.map")