FindCMSIS.cmake 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. if(NOT CMSIS_FIND_COMPONENTS)
  2. set(CMSIS_FIND_COMPONENTS STM32F0 STM32F4)
  3. endif()
  4. include(stm32/devices)
  5. function(cmsis_generate_default_linker_script FAMILY DEVICE)
  6. stm32_get_memory_info(${FAMILY} ${DEVICE}
  7. FLASH_SIZE RAM_SIZE CCRAM_SIZE STACK_SIZE HEAP_SIZE
  8. FLASH_ORIGIN RAM_ORIGIN CCRAM_ORIGIN
  9. )
  10. add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${DEVICE}.ld"
  11. COMMAND ${CMAKE_COMMAND}
  12. -DFLASH_ORIGIN="${FLASH_ORIGIN}"
  13. -DRAM_ORIGIN="${RAM_ORIGIN}"
  14. -DCCRAM_ORIGIN="${CCRAM_ORIGIN}"
  15. -DFLASH_SIZE="${FLASH_SIZE}"
  16. -DRAM_SIZE="${RAM_SIZE}"
  17. -DCCRAM_SIZE="${CCRAM_SIZE}"
  18. -DSTACK_SIZE="${STACK_SIZE}"
  19. -DHEAP_SIZE="${HEAP_SIZE}"
  20. -DLINKER_SCRIPT="${CMAKE_CURRENT_BINARY_DIR}/${DEVICE}.ld"
  21. -P "${STM32_CMAKE_DIR}/stm32/linker_ld.cmake"
  22. )
  23. add_custom_target(CMSIS_LD_${DEVICE} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${DEVICE}.ld)
  24. add_dependencies(CMSIS::STM32::${DEVICE} CMSIS_LD_${DEVICE})
  25. stm32_add_linker_script(CMSIS::STM32::${DEVICE} INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/${DEVICE}.ld")
  26. endfunction()
  27. foreach(COMP ${CMSIS_FIND_COMPONENTS})
  28. string(TOLOWER ${COMP} COMP_L)
  29. string(TOUPPER ${COMP} COMP)
  30. string(REGEX MATCH "^STM32([A-Z][0-9])([0-9][0-9][A-Z][0-9A-Z])?.*$" COMP ${COMP})
  31. if((NOT CMAKE_MATCH_1) AND (NOT CMAKE_MATCH_2))
  32. message(FATAL_ERROR "Unknown CMSIS component: ${COMP}")
  33. endif()
  34. if(CMAKE_MATCH_2)
  35. set(FAMILY ${CMAKE_MATCH_1})
  36. set(DEVICES "${CMAKE_MATCH_1}${CMAKE_MATCH_2}")
  37. else()
  38. set(FAMILY ${CMAKE_MATCH_1})
  39. stm32_get_devices_by_family(${FAMILY} DEVICES)
  40. endif()
  41. string(TOLOWER ${FAMILY} FAMILY_L)
  42. if(NOT STM32_CUBE_${FAMILY}_PATH)
  43. set(STM32_CUBE_${FAMILY}_PATH /opt/STM32Cube_FW_${FAMILY} CACHE PATH "Path to STM32Cube_FW_${FAMILY}")
  44. message(STATUS "No STM32_CUBE_${FAMILY}_PATH specified using default: ${STM32_CUBE_${FAMILY}_PATH}")
  45. endif()
  46. find_path(CMSIS_${FAMILY}_PATH
  47. NAMES ARM.CMSIS.pdsc
  48. PATHS "${STM32_CUBE_${FAMILY}_PATH}/Drivers/CMSIS"
  49. NO_DEFAULT_PATH
  50. )
  51. if (NOT CMSIS_${FAMILY}_PATH)
  52. continue()
  53. endif()
  54. if(NOT CMSIS_${FAMILY}_VERSION)
  55. file(STRINGS "${CMSIS_${FAMILY}_PATH}/ARM.CMSIS.pdsc" VERSION_STRINGS REGEX "<release version=\"([0-9]*\\.[0-9]*\\.[0-9]*)\" date=\"[0-9]+\\-[0-9]+\\-[0-9]+\">")
  56. list(GET VERSION_STRINGS 0 STR)
  57. string(REGEX MATCH "<release version=\"([0-9]*)\\.([0-9]*)\\.([0-9]*)\" date=\"[0-9]+\\-[0-9]+\\-[0-9]+\">" MATCHED ${STR})
  58. set(CMSIS_${FAMILY}_VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}" CACHE INTERNAL "CMSIS STM32${FAMILY} version")
  59. endif()
  60. set(CMSIS_${COMP}_VERSION ${CMSIS_${FAMILY}_VERSION})
  61. set(CMSIS_VERSION ${CMSIS_${COMP}_VERSION})
  62. find_path(CMSIS_${FAMILY}_COMMON_INCLUDE
  63. NAMES cmsis_version.h
  64. PATHS "${CMSIS_${FAMILY}_PATH}/Include"
  65. NO_DEFAULT_PATH
  66. )
  67. list(APPEND CMSIS_INCLUDE_DIRS "${CMSIS_${FAMILY}_COMMON_INCLUDE}")
  68. find_path(CMSIS_${FAMILY}_INCLUDE
  69. NAMES stm32${FAMILY_L}xx.h
  70. PATHS "${CMSIS_${FAMILY}_PATH}/Device/ST/STM32${FAMILY}xx/Include"
  71. NO_DEFAULT_PATH
  72. )
  73. list(APPEND CMSIS_INCLUDE_DIRS "${CMSIS_${FAMILY}_INCLUDE}")
  74. find_file(CMSIS_${FAMILY}_SOURCE
  75. NAMES system_stm32${FAMILY_L}xx.c
  76. PATHS "${CMSIS_${FAMILY}_PATH}/Device/ST/STM32${FAMILY}xx/Source/Templates"
  77. NO_DEFAULT_PATH
  78. )
  79. list(APPEND CMSIS_SOURCES "${CMSIS_${FAMILY}_SOURCE}")
  80. if ((NOT CMSIS_${FAMILY}_COMMON_INCLUDE) OR
  81. (NOT CMSIS_${FAMILY}_INCLUDE) OR
  82. (NOT CMSIS_${FAMILY}_SOURCE))
  83. continue()
  84. endif()
  85. if(NOT (TARGET CMSIS::STM32::${FAMILY}))
  86. add_library(CMSIS::STM32::${FAMILY} INTERFACE IMPORTED)
  87. target_link_libraries(CMSIS::STM32::${FAMILY} INTERFACE STM32::${FAMILY})
  88. target_include_directories(CMSIS::STM32::${FAMILY} INTERFACE "${CMSIS_${FAMILY}_COMMON_INCLUDE}")
  89. target_include_directories(CMSIS::STM32::${FAMILY} INTERFACE "${CMSIS_${FAMILY}_INCLUDE}")
  90. target_sources(CMSIS::STM32::${FAMILY} INTERFACE "${CMSIS_${FAMILY}_SOURCE}")
  91. endif()
  92. set(DEVICES_FOUND TRUE)
  93. foreach(DEVICE ${DEVICES})
  94. stm32_get_chip_type(${FAMILY} ${DEVICE} TYPE)
  95. string(TOLOWER ${DEVICE} DEVICE_L)
  96. string(TOLOWER ${TYPE} TYPE_L)
  97. find_file(CMSIS_${FAMILY}_${TYPE}_STARTUP
  98. NAMES startup_stm32f${TYPE_L}.s
  99. PATHS "${CMSIS_${FAMILY}_PATH}/Device/ST/STM32${FAMILY}xx/Source/Templates/gcc"
  100. NO_DEFAULT_PATH
  101. )
  102. list(APPEND CMSIS_SOURCES "${CMSIS_${FAMILY}_${TYPE}_STARTUP}")
  103. if(NOT CMSIS_${FAMILY}_${TYPE}_STARTUP)
  104. set(DEVICES_FOUND FALSE)
  105. break()
  106. endif()
  107. if(NOT (TARGET CMSIS::STM32::${FAMILY}::${TYPE}))
  108. add_library(CMSIS::STM32::${FAMILY}::${TYPE} INTERFACE IMPORTED)
  109. target_link_libraries(CMSIS::STM32::${FAMILY}::${TYPE} INTERFACE CMSIS::STM32::${FAMILY} STM32::${FAMILY}::${TYPE})
  110. target_sources(CMSIS::STM32::${FAMILY}::${TYPE} INTERFACE "${CMSIS_${FAMILY}_${TYPE}_STARTUP}")
  111. endif()
  112. add_library(CMSIS::STM32::${DEVICE} INTERFACE IMPORTED)
  113. target_link_libraries(CMSIS::STM32::${DEVICE} INTERFACE CMSIS::STM32::${FAMILY}::${TYPE})
  114. cmsis_generate_default_linker_script(${FAMILY} ${DEVICE})
  115. endforeach()
  116. if(CMSIS_${FAMILY}_COMMON_INCLUDE AND
  117. CMSIS_${FAMILY}_INCLUDE AND
  118. CMSIS_${FAMILY}_SOURCE AND
  119. DEVICES_FOUND)
  120. set(CMSIS_${COMP}_FOUND TRUE)
  121. else()
  122. set(CMSIS_${COMP}_FOUND FALSE)
  123. endif()
  124. endforeach()
  125. include(FindPackageHandleStandardArgs)
  126. find_package_handle_standard_args(CMSIS
  127. REQUIRED_VARS CMSIS_INCLUDE_DIRS CMSIS_SOURCES
  128. FOUND_VAR CMSIS_FOUND
  129. VERSION_VAR CMSIS_VERSION
  130. HANDLE_COMPONENTS
  131. )