utilities.cmake 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. function(stm32_util_create_family_targets FAMILY)
  2. set(CORES ${ARGN})
  3. list(LENGTH CORES NUM_CORES)
  4. if(${NUM_CORES} EQUAL 0)
  5. set(CORE "")
  6. set(CORE_C "")
  7. elseif(${NUM_CORES} EQUAL 1)
  8. set(CORE "_${CORES}")
  9. set(CORE_C "::${CORES}")
  10. else()
  11. message(FATAL_ERROR "Expected at most one core for family ${FAMILY}: ${CORES}")
  12. endif()
  13. if(NOT (TARGET STM32::${FAMILY}${CORE_C}))
  14. add_library(STM32::${FAMILY}${CORE_C} INTERFACE IMPORTED)
  15. # Set compiler flags for target
  16. # -Wall: all warnings activated
  17. # -ffunction-sections -fdata-sections: remove unused code
  18. target_compile_options(STM32::${FAMILY}${CORE_C} INTERFACE
  19. --sysroot="${TOOLCHAIN_SYSROOT}"
  20. -mthumb -Wall -ffunction-sections -fdata-sections
  21. )
  22. # Set linker flags
  23. # -mthumb: Generate thumb code
  24. # -Wl,--gc-sections: Remove unused code
  25. target_link_options(STM32::${FAMILY}${CORE_C} INTERFACE
  26. --sysroot="${TOOLCHAIN_SYSROOT}"
  27. -mthumb -Wl,--gc-sections
  28. )
  29. target_compile_definitions(STM32::${FAMILY}${CORE_C} INTERFACE
  30. STM32${FAMILY}
  31. )
  32. endif()
  33. foreach(TYPE ${STM32_${FAMILY}_TYPES})
  34. if(NOT (TARGET STM32::${TYPE}${CORE_C}))
  35. add_library(STM32::${TYPE}${CORE_C} INTERFACE IMPORTED)
  36. target_link_libraries(STM32::${TYPE}${CORE_C} INTERFACE STM32::${FAMILY}${CORE_C})
  37. target_compile_definitions(STM32::${TYPE}${CORE_C} INTERFACE
  38. STM32${TYPE}
  39. )
  40. endif()
  41. endforeach()
  42. endfunction()
  43. include(FetchContent)
  44. # A CMSIS or HAL driver can specify 'cube' as version number to indicate that the driver is taken from the Cube repository
  45. set(STM32_FETCH_FAMILIES F0 F1 F2 F3 F4 F7 G0 G4 H7 L0 L1 L4 L5 MP1 U5 WB WL )
  46. set(STM32_FETCH_CUBE_VERSIONS v1.11.2 v1.8.4 v1.9.3 v1.11.2 v1.26.1 v1.16.1 v1.4.1 v1.4.0 v1.9.0 v1.12.0 v1.10.3 v1.17.0 v1.4.0 1.5.0 v1.0.0 v1.12.0 v1.1.0)
  47. set(STM32_FETCH_CMSIS_VERSIONS v2.3.5 v4.3.3 v2.2.5 v2.3.5 v2.6.6 v1.2.6 v1.4.0 v1.2.1 v1.10.0 v1.9.1 v2.3.2 v1.7.1 v1.0.4 cube v1.0.0 v1.9.0 v1.1.0)
  48. set(STM32_FETCH_HAL_VERSIONS v1.7.5 v1.1.8 v1.2.7 v1.5.5 v1.7.12 v1.2.9 v1.4.1 v1.2.1 v1.10.0 v1.10.4 v1.4.4 v1.13.0 v1.0.4 cube v1.0.0 v1.9.0 v1.1.0)
  49. FetchContent_Declare(
  50. STM32-CMSIS
  51. GIT_REPOSITORY https://github.com/STMicroelectronics/cmsis_core/
  52. GIT_TAG v5.6.0
  53. GIT_PROGRESS TRUE
  54. )
  55. set(IDX 0)
  56. foreach(FAMILY ${STM32_FETCH_FAMILIES})
  57. string(TOLOWER ${FAMILY} FAMILY_L)
  58. list(GET STM32_FETCH_CUBE_VERSIONS ${IDX} CUBE_VERSION)
  59. list(GET STM32_FETCH_CMSIS_VERSIONS ${IDX} CMSIS_VERSION)
  60. list(GET STM32_FETCH_HAL_VERSIONS ${IDX} HAL_VERSION)
  61. FetchContent_Declare(
  62. STM32Cube${FAMILY}
  63. GIT_REPOSITORY https://github.com/STMicroelectronics/STM32Cube${FAMILY}/
  64. GIT_TAG ${CUBE_VERSION}
  65. GIT_PROGRESS TRUE
  66. )
  67. if(CMSIS_VERSION STREQUAL cube)
  68. set(STM32_USE_CMSIS_FROM_CUBE_${FAMILY} ON)
  69. else()
  70. FetchContent_Declare(
  71. STM32-CMSIS-${FAMILY}
  72. GIT_REPOSITORY https://github.com/STMicroelectronics/cmsis_device_${FAMILY_L}/
  73. GIT_TAG ${CMSIS_VERSION}
  74. GIT_PROGRESS TRUE
  75. )
  76. endif()
  77. if(HAL_VERSION STREQUAL cube)
  78. set(STM32_USE_HAL_FROM_CUBE_${FAMILY} ON)
  79. else()
  80. FetchContent_Declare(
  81. STM32-HAL-${FAMILY}
  82. GIT_REPOSITORY https://github.com/STMicroelectronics/stm32${FAMILY_L}xx_hal_driver/
  83. GIT_TAG ${HAL_VERSION}
  84. GIT_PROGRESS TRUE
  85. )
  86. endif()
  87. math(EXPR IDX "${IDX} + 1")
  88. endforeach()
  89. function(stm32_fetch_cube)
  90. foreach(FAMILY ${ARGV})
  91. set(CUBE_NAME STM32Cube${FAMILY})
  92. string(TOLOWER ${CUBE_NAME} CUBE_NAME_L)
  93. if(STM32_CUBE_${FAMILY}_PATH)
  94. message(VERBOSE "STM32_CUBE_${FAMILY}_PATH specified, skipping fetch for ${CUBE_NAME}")
  95. continue()
  96. endif()
  97. FetchContent_MakeAvailable(${CUBE_NAME})
  98. set(STM32_CUBE_${FAMILY}_PATH ${${CUBE_NAME_L}_SOURCE_DIR} PARENT_SCOPE)
  99. endforeach()
  100. endfunction()
  101. function(stm32_fetch_cmsis)
  102. if(NOT STM32_CMSIS_PATH)
  103. FetchContent_MakeAvailable(STM32-CMSIS)
  104. set(STM32_CMSIS_PATH ${stm32-cmsis_SOURCE_DIR} PARENT_SCOPE)
  105. else()
  106. message(INFO "STM32_CMSIS_PATH specified, skipping fetch for STM32-CMSIS")
  107. endif()
  108. foreach(FAMILY ${ARGV})
  109. if(STM32_USE_CMSIS_FROM_CUBE_${FAMILY})
  110. stm32_fetch_cube(${FAMILY})
  111. message(STATUS "Cube fetched for ${FAMILY} at ${STM32_CUBE_${FAMILY}_PATH}")
  112. set(STM32_CMSIS_${FAMILY}_PATH ${STM32_CUBE_${FAMILY}_PATH}/Drivers/CMSIS/Device/ST/STM32${FAMILY}xx PARENT_SCOPE)
  113. else()
  114. set(CMSIS_NAME STM32-CMSIS-${FAMILY})
  115. string(TOLOWER ${CMSIS_NAME} CMSIS_NAME_L)
  116. if(STM32_CMSIS_${FAMILY}_PATH)
  117. message(INFO "STM32_CMSIS_${FAMILY}_PATH specified, skipping fetch for ${CMSIS_NAME}")
  118. continue()
  119. endif()
  120. FetchContent_MakeAvailable(${CMSIS_NAME})
  121. set(STM32_CMSIS_${FAMILY}_PATH ${${CMSIS_NAME_L}_SOURCE_DIR} PARENT_SCOPE)
  122. endif()
  123. endforeach()
  124. endfunction()
  125. function(stm32_fetch_hal)
  126. foreach(FAMILY ${ARGV})
  127. if(STM32_USE_HAL_FROM_CUBE_${FAMILY})
  128. stm32_fetch_cube(${FAMILY})
  129. message(STATUS "Cube fetched for ${FAMILY} at ${STM32_CUBE_${FAMILY}_PATH}")
  130. set(STM32_HAL_${FAMILY}_PATH ${STM32_CUBE_${FAMILY}_PATH}/Drivers/STM32${FAMILY}xx_HAL_Driver PARENT_SCOPE)
  131. else()
  132. set(HAL_NAME STM32-HAL-${FAMILY})
  133. string(TOLOWER ${HAL_NAME} HAL_NAME_L)
  134. if(STM32_HAL_${FAMILY}_PATH)
  135. message(INFO "STM32_HAL_${FAMILY}_PATH specified, skipping fetch for ${HAL_NAME}")
  136. continue()
  137. endif()
  138. FetchContent_MakeAvailable(${HAL_NAME})
  139. set(STM32_HAL_${FAMILY}_PATH ${${HAL_NAME_L}_SOURCE_DIR} PARENT_SCOPE)
  140. endif()
  141. endforeach()
  142. endfunction()