cmake_minimum_required(VERSION 3.15) # Set toolchain for ARM cross-compilation set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR arm) # Specify the cross compiler set(CMAKE_C_COMPILER arm-none-eabi-gcc) set(CMAKE_CXX_COMPILER arm-none-eabi-g++) set(CMAKE_ASM_COMPILER arm-none-eabi-gcc) # Set toolchain utilities set(CMAKE_OBJCOPY arm-none-eabi-objcopy) set(CMAKE_SIZE arm-none-eabi-size) # Skip compiler test (we'll configure it properly below) set(CMAKE_C_COMPILER_WORKS 1) set(CMAKE_CXX_COMPILER_WORKS 1) # Set project name and languages project(GD32E230C_EVAL C ASM) # Set C standard set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD_REQUIRED ON) # Export compile commands for IDEs set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # MCU specific settings set(MCU_FAMILY GD32E23x) set(MCU_MODEL GD32E230C8) set(CPU_TYPE cortex-m23) # Define macros add_compile_definitions( GD32E230 USE_STDPERIPH_DRIVER ) # Compiler options set(MCU_FLAGS "-mcpu=${CPU_TYPE} -mthumb") set(COMMON_FLAGS "${MCU_FLAGS} -Wall -fdata-sections -ffunction-sections") set(CMAKE_C_FLAGS "${COMMON_FLAGS} -Os -g3") set(CMAKE_ASM_FLAGS "${MCU_FLAGS} -x assembler-with-cpp") set(CMAKE_EXE_LINKER_FLAGS "${MCU_FLAGS} -specs=nano.specs -specs=nosys.specs -Wl,--gc-sections -Wl,-Map=${PROJECT_NAME}.map,--cref") # Linker script set(LINKER_SCRIPT "${CMAKE_SOURCE_DIR}/GD32E23x_Firmware_Library/CMSIS/GD/GD32E23x/Source/GCC/gd32e23x_flash.ld") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -T${LINKER_SCRIPT}") # Include directories include_directories( ${CMAKE_SOURCE_DIR}/user ${CMAKE_SOURCE_DIR}/user/Soft_Drive ${CMAKE_SOURCE_DIR}/GD32E23x_Firmware_Library/CMSIS/GD/GD32E23x/Include ${CMAKE_SOURCE_DIR}/GD32E23x_Firmware_Library/CMSIS ${CMAKE_SOURCE_DIR}/CMSIS_5-develop/CMSIS/Core/Include ${CMAKE_SOURCE_DIR}/GD32E23x_Firmware_Library/GD32E23x_standard_peripheral/Include ${CMAKE_SOURCE_DIR}/Utilities ${CMAKE_SOURCE_DIR}/Utilities/LCD_Common ) # Source files file(GLOB_RECURSE USER_SOURCES "user/*.c" ) file(GLOB PERIPHERAL_SOURCES "GD32E23x_Firmware_Library/GD32E23x_standard_peripheral/Source/*.c" ) file(GLOB CMSIS_SOURCES "GD32E23x_Firmware_Library/CMSIS/GD/GD32E23x/Source/system_gd32e23x.c" ) file(GLOB UTILITIES_SOURCES "Utilities/*.c" "Utilities/LCD_Common/*.c" ) set(STARTUP_FILE "GD32E23x_Firmware_Library/CMSIS/GD/GD32E23x/Source/GCC/startup_gd32e23x.s" ) # Create executable add_executable(${PROJECT_NAME}.elf ${USER_SOURCES} ${PERIPHERAL_SOURCES} ${CMSIS_SOURCES} ${UTILITIES_SOURCES} ${STARTUP_FILE} ) # Custom commands to generate additional output formats add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD COMMAND ${CMAKE_OBJCOPY} -O ihex ${PROJECT_NAME}.elf ${PROJECT_NAME}.hex COMMAND ${CMAKE_OBJCOPY} -O binary ${PROJECT_NAME}.elf ${PROJECT_NAME}.bin COMMAND ${CMAKE_SIZE} ${PROJECT_NAME}.elf COMMENT "Building ${PROJECT_NAME}.hex and ${PROJECT_NAME}.bin" ) # Print executable size add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD COMMAND ${CMAKE_SIZE} --format=berkeley ${PROJECT_NAME}.elf COMMENT "Firmware size:" )