STRING(TOLOWER ${STM32_FAMILY} STM32_FAMILY_LOWER) IF(STM32_FAMILY STREQUAL "F1") SET(CMSIS_STARTUP_PREFIX startup_stm32f10x_) SET(CMSIS_HEADERS system_stm32f10x.h core_cm3.h stm32f10x.h) SET(CMSIS_LINKER_SCRIPT_NAME stm32f1_flash.ld.in) ELSEIF(STM32_FAMILY STREQUAL "F4") SET(CMSIS_STARTUP_PREFIX startup_stm32f) SET(CMSIS_HEADERS system_stm32f4xx.h core_cm4.h stm32f4xx.h) SET(CMSIS_LINKER_SCRIPT_NAME stm32f4_flash.ld.in) ENDIF() IF((NOT STM32_CHIP_TYPE) AND (NOT STM32_CHIP)) UNSET(CMSIS_STARTUP_NAME) UNSET(CMSIS_STARTUP_SOURCE) FOREACH(CHIP_TYPE ${STM32_CHIP_TYPES}) STRING(TOLOWER ${CHIP_TYPE} CHIP_TYPE_LOWER) LIST(APPEND CMSIS_FIND_LIBS cmsis_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER}) ENDFOREACH() ELSE() IF(NOT STM32_CHIP_TYPE) STM32_GET_CHIP_TYPE(${STM32_CHIP} STM32_CHIP_TYPE) IF(NOT STM32_CHIP_TYPE) MESSAGE(FATAL_ERROR "Unknown chip: ${STM32_CHIP}. Try to use STM32_CHIP_TYPE directly.") ENDIF() MESSAGE(STATUS "${STM32_CHIP} is ${STM32_CHIP_TYPE} device") ENDIF() STRING(TOLOWER ${STM32_CHIP_TYPE} STM32_CHIP_TYPE_LOWER) SET(CMSIS_FIND_LIBS cmsis_${STM32_FAMILY_LOWER}_${STM32_CHIP_TYPE_LOWER}) SET(CMSIS_STARTUP_NAME ${CMSIS_STARTUP_PREFIX}${STM32_CHIP_TYPE_LOWER}.s) ENDIF() FIND_PATH(CMSIS_INCLUDE_DIR ${CMSIS_HEADERS} PATH_SUFFIXES include stm32${STM32_FAMILY_LOWER} ) FOREACH(CMSIS_LIB_NAME ${CMSIS_FIND_LIBS}) SET(CMSIS_LIBRARY CMSIS_LIBRARY-NOTFOUND) FIND_LIBRARY(CMSIS_LIBRARY NAMES ${CMSIS_LIB_NAME} PATH_SUFFIXES lib ) LIST(APPEND CMSIS_LIBRARIES ${CMSIS_LIBRARY}) ENDFOREACH() FIND_FILE(CMSIS_LINKER_SCRIPT ${CMSIS_LINKER_SCRIPT_NAME} PATHS ${CMAKE_FIND_ROOT_PATH}/share/cmsis/) INCLUDE(FindPackageHandleStandardArgs) IF(NOT STM32_CHIP_TYPE) FIND_PACKAGE_HANDLE_STANDARD_ARGS(CMSIS DEFAULT_MSG CMSIS_LIBRARIES CMSIS_INCLUDE_DIR CMSIS_LINKER_SCRIPT) ELSE() FIND_FILE(CMSIS_STARTUP_SOURCE ${CMSIS_STARTUP_NAME} PATHS ${CMAKE_FIND_ROOT_PATH}/share/cmsis/ ) FIND_PACKAGE_HANDLE_STANDARD_ARGS(CMSIS DEFAULT_MSG CMSIS_LIBRARIES CMSIS_INCLUDE_DIR CMSIS_STARTUP_SOURCE CMSIS_LINKER_SCRIPT) ENDIF() MACRO(STM32_KB_TO_BYTES KB BYTES) STRING(REGEX REPLACE "^(.+)[kK]$" "\\1" KILOBYTES ${KB}) IF(KILOBYTES) MATH(EXPR ${BYTES} "${KILOBYTES} * 1024") ELSE() SET(${BYTES} ${KB}) ENDIF() ENDMACRO() FUNCTION(STM32_SET_FLASH_PARAMS TARGET STM32_FLASH_SIZE STM32_RAM_SIZE STM32_STACK_ADDRESS STM32_MIN_STACK_SIZE STM32_MIN_HEAP_SIZE STM32_FLASH_ORIGIN STM32_RAM_ORIGIN) CONFIGURE_FILE(${CMSIS_LINKER_SCRIPT} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld) SET_TARGET_PROPERTIES(${TARGET} PROPERTIES LINK_FLAGS "-T${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld ${CMAKE_EXE_LINKER_FLAGS}") ENDFUNCTION() FUNCTION(STM32_SET_FLASH_PARAMS TARGET FLASH_SIZE RAM_SIZE) STM32_KB_TO_BYTES(${FLASH_SIZE} FLASH_SIZE) STM32_KB_TO_BYTES(${RAM_SIZE} RAM_SIZE) IF(NOT STM32_FLASH_ORIGIN) SET(STM32_FLASH_ORIGIN "0x08000000") ENDIF() IF(NOT STM32_RAM_ORIGIN) SET(STM32_RAM_ORIGIN "536870912") ENDIF() IF(NOT STM32_STACK_ADDRESS) MATH(EXPR STM32_STACK_ADDRESS "${STM32_RAM_ORIGIN} + ${RAM_SIZE}") ENDIF() SET(STM32_FLASH_SIZE ${FLASH_SIZE}) SET(STM32_RAM_SIZE ${RAM_SIZE}) IF(NOT STM32_MIN_STACK_SIZE) SET(STM32_MIN_STACK_SIZE "0x200") ENDIF() IF(NOT STM32_MIN_HEAP_SIZE) SET(STM32_MIN_HEAP_SIZE "0") ENDIF() CONFIGURE_FILE(${CMSIS_LINKER_SCRIPT} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld) SET_TARGET_PROPERTIES(${TARGET} PROPERTIES LINK_FLAGS "-T${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld ${CMAKE_EXE_LINKER_FLAGS}") ENDFUNCTION() FUNCTION(STM32_SET_TARGET_PROPERTIES TARGET) IF((NOT STM32_CHIP_TYPE) AND (NOT STM32_CHIP)) MESSAGE(WARNING "Neither STM32_CHIP_TYPE nor STM32_CHIP selected, you'll have to use STM32_SET_CHIP_DEFINITIONS directly") ELSE() STM32_SET_CHIP_DEFINITIONS(${TARGET} ${STM32_CHIP_TYPE}) IF(((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE)) AND (NOT STM32_CHIP)) MESSAGE(FATAL_ERROR "Cannot get chip parameters. Please specify either STM32_CHIP or STM32_FLASH_SIZE/STM32_RAM_SIZE") ENDIF() IF((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE)) STM32_GET_CHIP_PARAMETERS(${STM32_CHIP} STM32_FLASH_SIZE STM32_RAM_SIZE) IF((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE)) MESSAGE(FATAL_ERROR "Unknown chip: ${STM32_CHIP}. Try to use STM32_FLASH_SIZE/STM32_RAM_SIZE directly.") ENDIF() MESSAGE(STATUS "${STM32_CHIP} has ${STM32_FLASH_SIZE}iB of flash memory and ${STM32_RAM_SIZE}iB of RAM") ENDIF() ENDIF() STM32_SET_FLASH_PARAMS(${TARGET} ${STM32_FLASH_SIZE} ${STM32_RAM_SIZE}) ENDFUNCTION()