common.cmake 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. set(STM32_SUPPORTED_FAMILIES F0 F1 F2 F3 F4 F7 G0 G4 H7 L0 L1 L4)
  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} NO_DEFAULT_PATH)
  19. find_program(CMAKE_OBJDUMP NAMES ${STM32_TARGET_TRIPLET}-objdump PATHS ${TOOLCHAIN_BIN_PATH} NO_DEFAULT_PATH)
  20. find_program(CMAKE_SIZE NAMES ${STM32_TARGET_TRIPLET}-size PATHS ${TOOLCHAIN_BIN_PATH} NO_DEFAULT_PATH)
  21. find_program(CMAKE_DEBUGGER NAMES ${STM32_TARGET_TRIPLET}-gdb PATHS ${TOOLCHAIN_BIN_PATH} NO_DEFAULT_PATH)
  22. find_program(CMAKE_CPPFILT NAMES ${STM32_TARGET_TRIPLET}-c++filt PATHS ${TOOLCHAIN_BIN_PATH} NO_DEFAULT_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)
  38. set(ARG_OPTIONS "")
  39. set(ARG_SINGLE FAMILY DEVICE TYPE)
  40. set(ARG_MULTIPLE "")
  41. cmake_parse_arguments(PARSE_ARGV 1 ARG "${ARG_OPTIONS}" "${ARG_SINGLE}" "${ARG_MULTIPLE}")
  42. string(TOUPPER ${CHIP} CHIP)
  43. string(REGEX MATCH "^STM32([A-Z][0-9])([0-9A-Z][0-9][A-Z][0-9A-Z]).*$" CHIP ${CHIP})
  44. if((NOT CMAKE_MATCH_1) OR (NOT CMAKE_MATCH_2))
  45. message(FATAL_ERROR "Unknown chip ${CHIP}")
  46. endif()
  47. set(STM32_FAMILY ${CMAKE_MATCH_1})
  48. set(STM32_DEVICE "${CMAKE_MATCH_1}${CMAKE_MATCH_2}")
  49. list(FIND STM32_SUPPORTED_FAMILIES ${STM32_FAMILY} STM32_FAMILY_INDEX)
  50. if (STM32_FAMILY_INDEX EQUAL -1)
  51. message(FATAL_ERROR "Unsupported family ${STM32_FAMILY} for device ${CHIP}")
  52. endif()
  53. stm32_get_chip_type(${STM32_FAMILY} ${STM32_DEVICE} STM32_TYPE)
  54. if(ARG_FAMILY)
  55. set(${ARG_FAMILY} ${STM32_FAMILY} PARENT_SCOPE)
  56. endif()
  57. if(ARG_DEVICE)
  58. set(${ARG_DEVICE} ${STM32_DEVICE} PARENT_SCOPE)
  59. endif()
  60. if(ARG_TYPE)
  61. set(${ARG_TYPE} ${STM32_TYPE} PARENT_SCOPE)
  62. endif()
  63. endfunction()
  64. function(stm32_get_cores CORES)
  65. set(ARG_OPTIONS "")
  66. set(ARG_SINGLE CHIP FAMILY DEVICE)
  67. set(ARG_MULTIPLE "")
  68. cmake_parse_arguments(PARSE_ARGV 1 ARG "${ARG_OPTIONS}" "${ARG_SINGLE}" "${ARG_MULTIPLE}")
  69. if(ARG_CHIP)
  70. stm32_get_chip_info(${ARG_CHIP} FAMILY ARG_FAMILY TYPE ARG_TYPE DEVICE ARG_DEVICE)
  71. elseif(ARG_FAMILY AND ARG_DEVICE)
  72. stm32_get_chip_type(${ARG_FAMILY} ${ARG_DEVICE} ARG_TYPE)
  73. elseif(ARG_FAMILY)
  74. if(${ARG_FAMILY} STREQUAL "H7")
  75. set(${CORES} M7 M4 PARENT_SCOPE)
  76. else()
  77. set(${CORES} "" PARENT_SCOPE)
  78. endif()
  79. return()
  80. else()
  81. message(FATAL_ERROR "Either CHIP or FAMILY or FAMILY/DEVICE should be specified for stm32_get_cores()")
  82. endif()
  83. if(${ARG_FAMILY} STREQUAL "H7")
  84. stm32h7_get_device_cores(${ARG_DEVICE} ${ARG_TYPE} CORE_LIST)
  85. endif()
  86. set(${CORES} "${CORE_LIST}" PARENT_SCOPE)
  87. endfunction()
  88. function(stm32_get_memory_info)
  89. set(ARG_OPTIONS FLASH RAM CCRAM STACK HEAP)
  90. set(ARG_SINGLE CHIP FAMILY DEVICE CORE SIZE ORIGIN)
  91. set(ARG_MULTIPLE "")
  92. cmake_parse_arguments(INFO "${ARG_OPTIONS}" "${ARG_SINGLE}" "${ARG_MULTIPLE}" ${ARGN})
  93. if((NOT INFO_CHIP) AND ((NOT INFO_FAMILY) OR (NOT INFO_DEVICE)))
  94. message(FATAL_ERROR "Either CHIP or FAMILY/DEVICE is required for stm32_get_memory_info()")
  95. endif()
  96. if(INFO_CHIP)
  97. stm32_get_chip_info(${INFO_CHIP} FAMILY INFO_FAMILY TYPE INFO_TYPE DEVICE INFO_DEVICE)
  98. else()
  99. stm32_get_chip_type(${INFO_FAMILY} ${INFO_DEVICE} INFO_TYPE)
  100. endif()
  101. string(REGEX REPLACE "^[FGHL][0-9][0-9A-Z][0-9].([3468BCDEFGHIZ])$" "\\1" SIZE_CODE ${INFO_DEVICE})
  102. if(SIZE_CODE STREQUAL "3")
  103. set(FLASH "8K")
  104. elseif(SIZE_CODE STREQUAL "4")
  105. set(FLASH "16K")
  106. elseif(SIZE_CODE STREQUAL "6")
  107. set(FLASH "32K")
  108. elseif(SIZE_CODE STREQUAL "8")
  109. set(FLASH "64K")
  110. elseif(SIZE_CODE STREQUAL "B")
  111. set(FLASH "128K")
  112. elseif(SIZE_CODE STREQUAL "C")
  113. set(FLASH "256K")
  114. elseif(SIZE_CODE STREQUAL "D")
  115. set(FLASH "384K")
  116. elseif(SIZE_CODE STREQUAL "E")
  117. set(FLASH "512K")
  118. elseif(SIZE_CODE STREQUAL "F")
  119. set(FLASH "768K")
  120. elseif(SIZE_CODE STREQUAL "G")
  121. set(FLASH "1024K")
  122. elseif(SIZE_CODE STREQUAL "H")
  123. set(FLASH "1536K")
  124. elseif(SIZE_CODE STREQUAL "I")
  125. set(FLASH "2048K")
  126. elseif(SIZE_CODE STREQUAL "Z")
  127. set(FLASH "192K")
  128. else()
  129. set(FLASH "16K")
  130. message(WARNING "Unknow flash size for device ${DEVICE}. Set to ${FLASH}")
  131. endif()
  132. list(FIND STM32_${INFO_FAMILY}_TYPES ${INFO_TYPE} TYPE_INDEX)
  133. list(GET STM32_${INFO_FAMILY}_RAM_SIZES ${TYPE_INDEX} RAM)
  134. list(GET STM32_${INFO_FAMILY}_CCRAM_SIZES ${TYPE_INDEX} CCRAM)
  135. set(FLASH_ORIGIN 0x8000000)
  136. set(RAM_ORIGIN 0x20000000)
  137. set(CCRAM_ORIGIN 0x10000000)
  138. if(FAMILY STREQUAL "F1")
  139. stm32f1_get_memory_info(${INFO_DEVICE} ${INFO_TYPE} FLASH RAM)
  140. elseif(FAMILY STREQUAL "L1")
  141. stm32l1_get_memory_info(${INFO_DEVICE} ${INFO_TYPE} FLASH RAM)
  142. elseif(FAMILY STREQUAL "F2")
  143. stm32f2_get_memory_info(${INFO_DEVICE} ${INFO_TYPE} FLASH RAM)
  144. elseif(FAMILY STREQUAL "F3")
  145. stm32f3_get_memory_info(${INFO_DEVICE} ${INFO_TYPE} FLASH RAM)
  146. elseif(FAMILY STREQUAL "H7")
  147. stm32h7_get_memory_info(${INFO_DEVICE} ${INFO_TYPE} "${INFO_CORE}" RAM FLASH_ORIGIN RAM_ORIGIN TWO_FLASH_BANKS)
  148. if(TWO_FLASH_BANKS)
  149. string(REGEX MATCH "([0-9]+)K" FLASH_KB ${FLASH})
  150. math(EXPR FLASH_KB "${CMAKE_MATCH_1} / 2")
  151. set(FLASH "${FLASH_KB}K")
  152. endif()
  153. endif()
  154. if(INFO_FLASH)
  155. set(SIZE ${FLASH})
  156. set(ORIGIN ${FLASH_ORIGIN})
  157. elseif(INFO_RAM)
  158. set(SIZE ${RAM})
  159. set(ORIGIN ${RAM_ORIGIN})
  160. elseif(INFO_CCRAM)
  161. set(SIZE ${CCRAM})
  162. set(ORIGIN ${CCRAM_ORIGIN})
  163. elseif(INFO_STACK)
  164. if (RAM STREQUAL "2K")
  165. set(SIZE 0x200)
  166. else()
  167. set(SIZE 0x400)
  168. endif()
  169. set(ORIGIN ${RAM_ORIGIN}) #TODO: Real stack pointer?
  170. elseif(INFO_HEAP)
  171. if (RAM STREQUAL "2K")
  172. set(SIZE 0x100)
  173. else()
  174. set(SIZE 0x200)
  175. endif()
  176. set(ORIGIN ${RAM_ORIGIN}) #TODO: Real heap pointer?
  177. endif()
  178. if(INFO_SIZE)
  179. set(${INFO_SIZE} ${SIZE} PARENT_SCOPE)
  180. endif()
  181. if(INFO_ORIGIN)
  182. set(${INFO_ORIGIN} ${ORIGIN} PARENT_SCOPE)
  183. endif()
  184. endfunction()
  185. function(stm32_add_linker_script TARGET VISIBILITY SCRIPT)
  186. get_filename_component(SCRIPT "${SCRIPT}" ABSOLUTE)
  187. target_link_options(${TARGET} ${VISIBILITY} -T "${SCRIPT}")
  188. endfunction()
  189. if(NOT (TARGET STM32::NoSys))
  190. add_library(STM32::NoSys INTERFACE IMPORTED)
  191. target_compile_options(STM32::NoSys INTERFACE $<$<C_COMPILER_ID:GNU>:--specs=nosys.specs>)
  192. target_link_options(STM32::NoSys INTERFACE $<$<C_COMPILER_ID:GNU>:--specs=nosys.specs>)
  193. endif()
  194. include(stm32/utilities)
  195. include(stm32/f0)
  196. include(stm32/f1)
  197. include(stm32/f2)
  198. include(stm32/f3)
  199. include(stm32/f4)
  200. include(stm32/f7)
  201. include(stm32/g0)
  202. include(stm32/g4)
  203. include(stm32/h7)
  204. include(stm32/l0)
  205. include(stm32/l1)
  206. include(stm32/l4)