common.cmake 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. set(STM32_SUPPORTED_FAMILIES_LONG_NAME
  2. STM32F0 STM32F1 STM32F2 STM32F3 STM32F4 STM32F7
  3. STM32G0 STM32G4
  4. STM32H7_M4 STM32H7_M7
  5. STM32L0 STM32L1 STM32L4 STM32L5)
  6. foreach(FAMILY ${STM32_SUPPORTED_FAMILIES_LONG_NAME})
  7. string(REGEX MATCH "^STM32([A-Z][0-9])_?(M[47])?" FAMILY ${FAMILY})
  8. list(APPEND STM32_SUPPORTED_FAMILIES_SHORT_NAME ${CMAKE_MATCH_1})
  9. endforeach()
  10. list(REMOVE_DUPLICATES STM32_SUPPORTED_FAMILIES_SHORT_NAME)
  11. if(NOT STM32_TOOLCHAIN_PATH)
  12. if(NOT CMAKE_C_COMPILER)
  13. set(STM32_TOOLCHAIN_PATH "/usr")
  14. message(STATUS "No STM32_TOOLCHAIN_PATH specified, using default: " ${STM32_TOOLCHAIN_PATH})
  15. else()
  16. # keep only directory of compiler
  17. get_filename_component(STM32_TOOLCHAIN_PATH ${CMAKE_C_COMPILER} DIRECTORY)
  18. # remove the last /bin directory
  19. get_filename_component(STM32_TOOLCHAIN_PATH ${STM32_TOOLCHAIN_PATH} DIRECTORY)
  20. endif()
  21. file(TO_CMAKE_PATH "${STM32_TOOLCHAIN_PATH}" STM32_TOOLCHAIN_PATH)
  22. endif()
  23. if(NOT STM32_TARGET_TRIPLET)
  24. set(STM32_TARGET_TRIPLET "arm-none-eabi")
  25. message(STATUS "No STM32_TARGET_TRIPLET specified, using default: " ${STM32_TARGET_TRIPLET})
  26. endif()
  27. set(CMAKE_SYSTEM_NAME Generic)
  28. set(CMAKE_SYSTEM_PROCESSOR arm)
  29. set(TOOLCHAIN_SYSROOT "${STM32_TOOLCHAIN_PATH}/${STM32_TARGET_TRIPLET}")
  30. set(TOOLCHAIN_BIN_PATH "${STM32_TOOLCHAIN_PATH}/bin")
  31. set(TOOLCHAIN_INC_PATH "${STM32_TOOLCHAIN_PATH}/${STM32_TARGET_TRIPLET}/include")
  32. set(TOOLCHAIN_LIB_PATH "${STM32_TOOLCHAIN_PATH}/${STM32_TARGET_TRIPLET}/lib")
  33. find_program(CMAKE_OBJCOPY NAMES ${STM32_TARGET_TRIPLET}-objcopy PATHS ${TOOLCHAIN_BIN_PATH} NO_DEFAULT_PATH)
  34. find_program(CMAKE_OBJDUMP NAMES ${STM32_TARGET_TRIPLET}-objdump PATHS ${TOOLCHAIN_BIN_PATH} NO_DEFAULT_PATH)
  35. find_program(CMAKE_SIZE NAMES ${STM32_TARGET_TRIPLET}-size PATHS ${TOOLCHAIN_BIN_PATH} NO_DEFAULT_PATH)
  36. find_program(CMAKE_DEBUGGER NAMES ${STM32_TARGET_TRIPLET}-gdb PATHS ${TOOLCHAIN_BIN_PATH} NO_DEFAULT_PATH)
  37. find_program(CMAKE_CPPFILT NAMES ${STM32_TARGET_TRIPLET}-c++filt PATHS ${TOOLCHAIN_BIN_PATH} NO_DEFAULT_PATH)
  38. function(stm32_print_size_of_target TARGET)
  39. add_custom_target(${TARGET}_always_display_size
  40. ALL COMMAND ${CMAKE_SIZE} ${TARGET}${CMAKE_EXECUTABLE_SUFFIX_C}
  41. COMMENT "Target Sizes: "
  42. DEPENDS ${TARGET}
  43. )
  44. endfunction()
  45. function(stm32_get_chip_type FAMILY DEVICE TYPE)
  46. set(INDEX 0)
  47. foreach(C_TYPE ${STM32_${FAMILY}_TYPES})
  48. list(GET STM32_${FAMILY}_TYPE_MATCH ${INDEX} REGEXP)
  49. if(${DEVICE} MATCHES ${REGEXP})
  50. set(RESULT_TYPE ${C_TYPE})
  51. endif()
  52. math(EXPR INDEX "${INDEX}+1")
  53. endforeach()
  54. if(NOT RESULT_TYPE)
  55. message(FATAL_ERROR "Invalid/unsupported device: ${DEVICE}")
  56. endif()
  57. set(${TYPE} ${RESULT_TYPE} PARENT_SCOPE)
  58. endfunction()
  59. function(stm32_get_chip_info CHIP)
  60. set(ARG_OPTIONS "")
  61. set(ARG_SINGLE FAMILY DEVICE TYPE)
  62. set(ARG_MULTIPLE "")
  63. cmake_parse_arguments(PARSE_ARGV 1 ARG "${ARG_OPTIONS}" "${ARG_SINGLE}" "${ARG_MULTIPLE}")
  64. string(TOUPPER ${CHIP} CHIP)
  65. string(REGEX MATCH "^STM32([A-Z][0-9])([0-9A-Z][0-9][A-Z][0-9A-Z]).*$" CHIP ${CHIP})
  66. if((NOT CMAKE_MATCH_1) OR (NOT CMAKE_MATCH_2))
  67. message(FATAL_ERROR "Unknown chip ${CHIP}")
  68. endif()
  69. set(STM32_FAMILY ${CMAKE_MATCH_1})
  70. set(STM32_DEVICE "${CMAKE_MATCH_1}${CMAKE_MATCH_2}")
  71. if(NOT (${STM32_FAMILY} IN_LIST STM32_SUPPORTED_FAMILIES_SHORT_NAME))
  72. message(FATAL_ERROR "Unsupported family ${STM32_FAMILY} for device ${CHIP}")
  73. endif()
  74. stm32_get_chip_type(${STM32_FAMILY} ${STM32_DEVICE} STM32_TYPE)
  75. if(ARG_FAMILY)
  76. set(${ARG_FAMILY} ${STM32_FAMILY} PARENT_SCOPE)
  77. endif()
  78. if(ARG_DEVICE)
  79. set(${ARG_DEVICE} ${STM32_DEVICE} PARENT_SCOPE)
  80. endif()
  81. if(ARG_TYPE)
  82. set(${ARG_TYPE} ${STM32_TYPE} PARENT_SCOPE)
  83. endif()
  84. endfunction()
  85. function(stm32_get_cores CORES)
  86. set(ARG_OPTIONS "")
  87. set(ARG_SINGLE CHIP FAMILY DEVICE)
  88. set(ARG_MULTIPLE "")
  89. cmake_parse_arguments(PARSE_ARGV 1 ARG "${ARG_OPTIONS}" "${ARG_SINGLE}" "${ARG_MULTIPLE}")
  90. if(ARG_CHIP)
  91. stm32_get_chip_info(${ARG_CHIP} FAMILY ARG_FAMILY TYPE ARG_TYPE DEVICE ARG_DEVICE)
  92. elseif(ARG_FAMILY AND ARG_DEVICE)
  93. stm32_get_chip_type(${ARG_FAMILY} ${ARG_DEVICE} ARG_TYPE)
  94. elseif(ARG_FAMILY)
  95. if(${ARG_FAMILY} STREQUAL "H7")
  96. set(${CORES} M7 M4 PARENT_SCOPE)
  97. else()
  98. set(${CORES} "" PARENT_SCOPE)
  99. endif()
  100. return()
  101. else()
  102. message(FATAL_ERROR "Either CHIP or FAMILY or FAMILY/DEVICE should be specified for stm32_get_cores()")
  103. endif()
  104. if(${ARG_FAMILY} STREQUAL "H7")
  105. stm32h7_get_device_cores(${ARG_DEVICE} ${ARG_TYPE} CORE_LIST)
  106. endif()
  107. set(${CORES} "${CORE_LIST}" PARENT_SCOPE)
  108. endfunction()
  109. function(stm32_get_memory_info)
  110. set(ARG_OPTIONS FLASH RAM CCRAM STACK HEAP)
  111. set(ARG_SINGLE CHIP FAMILY DEVICE CORE SIZE ORIGIN)
  112. set(ARG_MULTIPLE "")
  113. cmake_parse_arguments(INFO "${ARG_OPTIONS}" "${ARG_SINGLE}" "${ARG_MULTIPLE}" ${ARGN})
  114. if((NOT INFO_CHIP) AND ((NOT INFO_FAMILY) OR (NOT INFO_DEVICE)))
  115. message(FATAL_ERROR "Either CHIP or FAMILY/DEVICE is required for stm32_get_memory_info()")
  116. endif()
  117. if(INFO_CHIP)
  118. stm32_get_chip_info(${INFO_CHIP} FAMILY INFO_FAMILY TYPE INFO_TYPE DEVICE INFO_DEVICE)
  119. else()
  120. stm32_get_chip_type(${INFO_FAMILY} ${INFO_DEVICE} INFO_TYPE)
  121. endif()
  122. string(REGEX REPLACE "^[FGHL][0-9][0-9A-Z][0-9].([3468BCDEFGHIZ])$" "\\1" SIZE_CODE ${INFO_DEVICE})
  123. if(SIZE_CODE STREQUAL "3")
  124. set(FLASH "8K")
  125. elseif(SIZE_CODE STREQUAL "4")
  126. set(FLASH "16K")
  127. elseif(SIZE_CODE STREQUAL "6")
  128. set(FLASH "32K")
  129. elseif(SIZE_CODE STREQUAL "8")
  130. set(FLASH "64K")
  131. elseif(SIZE_CODE STREQUAL "B")
  132. set(FLASH "128K")
  133. elseif(SIZE_CODE STREQUAL "C")
  134. set(FLASH "256K")
  135. elseif(SIZE_CODE STREQUAL "D")
  136. set(FLASH "384K")
  137. elseif(SIZE_CODE STREQUAL "E")
  138. set(FLASH "512K")
  139. elseif(SIZE_CODE STREQUAL "F")
  140. set(FLASH "768K")
  141. elseif(SIZE_CODE STREQUAL "G")
  142. set(FLASH "1024K")
  143. elseif(SIZE_CODE STREQUAL "H")
  144. set(FLASH "1536K")
  145. elseif(SIZE_CODE STREQUAL "I")
  146. set(FLASH "2048K")
  147. elseif(SIZE_CODE STREQUAL "Z")
  148. set(FLASH "192K")
  149. else()
  150. set(FLASH "16K")
  151. message(WARNING "Unknow flash size for device ${DEVICE}. Set to ${FLASH}")
  152. endif()
  153. list(FIND STM32_${INFO_FAMILY}_TYPES ${INFO_TYPE} TYPE_INDEX)
  154. list(GET STM32_${INFO_FAMILY}_RAM_SIZES ${TYPE_INDEX} RAM)
  155. list(GET STM32_${INFO_FAMILY}_CCRAM_SIZES ${TYPE_INDEX} CCRAM)
  156. set(FLASH_ORIGIN 0x8000000)
  157. set(RAM_ORIGIN 0x20000000)
  158. set(CCRAM_ORIGIN 0x10000000)
  159. if(FAMILY STREQUAL "F1")
  160. stm32f1_get_memory_info(${INFO_DEVICE} ${INFO_TYPE} FLASH RAM)
  161. elseif(FAMILY STREQUAL "L1")
  162. stm32l1_get_memory_info(${INFO_DEVICE} ${INFO_TYPE} FLASH RAM)
  163. elseif(FAMILY STREQUAL "F2")
  164. stm32f2_get_memory_info(${INFO_DEVICE} ${INFO_TYPE} FLASH RAM)
  165. elseif(FAMILY STREQUAL "F3")
  166. stm32f3_get_memory_info(${INFO_DEVICE} ${INFO_TYPE} FLASH RAM)
  167. elseif(FAMILY STREQUAL "H7")
  168. stm32h7_get_memory_info(${INFO_DEVICE} ${INFO_TYPE} "${INFO_CORE}" RAM FLASH_ORIGIN RAM_ORIGIN TWO_FLASH_BANKS)
  169. if(TWO_FLASH_BANKS)
  170. string(REGEX MATCH "([0-9]+)K" FLASH_KB ${FLASH})
  171. math(EXPR FLASH_KB "${CMAKE_MATCH_1} / 2")
  172. set(FLASH "${FLASH_KB}K")
  173. endif()
  174. endif()
  175. if(INFO_FLASH)
  176. set(SIZE ${FLASH})
  177. set(ORIGIN ${FLASH_ORIGIN})
  178. elseif(INFO_RAM)
  179. set(SIZE ${RAM})
  180. set(ORIGIN ${RAM_ORIGIN})
  181. elseif(INFO_CCRAM)
  182. set(SIZE ${CCRAM})
  183. set(ORIGIN ${CCRAM_ORIGIN})
  184. elseif(INFO_STACK)
  185. if (RAM STREQUAL "2K")
  186. set(SIZE 0x200)
  187. else()
  188. set(SIZE 0x400)
  189. endif()
  190. set(ORIGIN ${RAM_ORIGIN}) #TODO: Real stack pointer?
  191. elseif(INFO_HEAP)
  192. if (RAM STREQUAL "2K")
  193. set(SIZE 0x100)
  194. else()
  195. set(SIZE 0x200)
  196. endif()
  197. set(ORIGIN ${RAM_ORIGIN}) #TODO: Real heap pointer?
  198. endif()
  199. if(INFO_SIZE)
  200. set(${INFO_SIZE} ${SIZE} PARENT_SCOPE)
  201. endif()
  202. if(INFO_ORIGIN)
  203. set(${INFO_ORIGIN} ${ORIGIN} PARENT_SCOPE)
  204. endif()
  205. endfunction()
  206. function(stm32_add_linker_script TARGET VISIBILITY SCRIPT)
  207. get_filename_component(SCRIPT "${SCRIPT}" ABSOLUTE)
  208. target_link_options(${TARGET} ${VISIBILITY} -T "${SCRIPT}")
  209. get_target_property(TARGET_TYPE ${TARGET} TYPE)
  210. if(TARGET_TYPE STREQUAL "INTERFACE_LIBRARY")
  211. set(INTERFACE_PREFIX "INTERFACE_")
  212. endif()
  213. get_target_property(LINK_DEPENDS ${TARGET} ${INTERFACE_PREFIX}LINK_DEPENDS)
  214. if(LINK_DEPENDS)
  215. list(APPEND LINK_DEPENDS "${SCRIPT}")
  216. else()
  217. set(LINK_DEPENDS "${SCRIPT}")
  218. endif()
  219. set_target_properties(${TARGET} PROPERTIES ${INTERFACE_PREFIX}LINK_DEPENDS "${LINK_DEPENDS}")
  220. endfunction()
  221. if(NOT (TARGET STM32::NoSys))
  222. add_library(STM32::NoSys INTERFACE IMPORTED)
  223. target_compile_options(STM32::NoSys INTERFACE $<$<C_COMPILER_ID:GNU>:--specs=nosys.specs>)
  224. target_link_options(STM32::NoSys INTERFACE $<$<C_COMPILER_ID:GNU>:--specs=nosys.specs>)
  225. #This custom property is used to check that specs is not set yet on a target linking to this one
  226. set_property(TARGET STM32::NoSys PROPERTY INTERFACE_CUSTOM_GCC_SPECS "NOSYS")
  227. set_property(TARGET STM32::NoSys APPEND PROPERTY
  228. COMPATIBLE_INTERFACE_STRING CUSTOM_GCC_SPECS)
  229. endif()
  230. if(NOT (TARGET STM32::Nano))
  231. add_library(STM32::Nano INTERFACE IMPORTED)
  232. target_compile_options(STM32::Nano INTERFACE $<$<C_COMPILER_ID:GNU>:--specs=nano.specs>)
  233. target_link_options(STM32::Nano INTERFACE $<$<C_COMPILER_ID:GNU>:--specs=nano.specs>)
  234. #This custom property is used to check that specs is not set yet on a target linking to this one
  235. set_property(TARGET STM32::Nano PROPERTY INTERFACE_CUSTOM_GCC_SPECS "NANO")
  236. set_property(TARGET STM32::Nano APPEND PROPERTY
  237. COMPATIBLE_INTERFACE_STRING CUSTOM_GCC_SPECS)
  238. endif()
  239. include(stm32/utilities)
  240. include(stm32/f0)
  241. include(stm32/f1)
  242. include(stm32/f2)
  243. include(stm32/f3)
  244. include(stm32/f4)
  245. include(stm32/f7)
  246. include(stm32/g0)
  247. include(stm32/g4)
  248. include(stm32/h7)
  249. include(stm32/l0)
  250. include(stm32/l1)
  251. include(stm32/l4)
  252. include(stm32/l5)