gcc_stm32.cmake 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. INCLUDE(CMakeForceCompiler)
  2. SET(STM32_SUPPORTED_FAMILIES F1 F4 CACHE INTERNAL "stm32 supported families")
  3. IF(NOT TOOLCHAIN_PREFIX)
  4. SET(TOOLCHAIN_PREFIX "/usr")
  5. MESSAGE(STATUS "No TOOLCHAIN_PREFIX specified, using default: " ${TOOLCHAIN_PREFIX})
  6. ENDIF()
  7. IF(NOT TARGET_TRIPLET)
  8. SET(TARGET_TRIPLET "arm-none-eabi")
  9. MESSAGE(STATUS "No TARGET_TRIPLET specified, using default: " ${TARGET_TRIPLET})
  10. ENDIF()
  11. IF(NOT STM32_FAMILY)
  12. MESSAGE(STATUS "No STM32_FAMILY specified, trying to get it from STM32_CHIP")
  13. IF(NOT STM32_CHIP)
  14. SET(STM32_FAMILY "F1" CACHE INTERNAL "stm32 family")
  15. MESSAGE(STATUS "Neither STM32_FAMILY nor STM32_CHIP specified, using default STM32_FAMILY: ${STM32_FAMILY}")
  16. ELSE()
  17. STRING(REGEX REPLACE "^[sS][tT][mM]32(([fF][0-4])|([lL][0-1])|([tT])|([wW])).+$" "\\1" STM32_FAMILY ${STM32_CHIP})
  18. STRING(TOUPPER ${STM32_FAMILY} STM32_FAMILY)
  19. MESSAGE(STATUS "Selected STM32 family: ${STM32_FAMILY}")
  20. ENDIF()
  21. ENDIF()
  22. STRING(TOUPPER ${STM32_FAMILY} STM32_FAMILY)
  23. LIST(FIND STM32_SUPPORTED_FAMILIES ${STM32_FAMILY} FAMILY_INDEX)
  24. IF(FAMILY_INDEX EQUAL -1)
  25. MESSAGE(FATAL_ERROR "Invalid/unsupported STM32 family: ${STM32_FAMILY}")
  26. ENDIF()
  27. SET(TOOLCHAIN_BIN_DIR ${TOOLCHAIN_PREFIX}/bin)
  28. SET(TOOLCHAIN_INC_DIR ${TOOLCHAIN_PREFIX}/${TARGET_TRIPLET}/include)
  29. SET(TOOLCHAIN_LIB_DIR ${TOOLCHAIN_PREFIX}/${TARGET_TRIPLET}/lib)
  30. SET(CMAKE_SYSTEM_NAME Generic)
  31. SET(CMAKE_SYSTEM_PROCESSOR arm)
  32. CMAKE_FORCE_C_COMPILER(${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-gcc GNU)
  33. CMAKE_FORCE_CXX_COMPILER(${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-g++ GNU)
  34. SET(CMAKE_ASM_COMPILER ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-gcc)
  35. SET(CMAKE_OBJCOPY ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-objcopy CACHE INTERNAL "objcopy tool")
  36. SET(CMAKE_OBJDUMP ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-objdump CACHE INTERNAL "objdump tool")
  37. SET(CMAKE_C_FLAGS_DEBUG "-Og -g" CACHE INTERNAL "c compiler flags debug")
  38. SET(CMAKE_CXX_FLAGS_DEBUG "-Og -g" CACHE INTERNAL "cxx compiler flags debug")
  39. SET(CMAKE_ASM_FLAGS_DEBUG "-g" CACHE INTERNAL "asm compiler flags debug")
  40. SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "" CACHE INTERNAL "linker flags debug")
  41. SET(CMAKE_C_FLAGS_RELEASE "-Os -flto" CACHE INTERNAL "c compiler flags release")
  42. SET(CMAKE_CXX_FLAGS_RELEASE "-Os -flto" CACHE INTERNAL "cxx compiler flags release")
  43. SET(CMAKE_ASM_FLAGS_RELEASE "" CACHE INTERNAL "asm compiler flags release")
  44. SET(CMAKE_EXE_LINKER_FLAGS_RELESE "-flto" CACHE INTERNAL "linker flags release")
  45. SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_PREFIX}/${TARGET_TRIPLET} ${EXTRA_FIND_PATH})
  46. SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
  47. SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
  48. SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  49. FUNCTION(STM32_ADD_HEX_BIN_TARGETS TARGET)
  50. ADD_CUSTOM_TARGET(${TARGET}.hex DEPENDS ${TARGET} COMMAND ${CMAKE_OBJCOPY} -Oihex ${TARGET} ${TARGET}.hex)
  51. ADD_CUSTOM_TARGET(${TARGET}.bin DEPENDS ${TARGET} COMMAND ${CMAKE_OBJCOPY} -Obinary ${TARGET} ${TARGET}.bin)
  52. ENDFUNCTION()
  53. STRING(TOLOWER ${STM32_FAMILY} STM32_FAMILY_LOWER)
  54. INCLUDE(${CMAKE_CURRENT_LIST_DIR}/gcc_stm32${STM32_FAMILY_LOWER}.cmake)
  55. MACRO(STM32_KB_TO_BYTES KB BYTES)
  56. STRING(REGEX REPLACE "^(.+)[kK]$" "\\1" KILOBYTES ${KB})
  57. IF(KILOBYTES)
  58. MATH(EXPR ${BYTES} "${KILOBYTES} * 1024")
  59. ELSE()
  60. SET(${BYTES} ${KB})
  61. ENDIF()
  62. ENDMACRO()
  63. FUNCTION(STM32_SET_FLASH_PARAMS TARGET STM32_FLASH_SIZE STM32_RAM_SIZE STM32_STACK_ADDRESS STM32_MIN_STACK_SIZE STM32_MIN_HEAP_SIZE STM32_FLASH_ORIGIN STM32_RAM_ORIGIN)
  64. IF(NOT STM32_LINKER_SCRIPT)
  65. MESSAGE(FATAL_ERROR "No linker script specified. Please specify linker script using STM32_LINKER_SCRIPT variable.")
  66. ENDIF()
  67. CONFIGURE_FILE(${STM32_LINKER_SCRIPT} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld)
  68. SET_TARGET_PROPERTIES(${TARGET} PROPERTIES LINK_FLAGS "-T${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld ${CMAKE_EXE_LINKER_FLAGS}")
  69. ENDFUNCTION()
  70. FUNCTION(STM32_SET_FLASH_PARAMS TARGET FLASH_SIZE RAM_SIZE)
  71. IF(NOT STM32_LINKER_SCRIPT)
  72. MESSAGE(FATAL_ERROR "No linker script specified. Please specify linker script using STM32_LINKER_SCRIPT variable.")
  73. ENDIF()
  74. STM32_KB_TO_BYTES(${FLASH_SIZE} FLASH_SIZE)
  75. STM32_KB_TO_BYTES(${RAM_SIZE} RAM_SIZE)
  76. IF(NOT STM32_FLASH_ORIGIN)
  77. SET(STM32_FLASH_ORIGIN "0x08000000")
  78. ENDIF()
  79. IF(NOT STM32_RAM_ORIGIN)
  80. SET(STM32_RAM_ORIGIN "536870912")
  81. ENDIF()
  82. IF(NOT STM32_STACK_ADDRESS)
  83. MATH(EXPR STM32_STACK_ADDRESS "${STM32_RAM_ORIGIN} + ${RAM_SIZE}")
  84. ENDIF()
  85. SET(STM32_FLASH_SIZE ${FLASH_SIZE})
  86. SET(STM32_RAM_SIZE ${RAM_SIZE})
  87. IF(NOT STM32_MIN_STACK_SIZE)
  88. SET(STM32_MIN_STACK_SIZE "0x200")
  89. ENDIF()
  90. IF(NOT STM32_MIN_HEAP_SIZE)
  91. SET(STM32_MIN_HEAP_SIZE "0")
  92. ENDIF()
  93. CONFIGURE_FILE(${STM32_LINKER_SCRIPT} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld)
  94. SET_TARGET_PROPERTIES(${TARGET} PROPERTIES LINK_FLAGS "-T${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld ${CMAKE_EXE_LINKER_FLAGS}")
  95. ENDFUNCTION()
  96. FUNCTION(STM32_SET_TARGET_PROPERTIES TARGET)
  97. IF(NOT STM32_CHIP_TYPE)
  98. IF(NOT STM32_CHIP)
  99. MESSAGE(WARNING "Neither STM32_CHIP_TYPE nor STM32_CHIP selected, you'll have to use STM32_SET_CHIP_DEFINITIONS directly")
  100. ELSE()
  101. STM32_GET_CHIP_TYPE(${STM32_CHIP} STM32_CHIP_TYPE)
  102. ENDIF()
  103. ENDIF()
  104. STM32_SET_CHIP_DEFINITIONS(${TARGET} ${STM32_CHIP_TYPE})
  105. IF(((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE)) AND (NOT STM32_CHIP))
  106. MESSAGE(FATAL_ERROR "Cannot get chip parameters. Please specify either STM32_CHIP or STM32_FLASH_SIZE/STM32_RAM_SIZE")
  107. ENDIF()
  108. IF((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE))
  109. STM32_GET_CHIP_PARAMETERS(${STM32_CHIP} STM32_FLASH_SIZE STM32_RAM_SIZE)
  110. IF((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE))
  111. MESSAGE(FATAL_ERROR "Unknown chip: ${STM32_CHIP}. Try to use STM32_FLASH_SIZE/STM32_RAM_SIZE directly.")
  112. ENDIF()
  113. ENDIF()
  114. STM32_SET_FLASH_PARAMS(${TARGET} ${STM32_FLASH_SIZE} ${STM32_RAM_SIZE})
  115. MESSAGE(STATUS "${STM32_CHIP} has ${STM32_FLASH_SIZE}iB of flash memory and ${STM32_RAM_SIZE}iB of RAM")
  116. ENDFUNCTION()
  117. MACRO(STM32_GENERATE_LIBRARIES NAME SOURCES LIBRARIES)
  118. STRING(TOLOWER ${STM32_FAMILY} STM32_FAMILY_LOWER)
  119. FOREACH(CHIP_TYPE ${STM32_CHIP_TYPES})
  120. STRING(TOLOWER ${CHIP_TYPE} CHIP_TYPE_LOWER)
  121. LIST(APPEND ${LIBRARIES} ${NAME}_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER})
  122. ADD_LIBRARY(${NAME}_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER} ${SOURCES})
  123. STM32_SET_CHIP_DEFINITIONS(${NAME}_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER} ${CHIP_TYPE})
  124. ENDFOREACH()
  125. ENDMACRO()