common.cmake 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. set(STM32_SUPPORTED_FAMILIES L0 L1 L4 F0 F1 F2 F3 F4 F7 H7)
  2. if(NOT STM32_TOOLCHAIN_PATH)
  3. set(STM32_TOOLCHAIN_PATH "/usr")
  4. message(STATUS "No STM32_TOOLCHAIN_PATH specified, using default: " ${STM32_TOOLCHAIN_PATH})
  5. else()
  6. file(TO_CMAKE_PATH "${STM32_TOOLCHAIN_PATH}" STM32_TOOLCHAIN_PATH)
  7. endif()
  8. if(NOT STM32_TARGET_TRIPLET)
  9. set(STM32_TARGET_TRIPLET "arm-none-eabi")
  10. message(STATUS "No STM32_TARGET_TRIPLET specified, using default: " ${STM32_TARGET_TRIPLET})
  11. endif()
  12. set(CMAKE_SYSTEM_NAME Generic)
  13. set(CMAKE_SYSTEM_PROCESSOR arm)
  14. set(TOOLCHAIN_SYSROOT "${STM32_TOOLCHAIN_PATH}/${STM32_TARGET_TRIPLET}")
  15. set(TOOLCHAIN_BIN_PATH "${STM32_TOOLCHAIN_PATH}/bin")
  16. set(TOOLCHAIN_INC_PATH "${STM32_TOOLCHAIN_PATH}/${STM32_TARGET_TRIPLET}/include")
  17. set(TOOLCHAIN_LIB_PATH "${STM32_TOOLCHAIN_PATH}/${STM32_TARGET_TRIPLET}/lib")
  18. find_program(CMAKE_OBJCOPY NAMES ${STM32_TARGET_TRIPLET}-objcopy PATHS ${TOOLCHAIN_BIN_PATH})
  19. find_program(CMAKE_OBJDUMP NAMES ${STM32_TARGET_TRIPLET}-objdump PATHS ${TOOLCHAIN_BIN_PATH})
  20. find_program(CMAKE_SIZE NAMES ${STM32_TARGET_TRIPLET}-size PATHS ${TOOLCHAIN_BIN_PATH})
  21. find_program(CMAKE_DEBUGGER NAMES ${STM32_TARGET_TRIPLET}-gdb PATHS ${TOOLCHAIN_BIN_PATH})
  22. find_program(CMAKE_CPPFILT NAMES ${STM32_TARGET_TRIPLET}-c++filt PATHS ${TOOLCHAIN_BIN_PATH})
  23. function(stm32_get_chip_type FAMILY DEVICE TYPE)
  24. set(INDEX 0)
  25. foreach(C_TYPE ${STM32_${FAMILY}_TYPES})
  26. list(GET STM32_${FAMILY}_TYPE_MATCH ${INDEX} REGEXP)
  27. if(${DEVICE} MATCHES ${REGEXP})
  28. set(RESULT_TYPE ${C_TYPE})
  29. endif()
  30. math(EXPR INDEX "${INDEX}+1")
  31. endforeach()
  32. if(NOT RESULT_TYPE)
  33. message(FATAL_ERROR "Invalid/unsupported device: ${DEVICE}")
  34. endif()
  35. set(${TYPE} ${RESULT_TYPE} PARENT_SCOPE)
  36. endfunction()
  37. function(stm32_get_chip_info CHIP FAMILY TYPE DEVICE)
  38. string(TOUPPER ${CHIP} CHIP)
  39. string(REGEX MATCH "^STM32([A-Z][0-9])([0-9][0-9][A-Z][0-9A-Z]).*$" CHIP ${CHIP})
  40. if((NOT CMAKE_MATCH_1) OR (NOT CMAKE_MATCH_2))
  41. message(FATAL_ERROR "Unknown chip ${CHIP}")
  42. endif()
  43. set(STM32_FAMILY ${CMAKE_MATCH_1})
  44. set(STM32_DEVICE "${CMAKE_MATCH_1}${CMAKE_MATCH_2}")
  45. list(FIND STM32_SUPPORTED_FAMILIES ${STM32_FAMILY} STM32_FAMILY_INDEX)
  46. if (STM32_FAMILY_INDEX EQUAL -1)
  47. message(FATAL_ERROR "Unsupported family ${STM32_FAMILY} for device ${CHIP}")
  48. endif()
  49. stm32_get_chip_type(${STM32_FAMILY} ${STM32_DEVICE} STM32_TYPE)
  50. set(${FAMILY} ${STM32_FAMILY} PARENT_SCOPE)
  51. set(${DEVICE} ${STM32_DEVICE} PARENT_SCOPE)
  52. set(${TYPE} ${STM32_TYPE} PARENT_SCOPE)
  53. endfunction()
  54. function(stm32_get_memory_info FAMILY DEVICE
  55. FLASH_SIZE RAM_SIZE CCRAM_SIZE STACK_SIZE HEAP_SIZE
  56. FLASH_ORIGIN RAM_ORIGIN CCRAM_ORIGIN
  57. )
  58. string(REGEX REPLACE "^[FHL][0-9][0-9][0-9].([468BCDEGHI])$" "\\1" SIZE_CODE ${DEVICE})
  59. if(SIZE_CODE STREQUAL "4")
  60. set(FLASH "16K")
  61. elseif(SIZE_CODE STREQUAL "6")
  62. set(FLASH "32K")
  63. elseif(SIZE_CODE STREQUAL "8")
  64. set(FLASH "64K")
  65. elseif(SIZE_CODE STREQUAL "B")
  66. set(FLASH "128K")
  67. elseif(SIZE_CODE STREQUAL "C")
  68. set(FLASH "256K")
  69. elseif(SIZE_CODE STREQUAL "D")
  70. set(FLASH "384K")
  71. elseif(SIZE_CODE STREQUAL "E")
  72. set(FLASH "512K")
  73. elseif(SIZE_CODE STREQUAL "G")
  74. set(FLASH "1024K")
  75. elseif(SIZE_CODE STREQUAL "H")
  76. set(FLASH "1536K")
  77. elseif(SIZE_CODE STREQUAL "I")
  78. set(FLASH "2048K")
  79. else()
  80. set(FLASH "16K")
  81. message(WARNING "Unknow flash size for device ${DEVICE}")
  82. endif()
  83. stm32_get_chip_type(${FAMILY} ${DEVICE} TYPE)
  84. list(FIND STM32_${FAMILY}_TYPES ${TYPE} TYPE_INDEX)
  85. list(GET STM32_${FAMILY}_RAM_SIZES ${TYPE_INDEX} RAM)
  86. list(GET STM32_${FAMILY}_CCRAM_SIZES ${TYPE_INDEX} CCRAM)
  87. set(${FLASH_SIZE} ${FLASH} PARENT_SCOPE)
  88. set(${RAM_SIZE} ${RAM} PARENT_SCOPE)
  89. set(${CCRAM_SIZE} ${CCRAM} PARENT_SCOPE)
  90. set(${STACK_SIZE} 0x400 PARENT_SCOPE)
  91. set(${HEAP_SIZE} 0x200 PARENT_SCOPE)
  92. set(${FLASH_ORIGIN} 0x8000000 PARENT_SCOPE)
  93. set(${RAM_ORIGIN} 0x20000000 PARENT_SCOPE)
  94. set(${CCRAM_ORIGIN} 0x10000000 PARENT_SCOPE)
  95. endfunction()
  96. function(stm32_add_linker_script TARGET VISIBILITY SCRIPT)
  97. get_filename_component(SCRIPT "${SCRIPT}" ABSOLUTE)
  98. target_link_options(${TARGET} ${VISIBILITY} -T "${SCRIPT}")
  99. endfunction()
  100. if(NOT (TARGET STM32::NoSys))
  101. add_library(STM32::NoSys INTERFACE IMPORTED)
  102. target_compile_options(STM32::NoSys INTERFACE $<$<C_COMPILER_ID:GNU>:--specs=nosys.specs>)
  103. target_link_options(STM32::NoSys INTERFACE $<$<C_COMPILER_ID:GNU>:--specs=nosys.specs>)
  104. endif()
  105. include(stm32/utilities)
  106. include(stm32/f0)
  107. include(stm32/f4)