| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- if(NOT CMSIS_FIND_COMPONENTS)
- set(CMSIS_FIND_COMPONENTS
- STM32F0 STM32G0 STM32L0 STM32F1 STM32L1 STM32F2 STM32F3 STM32F4 STM32G4
- STM32L4 STM32F7 STM32H7
- )
- endif()
- include(stm32/devices)
-
- function(cmsis_generate_default_linker_script FAMILY DEVICE)
- stm32_get_memory_info(${FAMILY} ${DEVICE}
- FLASH_SIZE RAM_SIZE CCRAM_SIZE STACK_SIZE HEAP_SIZE
- FLASH_ORIGIN RAM_ORIGIN CCRAM_ORIGIN
- )
- add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${DEVICE}.ld"
- COMMAND ${CMAKE_COMMAND}
- -DFLASH_ORIGIN="${FLASH_ORIGIN}"
- -DRAM_ORIGIN="${RAM_ORIGIN}"
- -DCCRAM_ORIGIN="${CCRAM_ORIGIN}"
- -DFLASH_SIZE="${FLASH_SIZE}"
- -DRAM_SIZE="${RAM_SIZE}"
- -DCCRAM_SIZE="${CCRAM_SIZE}"
- -DSTACK_SIZE="${STACK_SIZE}"
- -DHEAP_SIZE="${HEAP_SIZE}"
- -DLINKER_SCRIPT="${CMAKE_CURRENT_BINARY_DIR}/${DEVICE}.ld"
- -P "${STM32_CMAKE_DIR}/stm32/linker_ld.cmake"
- )
- add_custom_target(CMSIS_LD_${DEVICE} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${DEVICE}.ld)
- add_dependencies(CMSIS::STM32::${DEVICE} CMSIS_LD_${DEVICE})
- stm32_add_linker_script(CMSIS::STM32::${DEVICE} INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/${DEVICE}.ld")
- endfunction()
- foreach(COMP ${CMSIS_FIND_COMPONENTS})
- string(TOLOWER ${COMP} COMP_L)
- string(TOUPPER ${COMP} COMP)
-
- string(REGEX MATCH "^STM32([A-Z][0-9])([0-9A-Z][0-9][A-Z][0-9A-Z])?.*$" COMP ${COMP})
-
- if((NOT CMAKE_MATCH_1) AND (NOT CMAKE_MATCH_2))
- message(FATAL_ERROR "Unknown CMSIS component: ${COMP}")
- endif()
-
- if(CMAKE_MATCH_2)
- set(FAMILY ${CMAKE_MATCH_1})
- set(DEVICES "${CMAKE_MATCH_1}${CMAKE_MATCH_2}")
- else()
- set(FAMILY ${CMAKE_MATCH_1})
- stm32_get_devices_by_family(${FAMILY} DEVICES)
- endif()
- string(TOLOWER ${FAMILY} FAMILY_L)
-
- if(NOT STM32_CUBE_${FAMILY}_PATH)
- set(STM32_CUBE_${FAMILY}_PATH /opt/STM32Cube${FAMILY} CACHE PATH "Path to STM32Cube${FAMILY}")
- message(STATUS "No STM32_CUBE_${FAMILY}_PATH specified using default: ${STM32_CUBE_${FAMILY}_PATH}")
- endif()
-
- find_path(CMSIS_${FAMILY}_PATH
- NAMES Include/cmsis_gcc.h
- PATHS "${STM32_CUBE_${FAMILY}_PATH}/Drivers/CMSIS"
- NO_DEFAULT_PATH
- )
- if (NOT CMSIS_${FAMILY}_PATH)
- continue()
- endif()
-
- if(NOT CMSIS_${FAMILY}_VERSION)
- find_file(CMSIS_${FAMILY}_PDSC
- NAMES ARM.CMSIS.pdsc
- PATHS "${CMSIS_${FAMILY}_PATH}"
- NO_DEFAULT_PATH
- )
- if (NOT CMSIS_${FAMILY}_PDSC)
- set(CMSIS_${FAMILY}_VERSION "0.0.0")
- else()
- file(STRINGS "${CMSIS_${FAMILY}_PDSC}" VERSION_STRINGS REGEX "<release version=\"([0-9]*\\.[0-9]*\\.[0-9]*)\" date=\"[0-9]+\\-[0-9]+\\-[0-9]+\">")
- list(GET VERSION_STRINGS 0 STR)
- string(REGEX MATCH "<release version=\"([0-9]*)\\.([0-9]*)\\.([0-9]*)\" date=\"[0-9]+\\-[0-9]+\\-[0-9]+\">" MATCHED ${STR})
- set(CMSIS_${FAMILY}_VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}" CACHE INTERNAL "CMSIS STM32${FAMILY} version")
- endif()
- endif()
-
- set(CMSIS_${COMP}_VERSION ${CMSIS_${FAMILY}_VERSION})
- set(CMSIS_VERSION ${CMSIS_${COMP}_VERSION})
-
- find_path(CMSIS_${FAMILY}_COMMON_INCLUDE
- NAMES cmsis_gcc.h
- PATHS "${CMSIS_${FAMILY}_PATH}/Include"
- NO_DEFAULT_PATH
- )
- list(APPEND CMSIS_INCLUDE_DIRS "${CMSIS_${FAMILY}_COMMON_INCLUDE}")
-
- find_path(CMSIS_${FAMILY}_INCLUDE
- NAMES stm32${FAMILY_L}xx.h
- PATHS "${CMSIS_${FAMILY}_PATH}/Device/ST/STM32${FAMILY}xx/Include"
- NO_DEFAULT_PATH
- )
- list(APPEND CMSIS_INCLUDE_DIRS "${CMSIS_${FAMILY}_INCLUDE}")
-
- find_file(CMSIS_${FAMILY}_SOURCE
- NAMES system_stm32${FAMILY_L}xx.c
- PATHS "${CMSIS_${FAMILY}_PATH}/Device/ST/STM32${FAMILY}xx/Source/Templates"
- NO_DEFAULT_PATH
- )
- list(APPEND CMSIS_SOURCES "${CMSIS_${FAMILY}_SOURCE}")
-
- if ((NOT CMSIS_${FAMILY}_COMMON_INCLUDE) OR
- (NOT CMSIS_${FAMILY}_INCLUDE) OR
- (NOT CMSIS_${FAMILY}_SOURCE))
- continue()
- endif()
- if(NOT (TARGET CMSIS::STM32::${FAMILY}))
- add_library(CMSIS::STM32::${FAMILY} INTERFACE IMPORTED)
- target_link_libraries(CMSIS::STM32::${FAMILY} INTERFACE STM32::${FAMILY})
- target_include_directories(CMSIS::STM32::${FAMILY} INTERFACE "${CMSIS_${FAMILY}_COMMON_INCLUDE}")
- target_include_directories(CMSIS::STM32::${FAMILY} INTERFACE "${CMSIS_${FAMILY}_INCLUDE}")
- target_sources(CMSIS::STM32::${FAMILY} INTERFACE "${CMSIS_${FAMILY}_SOURCE}")
- endif()
- set(DEVICES_FOUND TRUE)
- foreach(DEVICE ${DEVICES})
- stm32_get_chip_type(${FAMILY} ${DEVICE} TYPE)
- string(TOLOWER ${DEVICE} DEVICE_L)
- string(TOLOWER ${TYPE} TYPE_L)
-
- find_file(CMSIS_${FAMILY}_${TYPE}_STARTUP
- NAMES startup_stm32${TYPE_L}.s
- PATHS "${CMSIS_${FAMILY}_PATH}/Device/ST/STM32${FAMILY}xx/Source/Templates/gcc"
- NO_DEFAULT_PATH
- )
- list(APPEND CMSIS_SOURCES "${CMSIS_${FAMILY}_${TYPE}_STARTUP}")
- if(NOT CMSIS_${FAMILY}_${TYPE}_STARTUP)
- set(DEVICES_FOUND FALSE)
- break()
- endif()
-
- if(NOT (TARGET CMSIS::STM32::${TYPE}))
- add_library(CMSIS::STM32::${TYPE} INTERFACE IMPORTED)
- target_link_libraries(CMSIS::STM32::${TYPE} INTERFACE CMSIS::STM32::${FAMILY} STM32::${TYPE})
- target_sources(CMSIS::STM32::${TYPE} INTERFACE "${CMSIS_${FAMILY}_${TYPE}_STARTUP}")
- endif()
-
- add_library(CMSIS::STM32::${DEVICE} INTERFACE IMPORTED)
- target_link_libraries(CMSIS::STM32::${DEVICE} INTERFACE CMSIS::STM32::${TYPE})
- cmsis_generate_default_linker_script(${FAMILY} ${DEVICE})
- endforeach()
-
- if(CMSIS_${FAMILY}_COMMON_INCLUDE AND
- CMSIS_${FAMILY}_INCLUDE AND
- CMSIS_${FAMILY}_SOURCE AND
- DEVICES_FOUND)
- set(CMSIS_${COMP}_FOUND TRUE)
- else()
- set(CMSIS_${COMP}_FOUND FALSE)
- endif()
- endforeach()
- include(FindPackageHandleStandardArgs)
- find_package_handle_standard_args(CMSIS
- REQUIRED_VARS CMSIS_INCLUDE_DIRS CMSIS_SOURCES
- FOUND_VAR CMSIS_FOUND
- VERSION_VAR CMSIS_VERSION
- HANDLE_COMPONENTS
- )
|