utilities.cmake 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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. -mthumb -Wall -ffunction-sections -fdata-sections
  20. )
  21. # Set linker flags
  22. # -mthumb: Generate thumb code
  23. # -Wl,--gc-sections: Remove unused code
  24. target_link_options(STM32::${FAMILY}${CORE_C} INTERFACE
  25. -mthumb -Wl,--gc-sections
  26. )
  27. target_compile_definitions(STM32::${FAMILY}${CORE_C} INTERFACE
  28. STM32${FAMILY}
  29. )
  30. endif()
  31. foreach(TYPE ${STM32_${FAMILY}_TYPES})
  32. if(NOT (TARGET STM32::${TYPE}${CORE_C}))
  33. add_library(STM32::${TYPE}${CORE_C} INTERFACE IMPORTED)
  34. target_link_libraries(STM32::${TYPE}${CORE_C} INTERFACE STM32::${FAMILY}${CORE_C})
  35. target_compile_definitions(STM32::${TYPE}${CORE_C} INTERFACE
  36. STM32${TYPE}
  37. )
  38. endif()
  39. endforeach()
  40. endfunction()
  41. include(FetchContent)
  42. # A CMSIS or HAL driver can specify 'cube' as version number to indicate that the driver is taken from the Cube repository
  43. set(STM32_FETCH_FAMILIES F0 F1 F2 F3 F4 F7 G0 G4 H7 L0 L1 L4 L5 MP1 U5 WB WL )
  44. 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.3.0 v1.12.0 v1.1.0)
  45. 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 cube v1.9.0 v1.1.0)
  46. 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 cube v1.9.0 v1.1.0)
  47. FetchContent_Declare(
  48. STM32-CMSIS
  49. GIT_REPOSITORY https://github.com/STMicroelectronics/cmsis_core/
  50. GIT_TAG v5.6.0
  51. GIT_PROGRESS TRUE
  52. )
  53. set(IDX 0)
  54. foreach(FAMILY ${STM32_FETCH_FAMILIES})
  55. string(TOLOWER ${FAMILY} FAMILY_L)
  56. list(GET STM32_FETCH_CUBE_VERSIONS ${IDX} CUBE_VERSION)
  57. list(GET STM32_FETCH_CMSIS_VERSIONS ${IDX} CMSIS_VERSION)
  58. list(GET STM32_FETCH_HAL_VERSIONS ${IDX} HAL_VERSION)
  59. FetchContent_Declare(
  60. STM32Cube${FAMILY}
  61. GIT_REPOSITORY https://github.com/STMicroelectronics/STM32Cube${FAMILY}/
  62. GIT_TAG ${CUBE_VERSION}
  63. GIT_PROGRESS TRUE
  64. )
  65. if(CMSIS_VERSION STREQUAL cube)
  66. set(STM32_USE_CMSIS_FROM_CUBE_${FAMILY} ON)
  67. else()
  68. FetchContent_Declare(
  69. STM32-CMSIS-${FAMILY}
  70. GIT_REPOSITORY https://github.com/STMicroelectronics/cmsis_device_${FAMILY_L}/
  71. GIT_TAG ${CMSIS_VERSION}
  72. GIT_PROGRESS TRUE
  73. )
  74. endif()
  75. if(HAL_VERSION STREQUAL cube)
  76. set(STM32_USE_HAL_FROM_CUBE_${FAMILY} ON)
  77. else()
  78. FetchContent_Declare(
  79. STM32-HAL-${FAMILY}
  80. GIT_REPOSITORY https://github.com/STMicroelectronics/stm32${FAMILY_L}xx_hal_driver/
  81. GIT_TAG ${HAL_VERSION}
  82. GIT_PROGRESS TRUE
  83. )
  84. endif()
  85. math(EXPR IDX "${IDX} + 1")
  86. endforeach()
  87. function(stm32_fetch_cube)
  88. foreach(FAMILY ${ARGV})
  89. set(CUBE_NAME STM32Cube${FAMILY})
  90. string(TOLOWER ${CUBE_NAME} CUBE_NAME_L)
  91. if(STM32_CUBE_${FAMILY}_PATH)
  92. message(VERBOSE "STM32_CUBE_${FAMILY}_PATH specified, skipping fetch for ${CUBE_NAME}")
  93. continue()
  94. endif()
  95. FetchContent_MakeAvailable(${CUBE_NAME})
  96. set(STM32_CUBE_${FAMILY}_PATH ${${CUBE_NAME_L}_SOURCE_DIR} PARENT_SCOPE)
  97. endforeach()
  98. endfunction()
  99. function(stm32_fetch_cmsis)
  100. if(NOT STM32_CMSIS_PATH)
  101. FetchContent_MakeAvailable(STM32-CMSIS)
  102. set(STM32_CMSIS_PATH ${stm32-cmsis_SOURCE_DIR} PARENT_SCOPE)
  103. else()
  104. message(INFO "STM32_CMSIS_PATH specified, skipping fetch for STM32-CMSIS")
  105. endif()
  106. foreach(FAMILY ${ARGV})
  107. if(STM32_USE_CMSIS_FROM_CUBE_${FAMILY})
  108. stm32_fetch_cube(${FAMILY})
  109. message(STATUS "Cube fetched for ${FAMILY} at ${STM32_CUBE_${FAMILY}_PATH}")
  110. set(STM32_CMSIS_${FAMILY}_PATH ${STM32_CUBE_${FAMILY}_PATH}/Drivers/CMSIS/Device/ST/STM32${FAMILY}xx PARENT_SCOPE)
  111. else()
  112. set(CMSIS_NAME STM32-CMSIS-${FAMILY})
  113. string(TOLOWER ${CMSIS_NAME} CMSIS_NAME_L)
  114. if(STM32_CMSIS_${FAMILY}_PATH)
  115. message(INFO "STM32_CMSIS_${FAMILY}_PATH specified, skipping fetch for ${CMSIS_NAME}")
  116. continue()
  117. endif()
  118. FetchContent_MakeAvailable(${CMSIS_NAME})
  119. set(STM32_CMSIS_${FAMILY}_PATH ${${CMSIS_NAME_L}_SOURCE_DIR} PARENT_SCOPE)
  120. endif()
  121. endforeach()
  122. endfunction()
  123. function(stm32_fetch_hal)
  124. foreach(FAMILY ${ARGV})
  125. if(STM32_USE_HAL_FROM_CUBE_${FAMILY})
  126. stm32_fetch_cube(${FAMILY})
  127. message(STATUS "Cube fetched for ${FAMILY} at ${STM32_CUBE_${FAMILY}_PATH}")
  128. set(STM32_HAL_${FAMILY}_PATH ${STM32_CUBE_${FAMILY}_PATH}/Drivers/STM32${FAMILY}xx_HAL_Driver PARENT_SCOPE)
  129. else()
  130. set(HAL_NAME STM32-HAL-${FAMILY})
  131. string(TOLOWER ${HAL_NAME} HAL_NAME_L)
  132. if(STM32_HAL_${FAMILY}_PATH)
  133. message(INFO "STM32_HAL_${FAMILY}_PATH specified, skipping fetch for ${HAL_NAME}")
  134. continue()
  135. endif()
  136. FetchContent_MakeAvailable(${HAL_NAME})
  137. set(STM32_HAL_${FAMILY}_PATH ${${HAL_NAME_L}_SOURCE_DIR} PARENT_SCOPE)
  138. endif()
  139. endforeach()
  140. endfunction()