FindCMSIS.cmake 5.9 KB

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