FindCMSIS.cmake 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. STRING(TOLOWER ${STM32_FAMILY} STM32_FAMILY_LOWER)
  2. IF(STM32_FAMILY STREQUAL "F1")
  3. SET(CMSIS_STARTUP_PREFIX "startup_stm32f10x_")
  4. SET(CMSIS_HEADERS system_stm32f10x.h core_cm3.h stm32f10x.h)
  5. SET(CMSIS_LINKER_SCRIPT_NAME stm32f1_flash.ld.in)
  6. ENDIF()
  7. IF((NOT STM32_CHIP_TYPE) AND (NOT STM32_CHIP))
  8. UNSET(CMSIS_STARTUP_NAME)
  9. UNSET(CMSIS_STARTUP_SOURCE)
  10. FOREACH(CHIP_TYPE ${STM32_CHIP_TYPES})
  11. STRING(TOLOWER ${CHIP_TYPE} CHIP_TYPE_LOWER)
  12. LIST(APPEND CMSIS_FIND_LIBS cmsis_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER})
  13. ENDFOREACH()
  14. ELSE()
  15. IF(NOT STM32_CHIP_TYPE)
  16. STM32_GET_CHIP_TYPE(${STM32_CHIP} STM32_CHIP_TYPE)
  17. IF(NOT STM32_CHIP_TYPE)
  18. MESSAGE(FATAL_ERROR "Unknown chip: ${STM32_CHIP}. Try to use STM32_CHIP_TYPE directly.")
  19. ENDIF()
  20. MESSAGE(STATUS "${STM32_CHIP} is ${STM32_CHIP_TYPE} device")
  21. ENDIF()
  22. STRING(TOLOWER ${STM32_CHIP_TYPE} STM32_CHIP_TYPE_LOWER)
  23. SET(CMSIS_FIND_LIBS cmsis_${STM32_FAMILY_LOWER}_${STM32_CHIP_TYPE_LOWER})
  24. SET(CMSIS_STARTUP_NAME ${CMSIS_STARTUP_PREFIX}${STM32_CHIP_TYPE_LOWER}.s)
  25. ENDIF()
  26. FIND_PATH(CMSIS_INCLUDE_DIR ${CMSIS_HEADERS}
  27. PATH_SUFFIXES include stm32${STM32_FAMILY_LOWER}
  28. )
  29. FOREACH(CMSIS_LIB_NAME ${CMSIS_FIND_LIBS})
  30. SET(CMSIS_LIBRARY CMSIS_LIBRARY-NOTFOUND)
  31. FIND_LIBRARY(CMSIS_LIBRARY
  32. NAMES ${CMSIS_LIB_NAME}
  33. PATH_SUFFIXES lib
  34. )
  35. LIST(APPEND CMSIS_LIBRARIES ${CMSIS_LIBRARY})
  36. ENDFOREACH()
  37. FIND_FILE(CMSIS_LINKER_SCRIPT ${CMSIS_LINKER_SCRIPT_NAME} PATHS ${CMAKE_FIND_ROOT_PATH}/share/cmsis/)
  38. INCLUDE(FindPackageHandleStandardArgs)
  39. IF(NOT STM32_CHIP_TYPE)
  40. FIND_PACKAGE_HANDLE_STANDARD_ARGS(CMSIS DEFAULT_MSG CMSIS_LIBRARIES CMSIS_INCLUDE_DIR CMSIS_LINKER_SCRIPT)
  41. ELSE()
  42. FIND_FILE(CMSIS_STARTUP_SOURCE
  43. ${CMSIS_STARTUP_NAME}
  44. PATHS ${CMAKE_FIND_ROOT_PATH}/share/cmsis/
  45. )
  46. FIND_PACKAGE_HANDLE_STANDARD_ARGS(CMSIS DEFAULT_MSG CMSIS_LIBRARIES CMSIS_INCLUDE_DIR CMSIS_STARTUP_SOURCE CMSIS_LINKER_SCRIPT)
  47. ENDIF()
  48. MACRO(STM32_KB_TO_BYTES KB BYTES)
  49. STRING(REGEX REPLACE "^(.+)[kK]$" "\\1" KILOBYTES ${KB})
  50. IF(KILOBYTES)
  51. MATH(EXPR ${BYTES} "${KILOBYTES} * 1024")
  52. ELSE()
  53. SET(${BYTES} ${KB})
  54. ENDIF()
  55. ENDMACRO()
  56. FUNCTION(STM32_SET_FLASH_PARAMS TARGET STM32_FLASH_SIZE STM32_RAM_SIZE STM32_STACK_ADDRESS STM32_MIN_STACK_SIZE STM32_MIN_HEAP_SIZE STM32_EXT_RAM_SIZE STM32_FLASH_ORIGIN STM32_RAM_ORIGIN STM32_EXT_RAM_ORIGIN)
  57. CONFIGURE_FILE(${CMSIS_LINKER_SCRIPT} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld)
  58. SET_TARGET_PROPERTIES(${TARGET} PROPERTIES LINK_FLAGS "-T${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld ${CMAKE_EXE_LINKER_FLAGS}")
  59. ENDFUNCTION()
  60. FUNCTION(STM32_SET_FLASH_PARAMS TARGET FLASH_SIZE RAM_SIZE)
  61. STM32_KB_TO_BYTES(${FLASH_SIZE} FLASH_SIZE)
  62. STM32_KB_TO_BYTES(${RAM_SIZE} RAM_SIZE)
  63. IF(NOT STM32_FLASH_ORIGIN)
  64. SET(STM32_FLASH_ORIGIN "0x08000000")
  65. ENDIF()
  66. IF(NOT STM32_RAM_ORIGIN)
  67. SET(STM32_RAM_ORIGIN "536870912")
  68. ENDIF()
  69. IF(NOT STM32_EXT_RAM_ORIGIN)
  70. SET(STM32_EXT_RAM_ORIGIN "0x60000000")
  71. ENDIF()
  72. IF(NOT STM32_STACK_ADDRESS)
  73. MATH(EXPR STM32_STACK_ADDRESS "${STM32_RAM_ORIGIN} + ${RAM_SIZE}")
  74. ENDIF()
  75. SET(STM32_FLASH_SIZE ${FLASH_SIZE})
  76. SET(STM32_RAM_SIZE ${RAM_SIZE})
  77. IF(NOT STM32_MIN_STACK_SIZE)
  78. SET(STM32_MIN_STACK_SIZE "0x200")
  79. ENDIF()
  80. IF(NOT STM32_MIN_HEAP_SIZE)
  81. SET(STM32_MIN_HEAP_SIZE "0")
  82. ENDIF()
  83. IF(NOT STM32_EXT_RAM_SIZE)
  84. SET(STM32_EXT_RAM_SIZE "0K")
  85. ENDIF()
  86. CONFIGURE_FILE(${CMSIS_LINKER_SCRIPT} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld)
  87. SET_TARGET_PROPERTIES(${TARGET} PROPERTIES LINK_FLAGS "-T${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld ${CMAKE_EXE_LINKER_FLAGS}")
  88. ENDFUNCTION()
  89. FUNCTION(STM32_SET_TARGET_PROPERTIES TARGET)
  90. IF((NOT STM32_CHIP_TYPE) AND (NOT STM32_CHIP))
  91. MESSAGE(WARNING "Neither STM32_CHIP_TYPE nor STM32_CHIP selected, you'll have to use STM32_SET_CHIP_DEFINITIONS directly")
  92. ELSE()
  93. STM32_SET_CHIP_DEFINITIONS(${TARGET} ${STM32_CHIP_TYPE})
  94. IF(((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE)) AND (NOT STM32_CHIP))
  95. MESSAGE(FATAL_ERROR "Cannot get chip parameters. Please specify either STM32_CHIP or STM32_FLASH_SIZE/STM32_RAM_SIZE")
  96. ENDIF()
  97. IF((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE))
  98. STM32_GET_CHIP_PARAMETERS(${STM32_CHIP} STM32_FLASH_SIZE STM32_RAM_SIZE)
  99. IF((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE))
  100. MESSAGE(FATAL_ERROR "Unknown chip: ${STM32_CHIP}. Try to use STM32_FLASH_SIZE/STM32_RAM_SIZE directly.")
  101. ENDIF()
  102. MESSAGE(STATUS "${STM32_CHIP} has ${STM32_FLASH_SIZE}iB of flash memory and ${STM32_RAM_SIZE}iB of RAM")
  103. ENDIF()
  104. ENDIF()
  105. STM32_SET_FLASH_PARAMS(${TARGET} ${STM32_FLASH_SIZE} ${STM32_RAM_SIZE})
  106. ENDFUNCTION()