FindCMSIS.cmake 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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. set(DEVICES_FOUND TRUE)
  68. foreach(DEVICE ${DEVICES})
  69. stm32_get_chip_type(${FAMILY} ${DEVICE} TYPE)
  70. string(TOLOWER ${DEVICE} DEVICE_L)
  71. string(TOLOWER ${TYPE} TYPE_L)
  72. find_file(CMSIS_${FAMILY}_${TYPE}_STARTUP
  73. NAMES startup_stm32f${TYPE_L}.s
  74. PATHS "${CMSIS_PATH}/Device/ST/STM32${FAMILY}xx/Source/Templates/gcc"
  75. NO_DEFAULT_PATH
  76. )
  77. list(APPEND CMSIS_SOURCES "${CMSIS_${FAMILY}_${TYPE}_STARTUP}")
  78. if(NOT CMSIS_${FAMILY}_${TYPE}_STARTUP)
  79. set(DEVICES_FOUND FALSE)
  80. break()
  81. endif()
  82. add_library(CMSIS::STM32::${DEVICE} INTERFACE IMPORTED)
  83. target_link_libraries(CMSIS::STM32::${DEVICE} INTERFACE STM32::${FAMILY}::${TYPE})
  84. target_include_directories(CMSIS::STM32::${DEVICE} INTERFACE "${CMSIS_${FAMILY}_COMMON_INCLUDE}")
  85. target_include_directories(CMSIS::STM32::${DEVICE} INTERFACE "${CMSIS_${FAMILY}_INCLUDE}")
  86. target_sources(CMSIS::STM32::${DEVICE} INTERFACE "${CMSIS_${FAMILY}_SOURCE}")
  87. target_sources(CMSIS::STM32::${DEVICE} INTERFACE "${CMSIS_${FAMILY}_${TYPE}_STARTUP}")
  88. cmsis_generate_default_linker_script(${FAMILY} ${DEVICE})
  89. endforeach()
  90. if(CMSIS_${FAMILY}_COMMON_INCLUDE AND
  91. CMSIS_${FAMILY}_INCLUDE AND
  92. CMSIS_${FAMILY}_SOURCE AND
  93. DEVICES_FOUND)
  94. set(CMSIS_${COMP}_FOUND TRUE)
  95. else()
  96. set(CMSIS_${COMP}_FOUND FALSE)
  97. endif()
  98. endforeach()
  99. include(FindPackageHandleStandardArgs)
  100. find_package_handle_standard_args(CMSIS
  101. REQUIRED_VARS CMSIS_INCLUDE_DIRS CMSIS_SOURCES
  102. FOUND_VAR CMSIS_FOUND
  103. HANDLE_COMPONENTS
  104. )