cmake_minimum_required(VERSION 3.20) # 包含项目配置 include(${CMAKE_SOURCE_DIR}/cmake/project_config.cmake) include(${CMAKE_SOURCE_DIR}/cmake/project.cmake) project(${PROJECT_NAME} LANGUAGES C CXX ASM) # Generate version header from CMake version variables file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/generated) configure_file(${CMAKE_SOURCE_DIR}/cmake/version.h.in ${CMAKE_BINARY_DIR}/generated/version.h @ONLY) # 添加SDK库 add_subdirectory(SDK/CMSIS) add_subdirectory(SDK/GD32F4xx_standard_peripheral) add_subdirectory(SDK/SEGGER_RTT) # USB 库默认不编译,需要时:cmake --preset Debug -DGD32_ENABLE_USB=ON, # 并在下方链接区追加 target_link_libraries(${PROJECT_NAME} PRIVATE GD32F4xx_usb_library) add_subdirectory(SDK/GD32F4xx_usb_library) # 业务代码源文件 set(TARGET_SRC # Core Src/gd32f4xx_it.c Src/main.c Src/systick.c Src/system_gd32f4xx.c # Startup SDK/CMSIS/startup/startup_gd32f405_425.S # User Src/syscalls.c # Add new source files here Src/uart.c Src/led.c Src/uart_ring_buffer.c # TODO: 待从 GD32E23x 工程移植后启用 # Src/command.c # Src/i2c.c ) # 设置输出目录 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Application) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Application) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Application) add_executable(${PROJECT_NAME} ${TARGET_SRC}) set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME Application) project_add_target_properties(${PROJECT_NAME}) # 头文件路径 target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/Inc ${CMAKE_BINARY_DIR}/generated # Add new include directories here, e.g. ${CMAKE_SOURCE_DIR}/Application/User/Inc ) # 按 GD32_FLASH_CAPACITY 选择链接脚本与容量宏(cmake/project_config.cmake 中定义) if(GD32_FLASH_CAPACITY STREQUAL "xE") set(GD32_FLASH_LD "gd32f405_407_xE_flash.ld") set(GD32_FLASH_SIZE_KB 512) elseif(GD32_FLASH_CAPACITY STREQUAL "xG") set(GD32_FLASH_LD "gd32f405_407_xG_flash.ld") set(GD32_FLASH_SIZE_KB 1024) elseif(GD32_FLASH_CAPACITY STREQUAL "xK") set(GD32_FLASH_LD "gd32f405_407_xK_flash.ld") set(GD32_FLASH_SIZE_KB 2048) else() message(FATAL_ERROR "Invalid GD32_FLASH_CAPACITY='${GD32_FLASH_CAPACITY}', expected xE/xG/xK") endif() message(STATUS "Target flash capacity: ${GD32_FLASH_CAPACITY} (${GD32_FLASH_SIZE_KB} KB), LD: ${GD32_FLASH_LD}") # 链接脚本 target_link_options(${PROJECT_NAME} PRIVATE -T${CMAKE_SOURCE_DIR}/LD/${GD32_FLASH_LD} -Xlinker -L${CMAKE_SOURCE_DIR}/LD ) # 容量宏(代码中如需按容量分支使用 GD32_FLASH_SIZE_KB) target_compile_definitions(${PROJECT_NAME} PRIVATE GD32_FLASH_SIZE_KB=${GD32_FLASH_SIZE_KB}) # 生成 map 文件等 target_link_options(${PROJECT_NAME} PRIVATE -Wl,-Map=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Application.map -Wl,--no-warn-rwx-segments ) # 链接SDK库 target_link_libraries(${PROJECT_NAME} PRIVATE CMSIS) target_link_libraries(${PROJECT_NAME} PRIVATE GD32F4xx_standard_peripheral) target_link_libraries(${PROJECT_NAME} PRIVATE SEGGER_RTT) # 生成 bin/hex/list 文件名格式:[工程名_版本号_编译条件_编译日期] set(OUTPUT_PREFIX "${PROJECT_NAME}_${VERSION}_${BUILD_VARIANT}_${BUILD_DATE}") add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND echo -- Running Post Build Commands COMMAND ${CMAKE_OBJCOPY} -O ihex $ ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_PREFIX}.hex COMMAND ${CMAKE_OBJCOPY} -O ihex $ $/Application.hex COMMAND ${CMAKE_OBJCOPY} -O binary $ ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_PREFIX}.bin COMMAND ${CMAKE_SIZE} $ COMMAND ${CMAKE_OBJDUMP} -h -S $ > ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_PREFIX}.list COMMAND ${CMAKE_SIZE} --format=berkeley $ > ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_PREFIX}.bsz COMMAND ${CMAKE_SIZE} --format=sysv -x $ > ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_PREFIX}.ssz ) # ========================= # Tips for project maintainers: # 1. If you add new source files (e.g. Src/my_module.c), add them to TARGET_SRC above. # 2. If you add new header files or directories, add them to target_include_directories above. # 3. If you add new SDK modules, use add_subdirectory(SDK/YourModule) and link with target_link_libraries. # 4. 换用其它型号时:修改 cmake/project.cmake 与 SDK/GD32F4xx_standard_peripheral/CMakeLists.txt 中的 # GD32F405 宏、TARGET_SRC 中的启动文件(startup_gd32f405_425.S / startup_gd32f407_427.S / # startup_gd32f450_470.S)以及上面的链接脚本(LD/gd32f405_407_xE_flash.ld 等)。 # =========================