FindCMSIS.cmake 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. target_link_options(CMSIS::STM32::${DEVICE} INTERFACE -T "${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. set(CMSIS_PATH "${STM32_CUBE_${FAMILY}_PATH}/Drivers/CMSIS")
  49. find_path(CMSIS_${FAMILY}_COMMON_INCLUDE
  50. NAMES cmsis_version.h
  51. PATHS "${CMSIS_PATH}/Include"
  52. NO_DEFAULT_PATH
  53. )
  54. list(APPEND CMSIS_INCLUDE_DIRS "${CMSIS_${FAMILY}_COMMON_INCLUDE}")
  55. find_path(CMSIS_${FAMILY}_INCLUDE
  56. NAMES stm32${FAMILY_L}xx.h
  57. PATHS "${CMSIS_PATH}/Device/ST/STM32${FAMILY}xx/Include"
  58. NO_DEFAULT_PATH
  59. )
  60. list(APPEND CMSIS_INCLUDE_DIRS "${CMSIS_${FAMILY}_INCLUDE}")
  61. find_file(CMSIS_${FAMILY}_SOURCE
  62. NAMES system_stm32${FAMILY_L}xx.c
  63. PATHS "${CMSIS_PATH}/Device/ST/STM32${FAMILY}xx/Source/Templates"
  64. NO_DEFAULT_PATH
  65. )
  66. list(APPEND CMSIS_SOURCES "${CMSIS_${FAMILY}_SOURCE}")
  67. if ((NOT CMSIS_${FAMILY}_COMMON_INCLUDE) OR
  68. (NOT CMSIS_${FAMILY}_INCLUDE) OR
  69. (NOT CMSIS_${FAMILY}_SOURCE))
  70. continue()
  71. endif()
  72. if(NOT (TARGET CMSIS::STM32::${FAMILY}))
  73. add_library(CMSIS::STM32::${FAMILY} INTERFACE IMPORTED)
  74. target_link_libraries(CMSIS::STM32::${FAMILY} INTERFACE STM32::${FAMILY})
  75. target_include_directories(CMSIS::STM32::${FAMILY} INTERFACE "${CMSIS_${FAMILY}_COMMON_INCLUDE}")
  76. target_include_directories(CMSIS::STM32::${FAMILY} INTERFACE "${CMSIS_${FAMILY}_INCLUDE}")
  77. target_sources(CMSIS::STM32::${FAMILY} INTERFACE "${CMSIS_${FAMILY}_SOURCE}")
  78. endif()
  79. set(DEVICES_FOUND TRUE)
  80. foreach(DEVICE ${DEVICES})
  81. stm32_get_chip_type(${FAMILY} ${DEVICE} TYPE)
  82. string(TOLOWER ${DEVICE} DEVICE_L)
  83. string(TOLOWER ${TYPE} TYPE_L)
  84. find_file(CMSIS_${FAMILY}_${TYPE}_STARTUP
  85. NAMES startup_stm32f${TYPE_L}.s
  86. PATHS "${CMSIS_PATH}/Device/ST/STM32${FAMILY}xx/Source/Templates/gcc"
  87. NO_DEFAULT_PATH
  88. )
  89. list(APPEND CMSIS_SOURCES "${CMSIS_${FAMILY}_${TYPE}_STARTUP}")
  90. if(NOT CMSIS_${FAMILY}_${TYPE}_STARTUP)
  91. set(DEVICES_FOUND FALSE)
  92. break()
  93. endif()
  94. if(NOT (TARGET CMSIS::STM32::${FAMILY}::${TYPE}))
  95. add_library(CMSIS::STM32::${FAMILY}::${TYPE} INTERFACE IMPORTED)
  96. target_link_libraries(CMSIS::STM32::${FAMILY}::${TYPE} INTERFACE CMSIS::STM32::${FAMILY} STM32::${FAMILY}::${TYPE})
  97. target_sources(CMSIS::STM32::${FAMILY}::${TYPE} INTERFACE "${CMSIS_${FAMILY}_${TYPE}_STARTUP}")
  98. endif()
  99. add_library(CMSIS::STM32::${DEVICE} INTERFACE IMPORTED)
  100. target_link_libraries(CMSIS::STM32::${DEVICE} INTERFACE CMSIS::STM32::${FAMILY}::${TYPE})
  101. cmsis_generate_default_linker_script(${FAMILY} ${DEVICE})
  102. endforeach()
  103. if(CMSIS_${FAMILY}_COMMON_INCLUDE AND
  104. CMSIS_${FAMILY}_INCLUDE AND
  105. CMSIS_${FAMILY}_SOURCE AND
  106. DEVICES_FOUND)
  107. set(CMSIS_${COMP}_FOUND TRUE)
  108. else()
  109. set(CMSIS_${COMP}_FOUND FALSE)
  110. endif()
  111. endforeach()
  112. include(FindPackageHandleStandardArgs)
  113. find_package_handle_standard_args(CMSIS
  114. REQUIRED_VARS CMSIS_INCLUDE_DIRS CMSIS_SOURCES
  115. FOUND_VAR CMSIS_FOUND
  116. HANDLE_COMPONENTS
  117. )