109 lines
3.1 KiB
CMake
109 lines
3.1 KiB
CMake
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:"
|
|
)
|