diff options
Diffstat (limited to 'stm32f103/index.cmake')
-rw-r--r-- | stm32f103/index.cmake | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/stm32f103/index.cmake b/stm32f103/index.cmake new file mode 100644 index 0000000..c840aa5 --- /dev/null +++ b/stm32f103/index.cmake @@ -0,0 +1,81 @@ +set(CMAKE_C_STANDARD "11") +set(CMAKE_CXX_STANDARD "14") + +set(MCU_INIT_SOURCES "") +list(APPEND MCU_INIT_SOURCES "${MCU_BASEDIR}/stm32f103/src/init_low.s") +list(APPEND MCU_INIT_SOURCES "${MCU_BASEDIR}/stm32f103/src/init_high.cpp") +list(APPEND MCU_INIT_SOURCES "${MCU_BASEDIR}/stm32f103/src/default_handler.cpp") +list(APPEND MCU_INIT_SOURCES "${MCU_BASEDIR}/stm32f103/include/mcu/init.h") +set(MCU_INIT_INCLUDES "") +list(APPEND MCU_INIT_INCLUDES "${MCU_BASEDIR}/stm32f103/include") + +function(mcu_add_executable) + + set(options) + set(oneValueArgs TARGET LINKER_SCRIPT) + set(multiValueArgs) + cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if (NOT ARGS_TARGET) + message(FATAL_ERROR "MCU: Missing required argument: TARGET") + endif () + + if (MCU_CHIP MATCHES "stm32f103.4" OR MCU_CHIP MATCHES "stm32f103.6") + set(size_define STM32F10X_SM) + elseif (MCU_CHIP MATCHES "stm32f103.8" OR MCU_CHIP MATCHES "stm32f103.b") + set(size_define STM32F10X_MD) + elseif (MCU_CHIP MATCHES "stm32f103.c" OR MCU_CHIP MATCHES "stm32f103.d" OR MCU_CHIP MATCHES "stm32f103.e") + set(size_define STM32F10X_LD) + else () + message(FATAL_ERROR "Unknown STM32 version: ${MCU_CHIP}") + endif () + + target_compile_definitions(${ARGS_TARGET} PUBLIC ${size_define}) + + # Compile and linker options + + set(o_level "$<TARGET_PROPERTY:O_LEVEL>") + target_compile_options(${ARGS_TARGET} PUBLIC + "$<$<BOOL:${o_level}>:-O${o_level}>$<$<NOT:$<BOOL:${o_level}>>:-O3>") + unset(o_level) + + target_compile_options(${ARGS_TARGET} PUBLIC + -mcpu=cortex-m3 + -mthumb + -g + ) + + target_link_libraries(${ARGS_TARGET} PUBLIC + -mcpu=cortex-m3 + -mthumb + -nostdlib + -nostartfiles + -Wl,--gc-sections + ) + + # Linker script + + if (ARGS_LINKER_SCRIPT) + if (NOT IS_ABSOLUTE "${ARGS_LINKER_SCRIPT}") + set(ARGS_LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/${ARGS_LINKER_SCRIPT}") + endif () + set_target_properties(${ARGS_TARGET} PROPERTIES MCU_LINKER_SCRIPT "${ARGS_LINKER_SCRIPT}") + endif () + + stm32_configure_linker_script(${ARGS_TARGET}) + +endfunction() + +function(stm32_configure_linker_script T) + get_target_property(MCU_LINKER_SCRIPT ${T} MCU_LINKER_SCRIPT) + + if (NOT MCU_LINKER_SCRIPT) + set(ld "${MCU_BASEDIR}/stm32f103/stm32f103.ld") + message("MCU: Using built-in linker script: ${ld}") + + set_target_properties(${T} PROPERTIES MCU_LINKER_SCRIPT ${ld}) + endif () + + target_link_libraries(${T} PUBLIC + "-T\"$<TARGET_PROPERTY:MCU_LINKER_SCRIPT>\"") +endfunction() |